diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 955fe7a72414af..c9a97dd80e4aa9 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -23,6 +23,7 @@ disabled: - x-pack/test/upgrade/config.ts - test/functional/config.edge.js - x-pack/test/functional/config.edge.js + - x-pack/test/cloud_security_posture_functional/config.cloud.ts # Cypress configs, for now these are still run manually - x-pack/test/fleet_cypress/cli_config.ts diff --git a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml index 24fc59fdbe26a7..c7ac27e032bd8c 100644 --- a/.buildkite/pipelines/on_merge_unsupported_ftrs.yml +++ b/.buildkite/pipelines/on_merge_unsupported_ftrs.yml @@ -80,39 +80,3 @@ steps: limit: 3 - exit_status: '*' limit: 1 - - - command: .buildkite/scripts/steps/functional/defend_workflows.sh - label: 'Defend Workflows Cypress Tests' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - enableNestedVirtualization: true - localSsdInterface: nvme - localSsds: 1 - machineType: n2-standard-4 - depends_on: build - timeout_in_minutes: 60 - parallelism: 20 - retry: - automatic: - - exit_status: '-1' - limit: 1 - - - command: .buildkite/scripts/steps/functional/defend_workflows_serverless.sh - label: 'Defend Workflows Cypress Tests on Serverless' - agents: - image: family/kibana-ubuntu-2004 - imageProject: elastic-images-prod - provider: gcp - enableNestedVirtualization: true - localSsdInterface: nvme - localSsds: 1 - machineType: n2-standard-4 - depends_on: build - timeout_in_minutes: 60 - parallelism: 14 - retry: - automatic: - - exit_status: '-1' - limit: 1 diff --git a/.buildkite/scripts/serverless/emergency_release/trigger_container_build.ts b/.buildkite/scripts/serverless/emergency_release/trigger_container_build.ts index daf7c904ffd460..c45fb75b5823f6 100644 --- a/.buildkite/scripts/serverless/emergency_release/trigger_container_build.ts +++ b/.buildkite/scripts/serverless/emergency_release/trigger_container_build.ts @@ -16,16 +16,16 @@ async function main() { const commitSha = process.env.OVERRIDE_COMMIT || process.env.BUILDKITE_COMMIT; if (!isCurrentHeadInMain(commitSha!)) { - if (!DRY_RUN) { + if (DRY_RUN) { console.log( `DRY_RUN: Commit ${commitSha} isn't in main, triggering container build :green_heart:` ); } else { console.log(`Commit ${commitSha} isn't in main, triggering container build :green_heart:`); - uploadTriggerBuildStep(); + uploadTriggerBuildStep(commitSha!); } } else { - if (!DRY_RUN) { + if (DRY_RUN) { console.log(`DRY_RUN: Commit ${commitSha} is in main, no build necessary :yellow_heart:`); } else { console.log(`Commit ${commitSha} is in main, no trigger necessary :yellow_heart:`); @@ -41,12 +41,14 @@ function isCurrentHeadInMain(commitSha: string) { return parseInt(containmentTest, 10) >= 1; } -function uploadTriggerBuildStep() { +function uploadTriggerBuildStep(commitSha: string) { const triggerStep: BuildkiteTriggerStep = { label: ':point_right: Trigger emergency commit container build', trigger: 'kibana-artifacts-container-image', build: { message: `Triggered by '${process.env.BUILDKITE_PIPELINE_NAME || 'unknown'}'`, + branch: process.env?.BUILDKITE_BRANCH || 'main', + commit: commitSha, env: {}, }, }; diff --git a/.buildkite/scripts/steps/artifacts/docker_image.sh b/.buildkite/scripts/steps/artifacts/docker_image.sh index 308b391118b77c..551910432c413e 100755 --- a/.buildkite/scripts/steps/artifacts/docker_image.sh +++ b/.buildkite/scripts/steps/artifacts/docker_image.sh @@ -27,15 +27,10 @@ echo "--- Build Kibana" node scripts/build \ --debug \ --release \ + --serverless \ --docker-cross-compile \ - --docker-images \ --docker-namespace="kibana-ci" \ - --docker-tag="$KIBANA_IMAGE_TAG" \ - --skip-docker-ubuntu \ - --skip-docker-chainguard \ - --skip-docker-ubi \ - --skip-docker-fips \ - --skip-docker-cloud + --docker-tag="$KIBANA_IMAGE_TAG" echo "--- Tag images" docker rmi "$KIBANA_IMAGE" @@ -99,8 +94,8 @@ ts-node "$(git rev-parse --show-toplevel)/.buildkite/scripts/steps/artifacts/val "$CDN_ASSETS_FOLDER" echo "--- Upload archives" -buildkite-agent artifact upload "kibana-$BASE_VERSION-linux-x86_64.tar.gz" -buildkite-agent artifact upload "kibana-$BASE_VERSION-linux-aarch64.tar.gz" +buildkite-agent artifact upload "kibana-serverless-$BASE_VERSION-linux-x86_64.tar.gz" +buildkite-agent artifact upload "kibana-serverless-$BASE_VERSION-linux-aarch64.tar.gz" buildkite-agent artifact upload "kibana-serverless-$BASE_VERSION-docker-image.tar.gz" buildkite-agent artifact upload "kibana-serverless-$BASE_VERSION-docker-image-aarch64.tar.gz" buildkite-agent artifact upload "kibana-serverless-$BASE_VERSION-docker-build-context.tar.gz" diff --git a/.buildkite/scripts/steps/cloud/build_and_deploy.sh b/.buildkite/scripts/steps/cloud/build_and_deploy.sh index 8c5e0a0d2c6351..1287d0f0328c3d 100755 --- a/.buildkite/scripts/steps/cloud/build_and_deploy.sh +++ b/.buildkite/scripts/steps/cloud/build_and_deploy.sh @@ -82,16 +82,7 @@ if [ -z "${CLOUD_DEPLOYMENT_ID}" ] || [ "${CLOUD_DEPLOYMENT_ID}" = 'null' ]; the echo "Writing to vault..." - # TODO: remove after https://github.com/elastic/kibana-operations/issues/15 is done - if [[ "$IS_LEGACY_VAULT_ADDR" == "true" ]]; then - VAULT_ROLE_ID="$(get_vault_role_id)" - VAULT_SECRET_ID="$(get_vault_secret_id)" - VAULT_TOKEN=$(retry 5 30 vault write -field=token auth/approle/login role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID") - retry 5 30 vault login -no-print "$VAULT_TOKEN" - vault_set "cloud-deploy/$CLOUD_DEPLOYMENT_NAME" username="$CLOUD_DEPLOYMENT_USERNAME" password="$CLOUD_DEPLOYMENT_PASSWORD" - else - vault_kv_set "cloud-deploy/$CLOUD_DEPLOYMENT_NAME" username="$CLOUD_DEPLOYMENT_USERNAME" password="$CLOUD_DEPLOYMENT_PASSWORD" - fi + vault_kv_set "cloud-deploy/$CLOUD_DEPLOYMENT_NAME" username="$CLOUD_DEPLOYMENT_USERNAME" password="$CLOUD_DEPLOYMENT_PASSWORD" echo "Enabling Stack Monitoring..." jq ' @@ -123,28 +114,24 @@ else ecctl deployment update "$CLOUD_DEPLOYMENT_ID" --track --output json --file /tmp/deploy.json > "$ECCTL_LOGS" fi -# TODO: remove after https://github.com/elastic/kibana-operations/issues/15 is done -if [[ "$IS_LEGACY_VAULT_ADDR" == "true" ]]; then - VAULT_READ_COMMAND="vault read $VAULT_PATH_PREFIX/cloud-deploy/$CLOUD_DEPLOYMENT_NAME" -else - VAULT_READ_COMMAND="vault kv get $VAULT_KV_PREFIX/cloud-deploy/$CLOUD_DEPLOYMENT_NAME" -fi CLOUD_DEPLOYMENT_KIBANA_URL=$(ecctl deployment show "$CLOUD_DEPLOYMENT_ID" | jq -r '.resources.kibana[0].info.metadata.aliased_url') CLOUD_DEPLOYMENT_ELASTICSEARCH_URL=$(ecctl deployment show "$CLOUD_DEPLOYMENT_ID" | jq -r '.resources.elasticsearch[0].info.metadata.aliased_url') cat << EOF | buildkite-agent annotate --style "info" --context cloud - ### Cloud Deployment +### Cloud Deployment + +Kibana: $CLOUD_DEPLOYMENT_KIBANA_URL - Kibana: $CLOUD_DEPLOYMENT_KIBANA_URL +Elasticsearch: $CLOUD_DEPLOYMENT_ELASTICSEARCH_URL - Elasticsearch: $CLOUD_DEPLOYMENT_ELASTICSEARCH_URL +Credentials: \`vault kv get $VAULT_KV_PREFIX/cloud-deploy/$CLOUD_DEPLOYMENT_NAME\` - Credentials: \`$VAULT_READ_COMMAND\` +(Stored in the production vault: VAULT_ADDR=https://vault-ci-prod.elastic.dev, more info: https://docs.elastic.dev/ci/using-secrets) - Kibana image: \`$KIBANA_CLOUD_IMAGE\` +Kibana image: \`$KIBANA_CLOUD_IMAGE\` - Elasticsearch image: \`$ELASTICSEARCH_CLOUD_IMAGE\` +Elasticsearch image: \`$ELASTICSEARCH_CLOUD_IMAGE\` EOF buildkite-agent meta-data set pr_comment:deploy_cloud:head "* [Cloud Deployment](${CLOUD_DEPLOYMENT_KIBANA_URL})" diff --git a/.buildkite/scripts/steps/serverless/deploy.sh b/.buildkite/scripts/steps/serverless/deploy.sh index 5accef8f537972..e67795fcbf65df 100644 --- a/.buildkite/scripts/steps/serverless/deploy.sh +++ b/.buildkite/scripts/steps/serverless/deploy.sh @@ -88,16 +88,7 @@ deploy() { echo "Write to vault..." - # TODO: remove after https://github.com/elastic/kibana-operations/issues/15 is done - if [[ "$IS_LEGACY_VAULT_ADDR" == "true" ]]; then - VAULT_ROLE_ID="$(get_vault_role_id)" - VAULT_SECRET_ID="$(get_vault_secret_id)" - VAULT_TOKEN=$(retry 5 30 vault write -field=token auth/approle/login role_id="$VAULT_ROLE_ID" secret_id="$VAULT_SECRET_ID") - retry 5 30 vault login -no-print "$VAULT_TOKEN" - vault_set "cloud-deploy/$VAULT_KEY_NAME" username="$PROJECT_USERNAME" password="$PROJECT_PASSWORD" id="$PROJECT_ID" - else - vault_kv_set "cloud-deploy/$VAULT_KEY_NAME" username="$PROJECT_USERNAME" password="$PROJECT_PASSWORD" id="$PROJECT_ID" - fi + vault_kv_set "cloud-deploy/$VAULT_KEY_NAME" username="$PROJECT_USERNAME" password="$PROJECT_PASSWORD" id="$PROJECT_ID" else echo "Updating project..." @@ -118,13 +109,6 @@ deploy() { PROJECT_KIBANA_LOGIN_URL="${PROJECT_KIBANA_URL}/login" PROJECT_ELASTICSEARCH_URL=$(jq -r '.endpoints.elasticsearch' $PROJECT_INFO_LOGS) - # TODO: remove after https://github.com/elastic/kibana-operations/issues/15 is done - if [[ "$IS_LEGACY_VAULT_ADDR" == "true" ]]; then - VAULT_READ_COMMAND="vault read $VAULT_PATH_PREFIX/cloud-deploy/$VAULT_KEY_NAME" - else - VAULT_READ_COMMAND="vault kv get $VAULT_KV_PREFIX/cloud-deploy/$VAULT_KEY_NAME" - fi - cat << EOF | buildkite-agent annotate --style "info" --context "project-$PROJECT_TYPE" ### $PROJECT_TYPE_LABEL Deployment @@ -132,7 +116,9 @@ Kibana: $PROJECT_KIBANA_LOGIN_URL Elasticsearch: $PROJECT_ELASTICSEARCH_URL -Credentials: \`$VAULT_READ_COMMAND\` +Credentials: \`vault kv get $VAULT_KV_PREFIX/cloud-deploy/$VAULT_KEY_NAME\` + +(Stored in the production vault: VAULT_ADDR=https://vault-ci-prod.elastic.dev, more info: https://docs.elastic.dev/ci/using-secrets) Kibana image: \`$KIBANA_IMAGE\` EOF diff --git a/.eslintrc.js b/.eslintrc.js index d7956c15906882..4e6c367970c02b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -908,10 +908,6 @@ module.exports = { }, ], 'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks - 'react-hooks/exhaustive-deps': [ - 'error', - { additionalHooks: '^(useFetcher|useProgressiveFetcher|useBreadcrumb)$' }, - ], }, }, { @@ -931,6 +927,18 @@ module.exports = { ], }, }, + { + files: ['x-pack/plugins/observability_solution/**/*.{ts,tsx}'], + rules: { + 'react-hooks/exhaustive-deps': [ + 'error', + { + additionalHooks: + '^(useAbortableAsync|useMemoWithAbortSignal|useFetcher|useProgressiveFetcher|useBreadcrumb|useAsync|useTimeRangeAsync|useAutoAbortedHttpClient)$', + }, + ], + }, + }, { files: [ 'x-pack/plugins/aiops/**/*.tsx', @@ -964,17 +972,6 @@ module.exports = { ], }, }, - // Profiling - { - files: ['x-pack/plugins/observability_solution/profiling/**/*.{js,mjs,ts,tsx}'], - rules: { - 'react-hooks/rules-of-hooks': 'error', // Checks rules of Hooks - 'react-hooks/exhaustive-deps': [ - 'error', - { additionalHooks: '^(useAsync|useTimeRangeAsync|useAutoAbortedHttpClient)$' }, - ], - }, - }, { // disable imports from legacy uptime plugin files: [ diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9d65857bb5d90b..dc4a36124cad21 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -411,6 +411,7 @@ examples/eso_model_version_example @elastic/kibana-security x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin @elastic/kibana-security packages/kbn-esql-ast @elastic/kibana-esql examples/esql_ast_inspector @elastic/kibana-esql +src/plugins/esql_datagrid @elastic/kibana-esql packages/kbn-esql-utils @elastic/kibana-esql packages/kbn-esql-validation-autocomplete @elastic/kibana-esql examples/esql_validation_example @elastic/kibana-esql @@ -505,6 +506,7 @@ src/plugins/inspector @elastic/kibana-presentation src/plugins/interactive_setup @elastic/kibana-security test/interactive_setup_api_integration/plugins/test_endpoints @elastic/kibana-security packages/kbn-interpreter @elastic/kibana-visualizations +x-pack/plugins/observability_solution/investigate @elastic/obs-ai-assistant packages/kbn-io-ts-utils @elastic/obs-knowledge-team packages/kbn-ipynb @elastic/search-kibana packages/kbn-jest-serializers @elastic/kibana-operations @@ -891,6 +893,7 @@ examples/unified_field_list_examples @elastic/kibana-data-discovery src/plugins/unified_histogram @elastic/kibana-data-discovery src/plugins/unified_search @elastic/kibana-visualizations packages/kbn-unsaved-changes-badge @elastic/kibana-data-discovery +packages/kbn-unsaved-changes-prompt @elastic/kibana-management x-pack/plugins/upgrade_assistant @elastic/kibana-management x-pack/plugins/observability_solution/uptime @elastic/obs-ux-infra_services-team x-pack/plugins/drilldowns/url_drilldown @elastic/appex-sharedux @@ -1248,6 +1251,10 @@ x-pack/test/observability_ai_assistant_functional @elastic/obs-ai-assistant # Core /config/ @elastic/kibana-core +/config/serverless.yml @elastic/kibana-core @elastic/kibana-security +/config/serverless.es.yml @elastic/kibana-core @elastic/kibana-security +/config/serverless.oblt.yml @elastic/kibana-core @elastic/kibana-security +/config/serverless.security.yml @elastic/kibana-core @elastic/kibana-security /typings/ @elastic/kibana-core /test/analytics @elastic/kibana-core /packages/kbn-test/src/jest/setup/mocks.kbn_i18n_react.js @elastic/kibana-core @@ -1306,6 +1313,9 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/test/spaces_api_integration/ @elastic/kibana-security /x-pack/test/saved_object_api_integration/ @elastic/kibana-security /x-pack/test_serverless/**/test_suites/common/platform_security/ @elastic/kibana-security +/x-pack/test_serverless/**/test_suites/search/platform_security/ @elastic/kibana-security +/x-pack/test_serverless/**/test_suites/security/platform_security/ @elastic/kibana-security +/x-pack/test_serverless/**/test_suites/observability/platform_security/ @elastic/kibana-security /packages/core/http/core-http-server-internal/src/cdn_config/ @elastic/kibana-security @elastic/kibana-core #CC# /x-pack/plugins/security/ @elastic/kibana-security @@ -1489,6 +1499,11 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/stack_connectors/server/connector_types/bedrock @elastic/security-generative-ai /x-pack/plugins/stack_connectors/common/bedrock @elastic/security-generative-ai +# Gemini +/x-pack/plugins/stack_connectors/public/connector_types/gemini @elastic/security-generative-ai +/x-pack/plugins/stack_connectors/server/connector_types/gemini @elastic/security-generative-ai +/x-pack/plugins/stack_connectors/common/gemini @elastic/security-generative-ai + ## Defend Workflows owner connectors /x-pack/plugins/stack_connectors/public/connector_types/sentinelone @elastic/security-defend-workflows /x-pack/plugins/stack_connectors/server/connector_types/sentinelone @elastic/security-defend-workflows diff --git a/.i18nrc.json b/.i18nrc.json index 7854a7855351cb..0053dc5d2ad51f 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -116,6 +116,7 @@ "coloring": "packages/kbn-coloring/src", "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", + "esqlDataGrid": "src/plugins/esql_datagrid", "statusPage": "src/legacy/core_plugins/status_page", "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], "timelion": ["src/plugins/vis_types/timelion"], @@ -147,6 +148,7 @@ "unifiedHistogram": "src/plugins/unified_histogram", "unifiedDataTable": "packages/kbn-unified-data-table", "unsavedChangesBadge": "packages/kbn-unsaved-changes-badge", + "unsavedChangesPrompt": "packages/kbn-unsaved-changes-prompt", "managedContentBadge": "packages/kbn-managed-content-badge" }, "translations": [] diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index c1f3d4c99134cc..9943a5ac909196 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2024-06-05 +date: 2024-06-09 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 003ab0a6453bf7..d55ae963162c4d 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 2993e35c0a7898..de10ba4af625e5 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-06-05 +date: 2024-06-09 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 8e8cddfe04935f..9075df5e8ce8af 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2024-06-05 +date: 2024-06-09 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 fa9bd039a12a6b..f6b4e99f2b5ec1 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2024-06-05 +date: 2024-06-09 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 d4a59b3abe1de9..d098501122ab04 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2024-06-05 +date: 2024-06-09 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 79827c128f768e..dc57cb53eebed3 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-06-05 +date: 2024-06-09 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 1504ac4f9d59a0..345243d484bc28 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/assets_data_access.mdx b/api_docs/assets_data_access.mdx index 795c4e6acc12be..1cedb1e4aab92f 100644 --- a/api_docs/assets_data_access.mdx +++ b/api_docs/assets_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetsDataAccess title: "assetsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the assetsDataAccess plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetsDataAccess'] --- import assetsDataAccessObj from './assets_data_access.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 957beda2a57835..6616530eb00760 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2024-06-05 +date: 2024-06-09 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 95898336db303b..10ce7f737c4d63 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2024-06-05 +date: 2024-06-09 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 c1d46f6c174a3a..97db81ee2bbcb9 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2024-06-05 +date: 2024-06-09 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 5834da01597e43..6416662de34801 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2024-06-05 +date: 2024-06-09 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 0aee0d5e7ed687..eab6f8b27f18ac 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.devdocs.json b/api_docs/cloud.devdocs.json index 716a92b728c29d..04c3ac0d00123c 100644 --- a/api_docs/cloud.devdocs.json +++ b/api_docs/cloud.devdocs.json @@ -197,6 +197,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "cloud", + "id": "def-public.CloudConfigType.onboarding", + "type": "Object", + "tags": [], + "label": "onboarding", + "description": [], + "signature": [ + "{ default_solution?: string | undefined; } | undefined" + ], + "path": "x-pack/plugins/cloud/public/plugin.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "cloud", "id": "def-public.CloudConfigType.serverless", @@ -797,6 +811,30 @@ ], "returnComment": [] }, + { + "parentPluginId": "cloud", + "id": "def-public.CloudSetup.onboarding", + "type": "Object", + "tags": [], + "label": "onboarding", + "description": [ + "\nOnboarding configuration" + ], + "signature": [ + "{ defaultSolution?: ", + { + "pluginId": "cloud", + "scope": "common", + "docId": "kibCloudPluginApi", + "section": "def-common.OnBoardingDefaultSolution", + "text": "OnBoardingDefaultSolution" + }, + " | undefined; }" + ], + "path": "x-pack/plugins/cloud/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "cloud", "id": "def-public.CloudSetup.isServerlessEnabled", @@ -1058,6 +1096,30 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "cloud", + "id": "def-server.CloudSetup.onboarding", + "type": "Object", + "tags": [], + "label": "onboarding", + "description": [ + "\nOnboarding configuration." + ], + "signature": [ + "{ defaultSolution?: ", + { + "pluginId": "cloud", + "scope": "common", + "docId": "kibCloudPluginApi", + "section": "def-common.OnBoardingDefaultSolution", + "text": "OnBoardingDefaultSolution" + }, + " | undefined; }" + ], + "path": "x-pack/plugins/cloud/server/plugin.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "cloud", "id": "def-server.CloudSetup.isServerlessEnabled", @@ -1161,7 +1223,23 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "cloud", + "id": "def-common.OnBoardingDefaultSolution", + "type": "Type", + "tags": [], + "label": "OnBoardingDefaultSolution", + "description": [], + "signature": [ + "\"security\" | \"es\" | \"oblt\"" + ], + "path": "x-pack/plugins/cloud/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [] } } \ No newline at end of file diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index 018cb0dd7b2f48..d0f6e9b5ddb1b5 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 74 | 0 | 17 | 0 | +| 78 | 0 | 19 | 0 | ## Client @@ -39,3 +39,8 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core ### Start +## Common + +### Consts, variables and types + + diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index d9b6b5a0a8ece4..269dd82ce00bb7 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2024-06-05 +date: 2024-06-09 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 1e4e2b20487dcc..5000568c30f740 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2024-06-05 +date: 2024-06-09 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 73572f24cb1198..20e6537e3388a9 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2024-06-05 +date: 2024-06-09 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 0ea7308d29106a..decdaf04be750e 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2024-06-05 +date: 2024-06-09 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 6dfbc40675e49c..df65584132e0f7 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2024-06-05 +date: 2024-06-09 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 bf48f5d3ce9d79..d44bb65328d33e 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index 999f42ac6d3c01..06a783deb4ac92 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -196,7 +196,13 @@ " | undefined) => void; setControlStyle: (payload: ", "ControlStyle", ") => void; setChainingSystem: (payload: ", - "ControlGroupChainingSystem", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlGroupChainingSystem", + "text": "ControlGroupChainingSystem" + }, ") => void; setDefaultControlWidth: (payload: ", { "pluginId": "controls", @@ -1432,6 +1438,38 @@ ], "returnComment": [] }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.removePanel", + "type": "Function", + "tags": [], + "label": "removePanel", + "description": [], + "signature": [ + "(id: string) => void" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.removePanel.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.onRemoveEmbeddable", @@ -2111,10 +2149,13 @@ "text": "ControlOutput" }, ", any> implements ", - "IClearableControl", - "<", - "ControlInput", - ">" + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.CanClearSelections", + "text": "CanClearSelections" + } ], "path": "src/plugins/controls/public/options_list/embeddable/options_list_embeddable.tsx", "deprecated": false, @@ -2913,7 +2954,7 @@ { "parentPluginId": "controls", "id": "def-public.OptionsListEmbeddableFactory.presaveTransformFunction.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "embeddable", "description": [], @@ -3296,10 +3337,13 @@ "text": "ControlOutput" }, ", any> implements ", - "IClearableControl", - "<", - "ControlInput", - ">" + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.CanClearSelections", + "text": "CanClearSelections" + } ], "path": "src/plugins/controls/public/range_slider/embeddable/range_slider_embeddable.tsx", "deprecated": false, @@ -4206,7 +4250,7 @@ { "parentPluginId": "controls", "id": "def-public.RangeSliderEmbeddableFactory.presaveTransformFunction.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "embeddable", "description": [], @@ -4574,6 +4618,36 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-public.CanClearSelections", + "type": "Interface", + "tags": [], + "label": "CanClearSelections", + "description": [], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.CanClearSelections.clearSelections", + "type": "Function", + "tags": [], + "label": "clearSelections", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-public.ControlEditorProps", @@ -4687,6 +4761,104 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlEmbeddable", + "type": "Interface", + "tags": [], + "label": "ControlEmbeddable", + "description": [], + "signature": [ + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlEmbeddable", + "text": "ControlEmbeddable" + }, + " extends ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.IEmbeddable", + "text": "IEmbeddable" + }, + "" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.ControlEmbeddable.isChained", + "type": "Function", + "tags": [], + "label": "isChained", + "description": [], + "signature": [ + "(() => boolean) | undefined" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlEmbeddable.renderPrepend", + "type": "Function", + "tags": [], + "label": "renderPrepend", + "description": [], + "signature": [ + "(() => React.ReactNode) | undefined" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlEmbeddable.selectionsToFilters", + "type": "Function", + "tags": [], + "label": "selectionsToFilters", + "description": [], + "signature": [ + "((input: Partial) => Promise<", + "ControlGroupFilterOutput", + ">) | undefined" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "controls", + "id": "def-public.ControlEmbeddable.selectionsToFilters.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + "Partial" + ], + "path": "src/plugins/controls/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupInput", @@ -5245,7 +5417,7 @@ { "parentPluginId": "controls", "id": "def-public.IEditableControlFactory.presaveTransformFunction.$2", - "type": "CompoundType", + "type": "Object", "tags": [], "label": "embeddable", "description": [], @@ -5787,24 +5959,15 @@ }, { "parentPluginId": "controls", - "id": "def-public.ControlEmbeddable", - "type": "Type", + "id": "def-public.CONTROL_WIDTH_OPTIONS", + "type": "Array", "tags": [], - "label": "ControlEmbeddable", + "label": "CONTROL_WIDTH_OPTIONS", "description": [], "signature": [ - { - "pluginId": "embeddable", - "scope": "public", - "docId": "kibEmbeddablePluginApi", - "section": "def-public.IEmbeddable", - "text": "IEmbeddable" - }, - " & { isChained?: (() => boolean) | undefined; renderPrepend?: (() => React.ReactNode) | undefined; selectionsToFilters?: ((input: Partial) => Promise<", - "ControlGroupFilterOutput", - ">) | undefined; }" + "{ id: string; 'data-test-subj': string; label: string; }[]" ], - "path": "src/plugins/controls/public/types.ts", + "path": "src/plugins/controls/public/control_group/editor/editor_constants.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -6624,7 +6787,13 @@ "; ignoreParentSettings?: ", "ParentIgnoreSettings", " | undefined; chainingSystem: ", - "ControlGroupChainingSystem", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlGroupChainingSystem", + "text": "ControlGroupChainingSystem" + }, "; showApplySelections?: boolean | undefined; } | undefined" ], "path": "src/plugins/controls/common/control_group/control_group_persistence.ts", @@ -7551,6 +7720,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-common.ControlGroupChainingSystem", + "type": "Type", + "tags": [], + "label": "ControlGroupChainingSystem", + "description": [], + "signature": [ + "\"HIERARCHICAL\" | \"NONE\"" + ], + "path": "src/plugins/controls/common/control_group/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-common.ControlInputTransform", @@ -7667,6 +7851,18 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "controls", + "id": "def-common.DEFAULT_CONTROL_GROW", + "type": "boolean", + "tags": [], + "label": "DEFAULT_CONTROL_GROW", + "description": [], + "path": "src/plugins/controls/common/control_group/control_group_constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "controls", "id": "def-common.DEFAULT_CONTROL_STYLE", @@ -7733,7 +7929,13 @@ "text": "ControlsPanels" }, "; chainingSystem: ", - "ControlGroupChainingSystem", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlGroupChainingSystem", + "text": "ControlGroupChainingSystem" + }, "; showApplySelections?: boolean | undefined; }" ], "path": "src/plugins/controls/common/control_group/types.ts", diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index c00477f026e188..383f0b2fcc8c21 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 340 | 0 | 332 | 20 | +| 351 | 0 | 343 | 18 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index fc4edd705a70a9..889805453eb70f 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index 12884642b3c5d2..d22dda4cd015bf 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -212,23 +212,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -306,23 +298,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -858,23 +842,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" - }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -968,7 +944,13 @@ "text": "DashboardContainerInput" }, ", \"executionContext\" | \"panels\" | \"controlGroupInput\" | \"isEmbeddedExternally\">> & { dashboardId?: string | undefined; useHash?: boolean | undefined; preserveSavedFilters?: boolean | undefined; searchSessionId?: string | undefined; panels?: (", - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, " & ", { "pluginId": "@kbn/utility-types", @@ -1226,7 +1208,13 @@ "text": "DashboardPanelMap" }, ", removeLegacyVersion?: boolean | undefined) => ", - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, "[]" ], "path": "src/plugins/dashboard/common/lib/dashboard_panel_converters.ts", @@ -1298,7 +1286,13 @@ "text": "SavedObjectEmbeddableInput" }, ">, removeLegacyVersion: boolean | undefined) => ", - "SavedDashboardPanel" + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + } ], "path": "src/plugins/dashboard/common/lib/dashboard_panel_converters.ts", "deprecated": false, @@ -1362,7 +1356,13 @@ "description": [], "signature": [ "(savedDashboardPanel: ", - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, ") => ", { "pluginId": "dashboard", @@ -1385,7 +1385,13 @@ "label": "savedDashboardPanel", "description": [], "signature": [ - "SavedDashboardPanel" + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + } ], "path": "src/plugins/dashboard/common/lib/dashboard_panel_converters.ts", "deprecated": false, @@ -1405,7 +1411,13 @@ "description": [], "signature": [ "(panels?: ", - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, "[] | undefined) => ", { "pluginId": "dashboard", @@ -1427,7 +1439,13 @@ "label": "panels", "description": [], "signature": [ - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, "[] | undefined" ], "path": "src/plugins/dashboard/common/lib/dashboard_panel_converters.ts", @@ -2351,6 +2369,138 @@ } ], "initialIsOpen": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel", + "type": "Interface", + "tags": [], + "label": "SavedDashboardPanel", + "description": [ + "\nA saved dashboard panel parsed directly from the Dashboard Attributes panels JSON" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.embeddableConfig", + "type": "Object", + "tags": [], + "label": "embeddableConfig", + "description": [], + "signature": [ + "{ [key: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.Serializable", + "text": "Serializable" + }, + "; }" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.panelRefName", + "type": "string", + "tags": [], + "label": "panelRefName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.gridData", + "type": "Object", + "tags": [], + "label": "gridData", + "description": [], + "signature": [ + "GridData" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.panelIndex", + "type": "string", + "tags": [], + "label": "panelIndex", + "description": [], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dashboard", + "id": "def-common.SavedDashboardPanel.version", + "type": "string", + "tags": [], + "label": "version", + "description": [ + "\nThis version key was used to store Kibana version information from versions 7.3.0 -> 8.11.0.\nAs of version 8.11.0, the versioning information is now per-embeddable-type and is stored on the\nembeddable's input. (embeddableConfig in this type)." + ], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/dashboard/common/content_management/v1/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false } ], "enums": [], @@ -2466,7 +2616,13 @@ "text": "TimeRange" }, " | undefined; timeslice?: [number, number] | undefined; isEmbeddedExternally?: boolean | undefined; timeRestore?: boolean | undefined; useMargins?: boolean | undefined; panels?: ", - "SavedDashboardPanel", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.SavedDashboardPanel", + "text": "SavedDashboardPanel" + }, "[] | undefined; }" ], "path": "src/plugins/dashboard/common/types.ts", diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 639cd782575191..a7f24cb3d85076 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 120 | 0 | 116 | 13 | +| 129 | 0 | 123 | 12 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 693696334d15a9..1c1cb32c7416c8 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2024-06-05 +date: 2024-06-09 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 918ca014877ddb..b2a57487254e68 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 31 | 2585 | 24 | +| 3199 | 31 | 2590 | 24 | ## Client diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index 9d38bf46ade7a1..868d9821ef3774 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 1bf03818e17d00..36363475ce294c 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 31 | 2585 | 24 | +| 3199 | 31 | 2590 | 24 | ## Client diff --git a/api_docs/data_search.devdocs.json b/api_docs/data_search.devdocs.json index a9e4a675758c1c..3e3047831b93f7 100644 --- a/api_docs/data_search.devdocs.json +++ b/api_docs/data_search.devdocs.json @@ -16864,6 +16864,134 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "data", + "id": "def-common.queryToFields", + "type": "Function", + "tags": [], + "label": "queryToFields", + "description": [], + "signature": [ + "({\n dataView,\n sort,\n request,\n}: { dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewLazy", + "text": "DataViewLazy" + }, + "; sort?: ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySortValue", + "text": "EsQuerySortValue" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySortValue", + "text": "EsQuerySortValue" + }, + "[] | undefined; request: ", + "SearchRequest", + "; }) => Promise>" + ], + "path": "src/plugins/data/common/search/search_source/query_to_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.queryToFields.$1", + "type": "Object", + "tags": [], + "label": "{\n dataView,\n sort,\n request,\n}", + "description": [], + "path": "src/plugins/data/common/search/search_source/query_to_fields.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "data", + "id": "def-common.queryToFields.$1.dataView", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataViewLazy", + "text": "DataViewLazy" + } + ], + "path": "src/plugins/data/common/search/search_source/query_to_fields.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.queryToFields.$1.sort", + "type": "CompoundType", + "tags": [], + "label": "sort", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySortValue", + "text": "EsQuerySortValue" + }, + " | ", + { + "pluginId": "data", + "scope": "common", + "docId": "kibDataSearchPluginApi", + "section": "def-common.EsQuerySortValue", + "text": "EsQuerySortValue" + }, + "[] | undefined" + ], + "path": "src/plugins/data/common/search/search_source/query_to_fields.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.queryToFields.$1.request", + "type": "Object", + "tags": [], + "label": "request", + "description": [], + "signature": [ + "{ [x: string]: any; }" + ], + "path": "src/plugins/data/common/search/search_source/query_to_fields.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "data", "id": "def-common.splitStringInterval", diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 3a31da74eba395..cff3b15809f3d8 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3194 | 31 | 2585 | 24 | +| 3199 | 31 | 2590 | 24 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 9eb7339dd8dc07..e23184e4a43198 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2024-06-05 +date: 2024-06-09 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 a11489a7fe7253..3717f7b039d1d9 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2024-06-05 +date: 2024-06-09 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 2eeec04c6e9981..f0fcbfb118e045 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2024-06-05 +date: 2024-06-09 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 59dd3f2b905f18..99de68695fadee 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2024-06-05 +date: 2024-06-09 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 d9bd128006a0ea..dff783792e3c10 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2024-06-05 +date: 2024-06-09 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 fd761717cd3eb7..a9b109ec03c8a8 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-06-05 +date: 2024-06-09 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 b51a8ebd93b912..842d96f673ae97 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -31,11 +31,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | triggersActionsUi | - | | | @kbn/core, visualizations, triggersActionsUi | - | | | ruleRegistry, securitySolution, synthetics, slo | - | +| | security, actions, alerting, files, ruleRegistry, cases, fleet, securitySolution | - | | | alerting, discover, securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-api-server-internal, @kbn/core-saved-objects-import-export-server-internal, @kbn/core-saved-objects-server-internal, fleet, graph, lists, osquery, securitySolution, alerting | - | | | alerting, discover, securitySolution | - | | | securitySolution | - | +| | actions, alerting, files, cases, observabilityAIAssistant, fleet, cloudDefend, cloudSecurityPosture, elasticAssistant, enterpriseSearch, lists, osquery, securitySolution, reporting, serverlessSearch, transform, upgradeAssistant, apm, synthetics, security | - | +| | cases, securitySolution, security | - | | | @kbn/securitysolution-data-table, securitySolution | - | | | @kbn/securitysolution-data-table, securitySolution | - | | | securitySolution | - | @@ -45,6 +48,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, home, savedObjectsTagging, canvas, savedObjects, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-import-export-server-internal, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-ui-settings-server-internal | - | | | @kbn/core-saved-objects-migration-server-internal, actions, dataViews, data, alerting, lens, cases, savedSearch, canvas, savedObjectsTagging, graph, lists, maps, visualizations, securitySolution, dashboard, @kbn/core-test-helpers-so-type-serializer | - | +| | dataViews, security, maps, imageEmbeddable, enterpriseSearch, securitySolution, serverlessSearch, cloudLinks, observabilityAIAssistantApp, cases, apm | - | +| | security, cases, searchPlayground, securitySolution | - | | | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | | | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | | | lists, securitySolution, @kbn/securitysolution-io-ts-list-types | - | @@ -60,7 +65,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/monaco, securitySolution | - | | | fleet, cloudSecurityPosture, exploratoryView, osquery, synthetics | - | | | actions, alerting | - | -| | visualizations, lens, controls, dashboard, maps, discover, infra, profiling, links | - | +| | visualizations, lens, controls, dashboard, maps, discover, profiling, links | - | | | discover, @kbn/reporting-public | - | | | data, discover, imageEmbeddable, embeddable | - | | | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, visualizations, fileUpload, dashboardEnhanced, transform, dashboard, discover, dataVisualizer | - | @@ -110,6 +115,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | dashboard, canvas | - | | | dashboard | - | | | embeddable, dashboard | - | +| | dataVisualizer, security | - | | | dataViews, maps | - | | | dataViews, dataViewManagement | - | | | dataViews, dataViewManagement | - | @@ -145,18 +151,18 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-logging-server-internal, security | - | | | @kbn/react-kibana-context-styled, kibanaReact | - | | | encryptedSavedObjects | - | -| | @kbn/content-management-table-list-view, filesManagement | - | -| | @kbn/core | - | -| | @kbn/core | - | -| | @kbn/core-lifecycle-browser-mocks, @kbn/core, @kbn/core-plugins-browser-internal | - | -| | @kbn/core | - | -| | @kbn/core-plugins-server-internal | - | | | reporting | - | | | @kbn/reporting-export-types-csv, reporting | - | | | @kbn/reporting-export-types-csv, reporting | - | | | reporting | - | | | reporting | - | | | @kbn/reporting-export-types-pdf, reporting | - | +| | @kbn/content-management-table-list-view, filesManagement | - | +| | @kbn/core | - | +| | @kbn/core | - | +| | @kbn/core-lifecycle-browser-mocks, @kbn/core, @kbn/core-plugins-browser-internal | - | +| | @kbn/core | - | +| | @kbn/core-plugins-server-internal | - | | | @kbn/reporting-csv-share-panel | - | | | security, aiops, licenseManagement, ml, crossClusterReplication, logstash, painlessLab, searchprofiler, watcher, profiling, apm, slo | 8.8.0 | | | spaces, security, actions, alerting, aiops, remoteClusters, ml, graph, indexLifecycleManagement, mapsEms, osquery, securitySolution, painlessLab, rollup, searchprofiler, snapshotRestore, transform, upgradeAssistant | 8.8.0 | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 538da386fe47d8..665dbca27df131 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -449,10 +449,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/license_state.test.ts#:~:text=license%24) | 8.8.0 | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=authc) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=authz) | - | +| | [action_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/action_executor.ts#:~:text=authc), [action_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/lib/action_executor.ts#:~:text=authc) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=index) | - | | | [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [actions_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/actions_client/actions_client.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/types.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/types.ts#:~:text=SavedObjectAttributes)+ 10 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/saved_objects/index.ts#:~:text=migrations), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/saved_objects/index.ts#:~:text=migrations) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/saved_objects/index.ts#:~:text=convertToMultiNamespaceTypeVersion), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/saved_objects/index.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=audit), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/actions/server/plugin.ts#:~:text=audit) | - | @@ -478,10 +480,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch), [wrap_search_source_client.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/wrap_search_source_client.test.ts#:~:text=fetch) | - | | | [plugin.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.test.ts#:~:text=getKibanaFeatures) | 8.8.0 | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24), [license_state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/lib/license_state.test.ts#:~:text=license%24) | 8.8.0 | +| | [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [rules_settings_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_settings_client_factory.ts#:~:text=authc), [maintenance_window_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/maintenance_window_client_factory.ts#:~:text=authc), [task.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/plugin.ts#:~:text=authc), [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc), [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=authc)+ 6 more | - | | | [task.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/usage/task.ts#:~:text=index) | - | | | [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/common/rule.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [rule_attributes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/data/rule/types/rule_attributes.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [inject_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client/common/inject_references.ts#:~:text=SavedObjectAttributes), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/types.ts#:~:text=SavedObjectAttributes)+ 36 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/index.ts#:~:text=migrations) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/saved_objects/index.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [rules_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/alerting/server/rules_client_factory.ts#:~:text=audit) | - | @@ -493,7 +497,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | 8.8.0 | | | [license_context.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/public/context/license/license_context.tsx#:~:text=license%24) | 8.8.0 | | | [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode), [license_check.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/common/license_check.test.ts#:~:text=mode)+ 2 more | 8.8.0 | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts#:~:text=authc), [get_agent_keys_privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/get_agent_keys_privileges.ts#:~:text=authc), [is_superuser.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts#:~:text=authc), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts#:~:text=authc), [get_agent_keys_privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/routes/agent_keys/get_agent_keys_privileges.ts#:~:text=authc), [is_superuser.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts#:~:text=authc) | - | | | [apm_service_groups.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/server/saved_objects/apm_service_groups.ts#:~:text=migrations) | - | +| | [use_current_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/public/hooks/use_current_user.ts#:~:text=authc), [use_current_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/apm/public/hooks/use_current_user.ts#:~:text=authc) | - | @@ -537,9 +543,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [factory.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.test.ts#:~:text=getKibanaFeatures) | 8.8.0 | +| | [factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.ts#:~:text=authc), [factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.ts#:~:text=authc) | - | +| | [email_notification_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts#:~:text=userProfiles), [factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.ts#:~:text=userProfiles), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/cases/utils.ts#:~:text=userProfiles), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_profiles/index.ts#:~:text=userProfiles), [email_notification_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts#:~:text=userProfiles), [factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.ts#:~:text=userProfiles), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/cases/utils.ts#:~:text=userProfiles), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_profiles/index.ts#:~:text=userProfiles) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject) | - | | | [cases.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/cases/cases.ts#:~:text=migrations), [configure.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/configure.ts#:~:text=migrations), [comments.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/comments.ts#:~:text=migrations), [user_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/user_actions.ts#:~:text=migrations), [connector_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/connector_mappings.ts#:~:text=migrations) | - | | | [cases.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/cases/cases.ts#:~:text=convertToMultiNamespaceTypeVersion), [configure.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/configure.ts#:~:text=convertToMultiNamespaceTypeVersion), [comments.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/comments.ts#:~:text=convertToMultiNamespaceTypeVersion), [user_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/user_actions.ts#:~:text=convertToMultiNamespaceTypeVersion), [connector_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/connector_mappings.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/lib/kibana/hooks.ts#:~:text=authc) | - | +| | [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.ts#:~:text=userProfiles), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.ts#:~:text=userProfiles), [api.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.test.ts#:~:text=userProfiles), [api.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.test.ts#:~:text=userProfiles), [api.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.test.ts#:~:text=userProfiles), [api.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/containers/user_profiles/api.test.ts#:~:text=userProfiles) | - | +| | [factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/client/factory.ts#:~:text=audit) | - | @@ -551,11 +562,28 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## cloudDefend + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [setup_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_defend/server/routes/setup_routes.ts#:~:text=authc), [setup_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_defend/server/routes/setup_routes.ts#:~:text=authc) | - | + + + +## cloudLinks + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [maybe_add_cloud_links.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts#:~:text=authc) | - | + + + ## cloudSecurityPosture | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [overview_tab.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/public/pages/configurations/findings_flyout/overview_tab.tsx#:~:text=indexPatternId) | - | +| | [setup_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts#:~:text=authc), [setup_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts#:~:text=authc) | - | | | [csp_benchmark_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts#:~:text=migrations) | - | | | [csp_benchmark_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_benchmark_rule.ts#:~:text=schemas), [csp_settings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_security_posture/server/saved_objects/csp_settings.ts#:~:text=schemas) | - | @@ -668,6 +696,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_view.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.ts#:~:text=getScriptedFields), [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_views.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields), [data_view.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/common/data_views/data_view.test.ts#:~:text=getScriptedFields) | - | | | [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/saved_objects/data_views.ts#:~:text=migrations) | - | | | [data_views.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/server/saved_objects/data_views.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/src/plugins/data_views/public/plugin.ts#:~:text=authc) | - | @@ -677,6 +706,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [document_stats.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/document_stats.tsx#:~:text=fieldFormats), [distinct_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/distinct_values.tsx#:~:text=fieldFormats), [top_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx#:~:text=fieldFormats), [choropleth_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx#:~:text=fieldFormats), [default_value_formatter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts#:~:text=fieldFormats) | - | | | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | +| | [filebeat_config_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx#:~:text=authc), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=authc), [filebeat_config_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx#:~:text=authc), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=authc) | - | | | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=savedObjects) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject) | - | @@ -698,6 +728,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## elasticAssistant + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts#:~:text=authc), [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts#:~:text=authc) | - | + + + ## embeddable | Deprecated API | Reference location(s) | Remove By | @@ -735,8 +773,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [find_or_create_data_view.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts#:~:text=title), [analytics_collection_explore_table_formulas.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/components/analytics_collection_view/analytics_collection_explore_table_formulas.ts#:~:text=title), [find_or_create_data_view.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.test.ts#:~:text=title) | - | | | [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=uiApi) | - | | | [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz), [check_access.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/check_access.ts#:~:text=authz) | - | +| | [create_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/indices/create_api_key.ts#:~:text=authc), [api_keys.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts#:~:text=authc), [api_keys.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts#:~:text=authc), [create_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/lib/indices/create_api_key.ts#:~:text=authc), [api_keys.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts#:~:text=authc), [api_keys.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts#:~:text=authc) | - | | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/plugin.ts#:~:text=legacy) | - | | | [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes), [telemetry.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/server/collectors/lib/telemetry.ts#:~:text=SavedObjectAttributes) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/index.tsx#:~:text=authc), [roles_empty_prompt.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/roles_empty_prompt.tsx#:~:text=authc), [roles_empty_prompt.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/roles_empty_prompt.tsx#:~:text=authc), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=authc), [account_settings.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx#:~:text=authc) | - | @@ -792,6 +832,15 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## files + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [create.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/routes/file_kind/create.ts#:~:text=authc), [create.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/routes/file_kind/create.ts#:~:text=authc) | - | +| | [file_service_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/file_service/file_service_factory.ts#:~:text=audit), [file_service_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/files/server/file_service/file_service_factory.ts#:~:text=audit) | - | + + + ## filesManagement | Deprecated API | Reference location(s) | Remove By | @@ -810,8 +859,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [use_get_logs_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/hooks/use_get_logs_discover_link.tsx#:~:text=indexPatternId) | - | | | [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode) | 8.8.0 | | | [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/services/agent_policy_config.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode), [agent_policy_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/agent_policy_watch.test.ts#:~:text=mode) | 8.8.0 | +| | [security.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/security/security.ts#:~:text=authc), [transform_api_keys.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts#:~:text=authc), [security.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/api_keys/security.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/package_policy/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/epm/handlers.ts#:~:text=authc), [handlers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/routes/epm/handlers.ts#:~:text=authc)+ 36 more | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/integrations/index.tsx#:~:text=appBasePath) | 8.8.0 | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/saved_objects/index.ts#:~:text=migrations), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/saved_objects/index.ts#:~:text=migrations), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/saved_objects/index.ts#:~:text=migrations), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/saved_objects/index.ts#:~:text=migrations), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/saved_objects/index.ts#:~:text=migrations) | - | +| | [audit_logging.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/audit_logging.ts#:~:text=audit), [audit_logging.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/audit_logging.ts#:~:text=audit) | - | @@ -863,6 +914,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [image_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/image_embeddable/public/components/image_embeddable.tsx#:~:text=executeTriggerActions) | - | +| | [open_image_editor.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx#:~:text=authc) | - | @@ -879,7 +931,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [validation_errors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/logs/settings/validation_errors.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [index_patterns.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/common/dependency_mocks/index_patterns.ts#:~:text=title), [use_waffle_filters.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.test.ts#:~:text=title) | - | -| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/public/plugin.ts#:~:text=registerEmbeddableFactory) | - | | | [saved_object_type.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/infra/server/lib/sources/saved_object_type.ts#:~:text=migrations) | - | @@ -971,6 +1022,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=migrationVersion) | - | | | [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=migrationVersion), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=migrationVersion), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=migrationVersion), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=migrationVersion) | - | +| | [get_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/get_user.ts#:~:text=authc), [get_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/get_user.ts#:~:text=authc) | - | | | [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=SavedObject), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=SavedObject), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=SavedObject), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=SavedObject), [exception_list_client.mock.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts#:~:text=SavedObject) | - | | | [exception_list.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/saved_objects/exception_list.ts#:~:text=migrations), [exception_list.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/saved_objects/exception_list.ts#:~:text=migrations) | - | | | [exception_list.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/lists/server/saved_objects/exception_list.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | @@ -1021,6 +1073,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/migrations/references.ts#:~:text=SavedObjectReference), [references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/migrations/references.ts#:~:text=SavedObjectReference), [references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/migrations/references.ts#:~:text=SavedObjectReference), [references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/migrations/references.ts#:~:text=SavedObjectReference), [references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/common/migrations/references.ts#:~:text=SavedObjectReference), [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=SavedObjectReference), [map_attribute_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/map_attribute_service.ts#:~:text=SavedObjectReference) | - | | | [setup_saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts#:~:text=migrations) | - | | | [setup_saved_objects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/server/saved_objects/setup_saved_objects.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [es_search_source.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx#:~:text=authc) | - | @@ -1057,6 +1110,22 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## observabilityAIAssistant + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts#:~:text=authc), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts#:~:text=authc) | - | + + + +## observabilityAIAssistantApp + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [use_current_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_current_user.ts#:~:text=authc) | - | + + + ## observabilityOnboarding | Deprecated API | Reference location(s) | Remove By | @@ -1082,6 +1151,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion), [read_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/read_pack_route.ts#:~:text=migrationVersion) | - | | | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatternId), [view_results_in_discover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/discover/view_results_in_discover.tsx#:~:text=indexPatternId), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=indexPatternId) | - | | | [create_action_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts#:~:text=license%24) | 8.8.0 | +| | [create_live_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts#:~:text=authc), [create_saved_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts#:~:text=authc), [update_saved_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts#:~:text=authc), [create_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts#:~:text=authc), [update_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts#:~:text=authc), [update_assets_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts#:~:text=authc), [create_live_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts#:~:text=authc), [create_saved_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts#:~:text=authc), [update_saved_query_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts#:~:text=authc), [create_pack_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts#:~:text=authc)+ 2 more | - | | | [add_to_timeline_button.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/timelines/add_to_timeline_button.tsx#:~:text=getHoverActions) | - | @@ -1125,6 +1195,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| +| | [get_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/common/get_user.ts#:~:text=authc), [get_user.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/common/get_user.ts#:~:text=authc) | - | | | [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=CsvSearchSourceImmediateExportType), [core.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/core.ts#:~:text=CsvSearchSourceImmediateExportType) | - | | | [csv_searchsource_immediate.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/internal/generate/csv_searchsource_immediate.ts#:~:text=JobParamsDownloadCSV), [csv_searchsource_immediate.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/internal/generate/csv_searchsource_immediate.ts#:~:text=JobParamsDownloadCSV) | - | | | [csv_searchsource_immediate.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/internal/generate/csv_searchsource_immediate.ts#:~:text=CSV_SEARCHSOURCE_IMMEDIATE_TYPE), [csv_searchsource_immediate.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/internal/generate/csv_searchsource_immediate.ts#:~:text=CSV_SEARCHSOURCE_IMMEDIATE_TYPE), [csv_searchsource_immediate.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/reporting/server/routes/internal/generate/csv_searchsource_immediate.ts#:~:text=CSV_SEARCHSOURCE_IMMEDIATE_TYPE) | - | @@ -1147,6 +1218,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [create_lifecycle_executor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/utils/create_lifecycle_executor.ts#:~:text=alertFactory), [create_persistence_rule_type_wrapper.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts#:~:text=alertFactory), [create_persistence_rule_type_wrapper.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/utils/create_persistence_rule_type_wrapper.ts#:~:text=alertFactory), [rule_executor.test_helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/utils/rule_executor.test_helpers.ts#:~:text=alertFactory) | - | +| | [alerts_client_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts#:~:text=audit), [search_strategy.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts#:~:text=audit) | - | @@ -1218,6 +1290,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] +## searchPlayground + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [use_user_profile.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/search_playground/public/hooks/use_user_profile.ts#:~:text=userProfiles) | - | + + + ## searchprofiler | Deprecated API | Reference location(s) | Remove By | @@ -1239,7 +1319,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ This is relied on by the reporting feature, and should be removed once reporting migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/issues/19914 | -| | [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 15 more | 8.8.0 | +| | [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 24 more | 8.8.0 | | | [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getElasticsearchFeatures) | 8.8.0 | | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=license%24) | 8.8.0 | @@ -1247,6 +1327,12 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=license%24) | 8.8.0 | | | [logout_app.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/authentication/logout/logout_app.test.ts#:~:text=appBasePath) | 8.8.0 | | | [config.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/config.ts#:~:text=max) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=authc) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=authc) | - | +| | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=userProfiles) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=audit) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=authc) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/plugin.ts#:~:text=userProfiles) | - | @@ -1268,6 +1354,8 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [policy_config.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/license/policy_config.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [fleet_integration.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/fleet_integration.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [create_default_policy.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_default_policy.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode), [license_watch.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/policy/license_watch.test.ts#:~:text=mode)+ 7 more | 8.8.0 | | | [get_is_alert_suppression_active.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.ts#:~:text=license%24), [create_threat_signals.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/indicator_match/threat_mapping/create_threat_signals.ts#:~:text=license%24), [query.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts#:~:text=license%24), [threshold.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/threshold.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24), [get_is_alert_suppression_active.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_is_alert_suppression_active.test.ts#:~:text=license%24) | 8.8.0 | | | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/request_context_factory.ts#:~:text=authc), [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=authc), [create_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts#:~:text=authc), [delete_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts#:~:text=authc), [finalize_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts#:~:text=authc), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts#:~:text=authc) | - | +| | [endpoint_app_context_services.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts#:~:text=authc), [open_close_signals_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts#:~:text=authc), [open_close_signals_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts#:~:text=authc), [file_info_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts#:~:text=authc), [file_download_handler.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts#:~:text=authc), [response_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts#:~:text=authc), [list.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts#:~:text=authc), [response_actions.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts#:~:text=authc), [state.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts#:~:text=authc), [index.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts#:~:text=authc)+ 14 more | - | +| | [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles), [suggest_user_profiles_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts#:~:text=userProfiles) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedCellValueElementProps) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx#:~:text=DeprecatedRowRenderer) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields) | - | @@ -1280,6 +1368,9 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=SavedObject), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=SavedObject), [user_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/user_risk_score_dashboards.ts#:~:text=SavedObject), [user_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/user_risk_score_dashboards.ts#:~:text=SavedObject) | - | | | [timelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts#:~:text=migrations), [notes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/notes.ts#:~:text=migrations), [pinned_events.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/pinned_events.ts#:~:text=migrations), [legacy_saved_object_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_saved_object_mappings.ts#:~:text=migrations), [saved_object_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/saved_object_mappings.ts#:~:text=migrations) | - | | | [timelines.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/timelines.ts#:~:text=convertToMultiNamespaceTypeVersion), [notes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/notes.ts#:~:text=convertToMultiNamespaceTypeVersion), [pinned_events.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/saved_object_mappings/pinned_events.ts#:~:text=convertToMultiNamespaceTypeVersion), [legacy_saved_object_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_saved_object_mappings.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | +| | [links.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/links.ts#:~:text=authc), [hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts#:~:text=authc) | - | +| | [use_bulk_get_user_profiles.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/user_profiles/use_bulk_get_user_profiles.tsx#:~:text=userProfiles), [use_get_current_user_profile.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/user_profiles/use_get_current_user_profile.tsx#:~:text=userProfiles), [overlay.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/assistant/overlay.tsx#:~:text=userProfiles) | - | +| | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/request_context_factory.ts#:~:text=audit), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=audit) | - | | | [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [trusted_app_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [trusted_app_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID)+ 25 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION) | - | @@ -1296,6 +1387,15 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## serverlessSearch + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [api_key_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts#:~:text=authc), [api_key_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts#:~:text=authc), [indices_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/indices_routes.ts#:~:text=authc), [api_key_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts#:~:text=authc), [api_key_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts#:~:text=authc), [indices_routes.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/server/routes/indices_routes.ts#:~:text=authc) | - | +| | [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/serverless_search/public/plugin.ts#:~:text=authc) | - | + + + ## share | Deprecated API | Reference location(s) | Remove By | @@ -1354,6 +1454,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | ---------------|-----------|-----------| | | [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/alert_rules/common.ts#:~:text=alertFactory), [message_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/message_utils.ts#:~:text=alertFactory), [tls_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/alert_rules/tls_rule/tls_rule.ts#:~:text=alertFactory), [monitor_status_rule.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/alert_rules/status_rule/monitor_status_rule.ts#:~:text=alertFactory) | - | | | [stderr_logs.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx#:~:text=indexPatternId) | - | +| | [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [enablement.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts#:~:text=authc), [enablement.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc), [get_api_key.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts#:~:text=authc)+ 6 more | - | | | [synthetics_monitor.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability_solution/synthetics/server/saved_objects/synthetics_monitor.ts#:~:text=migrations) | - | @@ -1389,6 +1490,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | ---------------|-----------|-----------| | | [filter_term_form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/filter_agg/components/filter_term_form.tsx#:~:text=title), [use_data_view_exists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/hooks/use_data_view_exists.ts#:~:text=title), [common.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/common/common.test.ts#:~:text=title) | - | | | [license.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/services/license.ts#:~:text=license%24) | 8.8.0 | +| | [route_handler_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts#:~:text=authc), [route_handler_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts#:~:text=authc) | - | | | [mount_management_section.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/mount_management_section.ts#:~:text=savedObjects) | - | | | [app_dependencies.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/app_dependencies.tsx#:~:text=SavedObjectsStart), [app_dependencies.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/transform/public/app/app_dependencies.tsx#:~:text=SavedObjectsStart) | - | @@ -1431,6 +1533,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | ---------------|-----------|-----------| | | [external_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/public/application/components/es_deprecation_logs/fix_deprecation_logs/external_links.tsx#:~:text=title) | - | | | [reindex_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24), [reindex_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/reindex_service.test.ts#:~:text=license%24) | 8.8.0 | +| | [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc), [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc), [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc), [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc), [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc), [credential_store.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts#:~:text=authc) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/common/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/upgrade_assistant/common/types.ts#:~:text=SavedObject) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 2e76022ee377b4..55723af7a0679d 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -87,7 +87,7 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ This is relied on by the reporting feature, and should be removed once reporting migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/issues/19914 | -| security | | [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 18 more | 8.8.0 | +| security | | [app_authorization.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.ts#:~:text=getKibanaFeatures), [privileges.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.ts#:~:text=getKibanaFeatures), [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getKibanaFeatures), [app_authorization.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/app_authorization.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures), [privileges.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts#:~:text=getKibanaFeatures)+ 27 more | 8.8.0 | | security | | [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getElasticsearchFeatures) | 8.8.0 | | security | | [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode), [license_service.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/common/licensing/license_service.test.ts#:~:text=mode) | 8.8.0 | | security | | [plugin.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/plugin.tsx#:~:text=license%24) | 8.8.0 | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 8252ff6115dab7..715f165736c2b2 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2024-06-05 +date: 2024-06-09 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 25da2f30949ac5..ad91704bd2c7d0 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2024-06-05 +date: 2024-06-09 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 73c356c969b491..9d47a144d4b2ae 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index 64db9e7ca81753..3e23a9ec7dd212 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 6a2fbe60f1cd61..b04c83fcf5250b 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2024-06-05 +date: 2024-06-09 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 f747b69145ed41..25d88edcf79633 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 9b90be202d337f..01c91c22b075e8 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -12900,7 +12900,7 @@ ], "signature": [ "(initialState: RuntimeState, buildApi: (apiRegistration: ", - "ReactEmbeddableApiRegistration", + "BuildReactEmbeddableApiRegistration", ", comparators: ", { "pluginId": "@kbn/presentation-publishing", @@ -12909,7 +12909,9 @@ "section": "def-common.StateComparators", "text": "StateComparators" }, - ") => Api, uuid: string, parentApi?: unknown) => Promise<{ Component: React.FC<{}>; api: Api; }>" + ") => Api, uuid: string, parentApi: unknown, setApi: (api: ", + "SetReactEmbeddableApiRegistration", + ") => Api) => Promise<{ Component: React.FC<{}>; api: Api; }>" ], "path": "src/plugins/embeddable/public/react_embeddable_system/types.ts", "deprecated": false, @@ -12939,7 +12941,7 @@ "description": [], "signature": [ "(apiRegistration: ", - "ReactEmbeddableApiRegistration", + "BuildReactEmbeddableApiRegistration", ", comparators: ", { "pluginId": "@kbn/presentation-publishing", @@ -12984,6 +12986,23 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "embeddable", + "id": "def-public.ReactEmbeddableFactory.buildEmbeddable.$5", + "type": "Function", + "tags": [], + "label": "setApi", + "description": [], + "signature": [ + "(api: ", + "SetReactEmbeddableApiRegistration", + ") => Api" + ], + "path": "src/plugins/embeddable/public/react_embeddable_system/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true } ], "returnComment": [] @@ -14283,10 +14302,6 @@ "plugin": "discover", "path": "src/plugins/discover/public/plugin.tsx" }, - { - "plugin": "infra", - "path": "x-pack/plugins/observability_solution/infra/public/plugin.ts" - }, { "plugin": "profiling", "path": "x-pack/plugins/observability_solution/profiling/public/embeddables/register_embeddables.ts" diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 20d0bb8050c317..de4c5a7674082a 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 556 | 1 | 446 | 8 | +| 557 | 1 | 447 | 9 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 2a36bc048ca314..61a42bc57f6179 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2024-06-05 +date: 2024-06-09 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 afe609755793f4..3128ab3e5946de 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2024-06-05 +date: 2024-06-09 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 40801bf27ebe6f..2a3bba48bada4d 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2024-06-05 +date: 2024-06-09 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 7e3cb69fc0f45a..b3538db59ee92f 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql_data_grid.devdocs.json b/api_docs/esql_data_grid.devdocs.json new file mode 100644 index 00000000000000..ea15ca5487f8b0 --- /dev/null +++ b/api_docs/esql_data_grid.devdocs.json @@ -0,0 +1,61 @@ +{ + "id": "esqlDataGrid", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "esqlDataGrid", + "id": "def-public.ESQLDataGrid", + "type": "Function", + "tags": [], + "label": "ESQLDataGrid", + "description": [], + "signature": [ + "(props: ESQLDataGridProps) => JSX.Element" + ], + "path": "src/plugins/esql_datagrid/public/create_datagrid.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esqlDataGrid", + "id": "def-public.ESQLDataGrid.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "ESQLDataGridProps" + ], + "path": "src/plugins/esql_datagrid/public/create_datagrid.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx new file mode 100644 index 00000000000000..e78b7621bb2f74 --- /dev/null +++ b/api_docs/esql_data_grid.mdx @@ -0,0 +1,30 @@ +--- +#### +#### 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: kibEsqlDataGridPluginApi +slug: /kibana-dev-docs/api/esqlDataGrid +title: "esqlDataGrid" +image: https://source.unsplash.com/400x175/?github +description: API docs for the esqlDataGrid plugin +date: 2024-06-09 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] +--- +import esqlDataGridObj from './esql_data_grid.devdocs.json'; + + + +Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 2 | 0 | 2 | 0 | + +## Client + +### Functions + + diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index b093993ab0a639..1ee995dba019bc 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2024-06-05 +date: 2024-06-09 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 7d59a8f090d57e..e62bb9d5ff80bf 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-06-05 +date: 2024-06-09 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 17d9c45529df08..820dbfa7e1ecbd 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2024-06-05 +date: 2024-06-09 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 b80a29a86de9b6..d84b539b44a083 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2024-06-05 +date: 2024-06-09 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 3d4a101e9cb878..3f35211d1cbb3d 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2024-06-05 +date: 2024-06-09 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 d7e02c6fb9cabc..5a2bf6ca62442d 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2024-06-05 +date: 2024-06-09 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 dedf1f356deb46..c73d823fd44a7e 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2024-06-05 +date: 2024-06-09 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 655e185d46512d..93110d2ab41cf1 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2024-06-05 +date: 2024-06-09 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 d2aadd6444fc31..7e9e60f7dd05b6 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2024-06-05 +date: 2024-06-09 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 92389c0ec92aea..2da47ebe19ccee 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2024-06-05 +date: 2024-06-09 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 e3169d31d1f675..e86cf7f2b2ab70 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2024-06-05 +date: 2024-06-09 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 85afebfd437ede..bd5f348ccfcc43 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2024-06-05 +date: 2024-06-09 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 b04ac01380260b..8122cfccbfcb01 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2024-06-05 +date: 2024-06-09 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 ade52e9096a8cf..c75076257eb314 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2024-06-05 +date: 2024-06-09 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 cda8d9a5002c22..4dbfd70f3fa6da 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2024-06-05 +date: 2024-06-09 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 c76b87e1b619a6..f8e17f29c0b05a 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2024-06-05 +date: 2024-06-09 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 6a24838acafdae..b277563fccea07 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2024-06-05 +date: 2024-06-09 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 2ed920680bb2f6..3b2a2e90f01235 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.devdocs.json b/api_docs/features.devdocs.json index 2fd46e8ffdbd9d..9af80b8a01f040 100644 --- a/api_docs/features.devdocs.json +++ b/api_docs/features.devdocs.json @@ -56,7 +56,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -64,7 +64,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined; }>" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; }>" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -85,6 +85,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "features", + "id": "def-public.KibanaFeature.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "features", "id": "def-public.KibanaFeature.name", @@ -202,7 +216,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -255,7 +269,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -480,6 +494,30 @@ "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-public.FeatureKibanaPrivileges.composedOf", + "type": "Object", + "tags": [], + "label": "composedOf", + "description": [ + "\nAn optional list of other registered feature or sub-feature privileges that this privilege is composed of. When\nprivilege is registered with Elasticsearch, it will be expanded to grant everything that referenced privileges\ngrant. This property can only be set in the feature configuration overrides." + ], + "signature": [ + "readonly ", + { + "pluginId": "features", + "scope": "common", + "docId": "kibFeaturesPluginApi", + "section": "def-common.FeatureKibanaPrivilegesReference", + "text": "FeatureKibanaPrivilegesReference" + }, + "[] | undefined" + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -782,6 +820,22 @@ "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-public.KibanaFeatureConfig.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [ + "\nIndicates whether the feature is available as a standalone feature. The feature can still be\nreferenced by other features, but it will not be displayed in any feature management UIs. By default, all features\nare visible." + ], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -912,7 +966,7 @@ "section": "def-common.FeatureKibanaPrivileges", "text": "FeatureKibanaPrivileges" }, - ", \"excludeFromBasePrivileges\">" + ", \"excludeFromBasePrivileges\" | \"composedOf\">" ], "path": "x-pack/plugins/features/common/sub_feature.ts", "deprecated": false, @@ -1264,7 +1318,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -1272,7 +1326,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined; }>" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; }>" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -1293,6 +1347,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "features", + "id": "def-server.KibanaFeature.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "features", "id": "def-server.KibanaFeature.name", @@ -1410,7 +1478,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -1463,7 +1531,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -1867,6 +1935,30 @@ "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-server.FeatureKibanaPrivileges.composedOf", + "type": "Object", + "tags": [], + "label": "composedOf", + "description": [ + "\nAn optional list of other registered feature or sub-feature privileges that this privilege is composed of. When\nprivilege is registered with Elasticsearch, it will be expanded to grant everything that referenced privileges\ngrant. This property can only be set in the feature configuration overrides." + ], + "signature": [ + "readonly ", + { + "pluginId": "features", + "scope": "common", + "docId": "kibFeaturesPluginApi", + "section": "def-common.FeatureKibanaPrivilegesReference", + "text": "FeatureKibanaPrivilegesReference" + }, + "[] | undefined" + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -2169,6 +2261,22 @@ "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-server.KibanaFeatureConfig.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [ + "\nIndicates whether the feature is available as a standalone feature. The feature can still be\nreferenced by other features, but it will not be displayed in any feature management UIs. By default, all features\nare visible." + ], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -2417,6 +2525,42 @@ "plugin": "security", "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/server/authorization/privileges/privileges.test.ts" + }, { "plugin": "spaces", "path": "x-pack/plugins/spaces/server/lib/request_interceptors/on_post_auth_interceptor.test.ts" @@ -2965,7 +3109,7 @@ "label": "config", "description": [], "signature": [ - "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", + "Readonly<{ id: string; name: string; description?: string | undefined; category: Readonly<{ id: string; label: string; ariaLabel?: string | undefined; order?: number | undefined; euiIconType?: string | undefined; }>; order?: number | undefined; excludeFromBasePrivileges?: boolean | undefined; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; app: readonly string[]; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; privileges: Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null; subFeatures?: readonly Readonly<{ name: string; requireAllSpaces?: boolean | undefined; privilegesTooltip?: string | undefined; privilegeGroups: readonly Readonly<{ groupType: ", { "pluginId": "features", "scope": "common", @@ -2973,7 +3117,7 @@ "section": "def-common.SubFeaturePrivilegeGroupType", "text": "SubFeaturePrivilegeGroupType" }, - "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined; }>" + "; privileges: readonly Readonly<{ id: string; name: string; includeIn: \"none\" | \"read\" | \"all\"; minimumLicense?: \"basic\" | \"standard\" | \"gold\" | \"platinum\" | \"enterprise\" | \"trial\" | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; ui: readonly string[]; catalogue?: readonly string[] | undefined; app?: readonly string[] | undefined; requireAllSpaces?: boolean | undefined; api?: readonly string[] | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; }>[]; }>[]; description?: string | undefined; }>[] | undefined; privilegesTooltip?: string | undefined; reserved?: Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined; hidden?: boolean | undefined; }>" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -2994,6 +3138,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "features", + "id": "def-common.KibanaFeature.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "features", "id": "def-common.KibanaFeature.name", @@ -3111,7 +3269,7 @@ "label": "privileges", "description": [], "signature": [ - "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }> | null" + "Readonly<{ all: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; read: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }> | null" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -3164,7 +3322,7 @@ "label": "reserved", "description": [], "signature": [ - "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; }>; }>[]; }> | undefined" + "Readonly<{ description: string; privileges: readonly Readonly<{ id: string; privilege: Readonly<{ excludeFromBasePrivileges?: boolean | undefined; requireAllSpaces?: boolean | undefined; disabled?: boolean | undefined; management?: Readonly<{ [x: string]: readonly string[]; }> | undefined; catalogue?: readonly string[] | undefined; api?: readonly string[] | undefined; app?: readonly string[] | undefined; alerting?: Readonly<{ rule?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; alert?: Readonly<{ all?: readonly string[] | undefined; read?: readonly string[] | undefined; }> | undefined; }> | undefined; cases?: Readonly<{ all?: readonly string[] | undefined; push?: readonly string[] | undefined; create?: readonly string[] | undefined; read?: readonly string[] | undefined; update?: readonly string[] | undefined; delete?: readonly string[] | undefined; settings?: readonly string[] | undefined; }> | undefined; savedObject: Readonly<{ all: readonly string[]; read: readonly string[]; }>; ui: readonly string[]; composedOf?: readonly Readonly<{ feature: string; privileges: readonly string[]; }>[] | undefined; }>; }>[]; }> | undefined" ], "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, @@ -3701,6 +3859,75 @@ "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-common.FeatureKibanaPrivileges.composedOf", + "type": "Object", + "tags": [], + "label": "composedOf", + "description": [ + "\nAn optional list of other registered feature or sub-feature privileges that this privilege is composed of. When\nprivilege is registered with Elasticsearch, it will be expanded to grant everything that referenced privileges\ngrant. This property can only be set in the feature configuration overrides." + ], + "signature": [ + "readonly ", + { + "pluginId": "features", + "scope": "common", + "docId": "kibFeaturesPluginApi", + "section": "def-common.FeatureKibanaPrivilegesReference", + "text": "FeatureKibanaPrivilegesReference" + }, + "[] | undefined" + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "features", + "id": "def-common.FeatureKibanaPrivilegesReference", + "type": "Interface", + "tags": [], + "label": "FeatureKibanaPrivilegesReference", + "description": [ + "\nDefines a reference to a set of privileges of a specific feature." + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges_reference.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "features", + "id": "def-common.FeatureKibanaPrivilegesReference.feature", + "type": "string", + "tags": [], + "label": "feature", + "description": [ + "\nThe ID of the feature." + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges_reference.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-common.FeatureKibanaPrivilegesReference.privileges", + "type": "Object", + "tags": [], + "label": "privileges", + "description": [ + "\nThe set of IDs of feature or sub-feature privileges provided by the feature." + ], + "signature": [ + "readonly string[]" + ], + "path": "x-pack/plugins/features/common/feature_kibana_privileges_reference.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -4003,6 +4230,22 @@ "path": "x-pack/plugins/features/common/kibana_feature.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "features", + "id": "def-common.KibanaFeatureConfig.hidden", + "type": "CompoundType", + "tags": [], + "label": "hidden", + "description": [ + "\nIndicates whether the feature is available as a standalone feature. The feature can still be\nreferenced by other features, but it will not be displayed in any feature management UIs. By default, all features\nare visible." + ], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/features/common/kibana_feature.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -4133,7 +4376,7 @@ "section": "def-common.FeatureKibanaPrivileges", "text": "FeatureKibanaPrivileges" }, - ", \"excludeFromBasePrivileges\">" + ", \"excludeFromBasePrivileges\" | \"composedOf\">" ], "path": "x-pack/plugins/features/common/sub_feature.ts", "deprecated": false, diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 044719c404618b..0599b1ee27a118 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 235 | 0 | 99 | 2 | +| 247 | 0 | 102 | 2 | ## Client diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index e532a3ed81b67f..c5c4435bdf43e0 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.devdocs.json b/api_docs/fields_metadata.devdocs.json new file mode 100644 index 00000000000000..63ccdbaad3943a --- /dev/null +++ b/api_docs/fields_metadata.devdocs.json @@ -0,0 +1,762 @@ +{ + "id": "fieldsMetadata", + "client": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicSetupDeps", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataPublicSetupDeps", + "description": [], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStartDeps", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataPublicStartDeps", + "description": [], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicSetup", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataPublicSetup", + "description": [], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStart", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataPublicStart", + "description": [], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStart.getClient", + "type": "Function", + "tags": [], + "label": "getClient", + "description": [], + "signature": [ + "() => Promise<", + "IFieldsMetadataClient", + ">" + ], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStart.useFieldsMetadata", + "type": "Function", + "tags": [], + "label": "useFieldsMetadata", + "description": [], + "signature": [ + "(params?: ", + "FindFieldsMetadataRequestQuery", + " | undefined, deps?: React.DependencyList | undefined) => ", + "UseFieldsMetadataReturnType" + ], + "path": "x-pack/plugins/fields_metadata/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStart.useFieldsMetadata.$1", + "type": "CompoundType", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "FindFieldsMetadataRequestQuery", + " | undefined" + ], + "path": "x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-public.FieldsMetadataPublicStart.useFieldsMetadata.$2", + "type": "Object", + "tags": [], + "label": "deps", + "description": [], + "signature": [ + "React.DependencyList | undefined" + ], + "path": "x-pack/plugins/fields_metadata/public/hooks/use_fields_metadata/use_fields_metadata.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.DatasetName", + "type": "Type", + "tags": [], + "label": "DatasetName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.ExtractedDatasetFields", + "type": "Type", + "tags": [], + "label": "ExtractedDatasetFields", + "description": [], + "signature": [ + "{ [x: string]: { name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }; }" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.ExtractedIntegrationFields", + "type": "Type", + "tags": [], + "label": "ExtractedIntegrationFields", + "description": [], + "signature": [ + "{ [x: string]: ", + { + "pluginId": "fieldsMetadata", + "scope": "server", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-server.ExtractedDatasetFields", + "text": "ExtractedDatasetFields" + }, + "; }" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.IntegrationName", + "type": "Type", + "tags": [], + "label": "IntegrationName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [], + "setup": { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerSetup", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataServerSetup", + "description": [], + "path": "x-pack/plugins/fields_metadata/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerSetup.registerIntegrationFieldsExtractor", + "type": "Function", + "tags": [], + "label": "registerIntegrationFieldsExtractor", + "description": [], + "signature": [ + "(extractor: ", + "IntegrationFieldsExtractor", + ") => void" + ], + "path": "x-pack/plugins/fields_metadata/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerSetup.registerIntegrationFieldsExtractor.$1", + "type": "Function", + "tags": [], + "label": "extractor", + "description": [], + "signature": [ + "(params: ", + "IntegrationFieldsSearchParams", + ") => Promise<", + { + "pluginId": "fieldsMetadata", + "scope": "server", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-server.ExtractedIntegrationFields", + "text": "ExtractedIntegrationFields" + }, + ">" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerSetup.registerIntegrationFieldsExtractor.$1.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "IntegrationFieldsSearchParams" + ], + "path": "x-pack/plugins/fields_metadata/server/services/fields_metadata/repositories/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerStart", + "type": "Interface", + "tags": [], + "label": "FieldsMetadataServerStart", + "description": [], + "path": "x-pack/plugins/fields_metadata/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-server.FieldsMetadataServerStart.getClient", + "type": "Function", + "tags": [], + "label": "getClient", + "description": [], + "signature": [ + "() => ", + "IFieldsMetadataClient" + ], + "path": "x-pack/plugins/fields_metadata/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata", + "type": "Class", + "tags": [], + "label": "FieldMetadata", + "description": [], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata.pick", + "type": "Function", + "tags": [], + "label": "pick", + "description": [], + "signature": [ + "(props: (\"source\" | \"type\" | \"normalize\" | \"short\" | \"format\" | \"name\" | \"index\" | \"pattern\" | \"description\" | \"doc_values\" | \"ignore_above\" | \"beta\" | \"required\" | \"level\" | \"allowed_values\" | \"dashed_name\" | \"example\" | \"expected_values\" | \"flat_name\" | \"input_format\" | \"multi_fields\" | \"object_type\" | \"original_fieldset\" | \"output_format\" | \"output_precision\" | \"scaling_factor\")[]) => { name?: string | undefined; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata.pick.$1", + "type": "Array", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "(\"source\" | \"type\" | \"normalize\" | \"short\" | \"format\" | \"name\" | \"index\" | \"pattern\" | \"description\" | \"doc_values\" | \"ignore_above\" | \"beta\" | \"required\" | \"level\" | \"allowed_values\" | \"dashed_name\" | \"example\" | \"expected_values\" | \"flat_name\" | \"input_format\" | \"multi_fields\" | \"object_type\" | \"original_fieldset\" | \"output_format\" | \"output_precision\" | \"scaling_factor\")[]" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata.toPlain", + "type": "Function", + "tags": [], + "label": "toPlain", + "description": [], + "signature": [ + "() => { name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "(fieldMetadata: { name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }) => ", + { + "pluginId": "fieldsMetadata", + "scope": "common", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-common.FieldMetadata", + "text": "FieldMetadata" + } + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata.create.$1", + "type": "CompoundType", + "tags": [], + "label": "fieldMetadata", + "description": [], + "signature": [ + "{ name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary", + "type": "Class", + "tags": [], + "label": "FieldsMetadataDictionary", + "description": [], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary.pick", + "type": "Function", + "tags": [], + "label": "pick", + "description": [], + "signature": [ + "(attributes: (\"source\" | \"type\" | \"normalize\" | \"short\" | \"format\" | \"name\" | \"index\" | \"pattern\" | \"description\" | \"doc_values\" | \"ignore_above\" | \"beta\" | \"required\" | \"level\" | \"allowed_values\" | \"dashed_name\" | \"example\" | \"expected_values\" | \"flat_name\" | \"input_format\" | \"multi_fields\" | \"object_type\" | \"original_fieldset\" | \"output_format\" | \"output_precision\" | \"scaling_factor\")[]) => Record" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary.pick.$1", + "type": "Array", + "tags": [], + "label": "attributes", + "description": [], + "signature": [ + "(\"source\" | \"type\" | \"normalize\" | \"short\" | \"format\" | \"name\" | \"index\" | \"pattern\" | \"description\" | \"doc_values\" | \"ignore_above\" | \"beta\" | \"required\" | \"level\" | \"allowed_values\" | \"dashed_name\" | \"example\" | \"expected_values\" | \"flat_name\" | \"input_format\" | \"multi_fields\" | \"object_type\" | \"original_fieldset\" | \"output_format\" | \"output_precision\" | \"scaling_factor\")[]" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary.toPlain", + "type": "Function", + "tags": [], + "label": "toPlain", + "description": [], + "signature": [ + "() => Record" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary.create", + "type": "Function", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "(fields: ", + "FieldsMetadataMap", + ") => ", + { + "pluginId": "fieldsMetadata", + "scope": "common", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-common.FieldsMetadataDictionary", + "text": "FieldsMetadataDictionary" + } + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldsMetadataDictionary.create.$1", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + "FieldsMetadataMap" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/fields_metadata_dictionary.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], + "functions": [], + "interfaces": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadata", + "type": "Interface", + "tags": [], + "label": "FieldMetadata", + "description": [], + "signature": [ + { + "pluginId": "fieldsMetadata", + "scope": "common", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-common.FieldMetadata", + "text": "FieldMetadata" + }, + " extends { name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/models/field_metadata.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.EcsFieldName", + "type": "Type", + "tags": [], + "label": "EcsFieldName", + "description": [], + "signature": [ + "\"@timestamp\" | \"event.sequence\" | \"event.start\" | \"event.end\" | \"event.provider\" | \"event.duration\" | \"event.action\" | \"message\" | \"event.outcome\" | \"tags\" | \"event.kind\" | \"agent.name\" | \"container.id\" | \"host.name\" | \"labels\" | \"service.environment\" | \"service.name\" | \"ecs.version\" | \"agent.build.original\" | \"agent.ephemeral_id\" | \"agent.id\" | \"agent.type\" | \"agent.version\" | \"client.address\" | \"client.as.number\" | \"client.as.organization.name\" | \"client.bytes\" | \"client.domain\" | \"client.geo.city_name\" | \"client.geo.continent_code\" | \"client.geo.continent_name\" | \"client.geo.country_iso_code\" | \"client.geo.country_name\" | \"client.geo.location\" | \"client.geo.name\" | \"client.geo.postal_code\" | \"client.geo.region_iso_code\" | \"client.geo.region_name\" | \"client.geo.timezone\" | \"client.ip\" | \"client.mac\" | \"client.nat.ip\" | \"client.nat.port\" | \"client.packets\" | \"client.port\" | \"client.registered_domain\" | \"client.subdomain\" | \"client.top_level_domain\" | \"client.user.domain\" | \"client.user.email\" | \"client.user.full_name\" | \"client.user.group.domain\" | \"client.user.group.id\" | \"client.user.group.name\" | \"client.user.hash\" | \"client.user.id\" | \"client.user.name\" | \"client.user.roles\" | \"cloud.account.id\" | \"cloud.account.name\" | \"cloud.availability_zone\" | \"cloud.instance.id\" | \"cloud.instance.name\" | \"cloud.machine.type\" | \"cloud.origin.account.id\" | \"cloud.origin.account.name\" | \"cloud.origin.availability_zone\" | \"cloud.origin.instance.id\" | \"cloud.origin.instance.name\" | \"cloud.origin.machine.type\" | \"cloud.origin.project.id\" | \"cloud.origin.project.name\" | \"cloud.origin.provider\" | \"cloud.origin.region\" | \"cloud.origin.service.name\" | \"cloud.project.id\" | \"cloud.project.name\" | \"cloud.provider\" | \"cloud.region\" | \"cloud.service.name\" | \"cloud.target.account.id\" | \"cloud.target.account.name\" | \"cloud.target.availability_zone\" | \"cloud.target.instance.id\" | \"cloud.target.instance.name\" | \"cloud.target.machine.type\" | \"cloud.target.project.id\" | \"cloud.target.project.name\" | \"cloud.target.provider\" | \"cloud.target.region\" | \"cloud.target.service.name\" | \"container.cpu.usage\" | \"container.disk.read.bytes\" | \"container.disk.write.bytes\" | \"container.image.hash.all\" | \"container.image.name\" | \"container.image.tag\" | \"container.labels\" | \"container.memory.usage\" | \"container.name\" | \"container.network.egress.bytes\" | \"container.network.ingress.bytes\" | \"container.runtime\" | \"container.security_context.privileged\" | \"destination.address\" | \"destination.as.number\" | \"destination.as.organization.name\" | \"destination.bytes\" | \"destination.domain\" | \"destination.geo.city_name\" | \"destination.geo.continent_code\" | \"destination.geo.continent_name\" | \"destination.geo.country_iso_code\" | \"destination.geo.country_name\" | \"destination.geo.location\" | \"destination.geo.name\" | \"destination.geo.postal_code\" | \"destination.geo.region_iso_code\" | \"destination.geo.region_name\" | \"destination.geo.timezone\" | \"destination.ip\" | \"destination.mac\" | \"destination.nat.ip\" | \"destination.nat.port\" | \"destination.packets\" | \"destination.port\" | \"destination.registered_domain\" | \"destination.subdomain\" | \"destination.top_level_domain\" | \"destination.user.domain\" | \"destination.user.email\" | \"destination.user.full_name\" | \"destination.user.group.domain\" | \"destination.user.group.id\" | \"destination.user.group.name\" | \"destination.user.hash\" | \"destination.user.id\" | \"destination.user.name\" | \"destination.user.roles\" | \"device.id\" | \"device.manufacturer\" | \"device.model.identifier\" | \"device.model.name\" | \"dll.code_signature.digest_algorithm\" | \"dll.code_signature.exists\" | \"dll.code_signature.signing_id\" | \"dll.code_signature.status\" | \"dll.code_signature.subject_name\" | \"dll.code_signature.team_id\" | \"dll.code_signature.timestamp\" | \"dll.code_signature.trusted\" | \"dll.code_signature.valid\" | \"dll.hash.md5\" | \"dll.hash.sha1\" | \"dll.hash.sha256\" | \"dll.hash.sha384\" | \"dll.hash.sha512\" | \"dll.hash.ssdeep\" | \"dll.hash.tlsh\" | \"dll.name\" | \"dll.path\" | \"dll.pe.architecture\" | \"dll.pe.company\" | \"dll.pe.description\" | \"dll.pe.file_version\" | \"dll.pe.go_import_hash\" | \"dll.pe.go_imports\" | \"dll.pe.go_imports_names_entropy\" | \"dll.pe.go_imports_names_var_entropy\" | \"dll.pe.go_stripped\" | \"dll.pe.imphash\" | \"dll.pe.import_hash\" | \"dll.pe.imports\" | \"dll.pe.imports_names_entropy\" | \"dll.pe.imports_names_var_entropy\" | \"dll.pe.original_file_name\" | \"dll.pe.pehash\" | \"dll.pe.product\" | \"dll.pe.sections\" | \"dns.answers\" | \"dns.header_flags\" | \"dns.id\" | \"dns.op_code\" | \"dns.question.class\" | \"dns.question.name\" | \"dns.question.registered_domain\" | \"dns.question.subdomain\" | \"dns.question.top_level_domain\" | \"dns.question.type\" | \"dns.resolved_ip\" | \"dns.response_code\" | \"dns.type\" | \"email.attachments\" | \"file.extension\" | \"file.hash.md5\" | \"file.hash.sha1\" | \"file.hash.sha256\" | \"file.hash.sha384\" | \"file.hash.sha512\" | \"file.hash.ssdeep\" | \"file.hash.tlsh\" | \"file.mime_type\" | \"file.name\" | \"file.size\" | \"email.bcc.address\" | \"email.cc.address\" | \"email.content_type\" | \"email.delivery_timestamp\" | \"email.direction\" | \"email.from.address\" | \"email.local_id\" | \"email.message_id\" | \"email.origination_timestamp\" | \"email.reply_to.address\" | \"email.sender.address\" | \"email.subject\" | \"email.to.address\" | \"email.x_mailer\" | \"error.code\" | \"error.id\" | \"error.message\" | \"error.stack_trace\" | \"error.type\" | \"event.agent_id_status\" | \"event.category\" | \"event.code\" | \"event.created\" | \"event.dataset\" | \"event.hash\" | \"event.id\" | \"event.ingested\" | \"event.module\" | \"event.original\" | \"event.reason\" | \"event.reference\" | \"event.risk_score\" | \"event.risk_score_norm\" | \"event.severity\" | \"event.timezone\" | \"event.type\" | \"event.url\" | \"faas.coldstart\" | \"faas.execution\" | \"faas.id\" | \"faas.name\" | \"faas.version\" | \"file.accessed\" | \"file.attributes\" | \"file.code_signature.digest_algorithm\" | \"file.code_signature.exists\" | \"file.code_signature.signing_id\" | \"file.code_signature.status\" | \"file.code_signature.subject_name\" | \"file.code_signature.team_id\" | \"file.code_signature.timestamp\" | \"file.code_signature.trusted\" | \"file.code_signature.valid\" | \"file.created\" | \"file.ctime\" | \"file.device\" | \"file.directory\" | \"file.drive_letter\" | \"file.elf.architecture\" | \"file.elf.byte_order\" | \"file.elf.cpu_type\" | \"file.elf.creation_date\" | \"file.elf.exports\" | \"file.elf.go_import_hash\" | \"file.elf.go_imports\" | \"file.elf.go_imports_names_entropy\" | \"file.elf.go_imports_names_var_entropy\" | \"file.elf.go_stripped\" | \"file.elf.header.abi_version\" | \"file.elf.header.class\" | \"file.elf.header.data\" | \"file.elf.header.entrypoint\" | \"file.elf.header.object_version\" | \"file.elf.header.os_abi\" | \"file.elf.header.type\" | \"file.elf.header.version\" | \"file.elf.import_hash\" | \"file.elf.imports\" | \"file.elf.imports_names_entropy\" | \"file.elf.imports_names_var_entropy\" | \"file.elf.sections\" | \"file.elf.segments\" | \"file.elf.shared_libraries\" | \"file.elf.telfhash\" | \"file.fork_name\" | \"file.gid\" | \"file.group\" | \"file.inode\" | \"file.macho.go_import_hash\" | \"file.macho.go_imports\" | \"file.macho.go_imports_names_entropy\" | \"file.macho.go_imports_names_var_entropy\" | \"file.macho.go_stripped\" | \"file.macho.import_hash\" | \"file.macho.imports\" | \"file.macho.imports_names_entropy\" | \"file.macho.imports_names_var_entropy\" | \"file.macho.sections\" | \"file.macho.symhash\" | \"file.mode\" | \"file.mtime\" | \"file.owner\" | \"file.path\" | \"file.pe.architecture\" | \"file.pe.company\" | \"file.pe.description\" | \"file.pe.file_version\" | \"file.pe.go_import_hash\" | \"file.pe.go_imports\" | \"file.pe.go_imports_names_entropy\" | \"file.pe.go_imports_names_var_entropy\" | \"file.pe.go_stripped\" | \"file.pe.imphash\" | \"file.pe.import_hash\" | \"file.pe.imports\" | \"file.pe.imports_names_entropy\" | \"file.pe.imports_names_var_entropy\" | \"file.pe.original_file_name\" | \"file.pe.pehash\" | \"file.pe.product\" | \"file.pe.sections\" | \"file.target_path\" | \"file.type\" | \"file.uid\" | \"file.x509.alternative_names\" | \"file.x509.issuer.common_name\" | \"file.x509.issuer.country\" | \"file.x509.issuer.distinguished_name\" | \"file.x509.issuer.locality\" | \"file.x509.issuer.organization\" | \"file.x509.issuer.organizational_unit\" | \"file.x509.issuer.state_or_province\" | \"file.x509.not_after\" | \"file.x509.not_before\" | \"file.x509.public_key_algorithm\" | \"file.x509.public_key_curve\" | \"file.x509.public_key_exponent\" | \"file.x509.public_key_size\" | \"file.x509.serial_number\" | \"file.x509.signature_algorithm\" | \"file.x509.subject.common_name\" | \"file.x509.subject.country\" | \"file.x509.subject.distinguished_name\" | \"file.x509.subject.locality\" | \"file.x509.subject.organization\" | \"file.x509.subject.organizational_unit\" | \"file.x509.subject.state_or_province\" | \"file.x509.version_number\" | \"group.domain\" | \"group.id\" | \"group.name\" | \"host.architecture\" | \"host.boot.id\" | \"host.cpu.usage\" | \"host.disk.read.bytes\" | \"host.disk.write.bytes\" | \"host.domain\" | \"host.geo.city_name\" | \"host.geo.continent_code\" | \"host.geo.continent_name\" | \"host.geo.country_iso_code\" | \"host.geo.country_name\" | \"host.geo.location\" | \"host.geo.name\" | \"host.geo.postal_code\" | \"host.geo.region_iso_code\" | \"host.geo.region_name\" | \"host.geo.timezone\" | \"host.hostname\" | \"host.id\" | \"host.ip\" | \"host.mac\" | \"host.network.egress.bytes\" | \"host.network.egress.packets\" | \"host.network.ingress.bytes\" | \"host.network.ingress.packets\" | \"host.os.family\" | \"host.os.full\" | \"host.os.kernel\" | \"host.os.name\" | \"host.os.platform\" | \"host.os.type\" | \"host.os.version\" | \"host.pid_ns_ino\" | \"host.risk.calculated_level\" | \"host.risk.calculated_score\" | \"host.risk.calculated_score_norm\" | \"host.risk.static_level\" | \"host.risk.static_score\" | \"host.risk.static_score_norm\" | \"host.type\" | \"host.uptime\" | \"http.request.body.bytes\" | \"http.request.body.content\" | \"http.request.bytes\" | \"http.request.id\" | \"http.request.method\" | \"http.request.mime_type\" | \"http.request.referrer\" | \"http.response.body.bytes\" | \"http.response.body.content\" | \"http.response.bytes\" | \"http.response.mime_type\" | \"http.response.status_code\" | \"http.version\" | \"log.file.path\" | \"log.level\" | \"log.logger\" | \"log.origin.file.line\" | \"log.origin.file.name\" | \"log.origin.function\" | \"log.syslog\" | \"network.application\" | \"network.bytes\" | \"network.community_id\" | \"network.direction\" | \"network.forwarded_ip\" | \"network.iana_number\" | \"network.inner\" | \"network.name\" | \"network.packets\" | \"network.protocol\" | \"network.transport\" | \"network.type\" | \"network.vlan.id\" | \"network.vlan.name\" | \"observer.egress\" | \"observer.geo.city_name\" | \"observer.geo.continent_code\" | \"observer.geo.continent_name\" | \"observer.geo.country_iso_code\" | \"observer.geo.country_name\" | \"observer.geo.location\" | \"observer.geo.name\" | \"observer.geo.postal_code\" | \"observer.geo.region_iso_code\" | \"observer.geo.region_name\" | \"observer.geo.timezone\" | \"observer.hostname\" | \"observer.ingress\" | \"observer.ip\" | \"observer.mac\" | \"observer.name\" | \"observer.os.family\" | \"observer.os.full\" | \"observer.os.kernel\" | \"observer.os.name\" | \"observer.os.platform\" | \"observer.os.type\" | \"observer.os.version\" | \"observer.product\" | \"observer.serial_number\" | \"observer.type\" | \"observer.vendor\" | \"observer.version\" | \"orchestrator.api_version\" | \"orchestrator.cluster.id\" | \"orchestrator.cluster.name\" | \"orchestrator.cluster.url\" | \"orchestrator.cluster.version\" | \"orchestrator.namespace\" | \"orchestrator.organization\" | \"orchestrator.resource.annotation\" | \"orchestrator.resource.id\" | \"orchestrator.resource.ip\" | \"orchestrator.resource.label\" | \"orchestrator.resource.name\" | \"orchestrator.resource.parent.type\" | \"orchestrator.resource.type\" | \"orchestrator.type\" | \"organization.id\" | \"organization.name\" | \"package.architecture\" | \"package.build_version\" | \"package.checksum\" | \"package.description\" | \"package.install_scope\" | \"package.installed\" | \"package.license\" | \"package.name\" | \"package.path\" | \"package.reference\" | \"package.size\" | \"package.type\" | \"package.version\" | \"process.args\" | \"process.args_count\" | \"process.code_signature.digest_algorithm\" | \"process.code_signature.exists\" | \"process.code_signature.signing_id\" | \"process.code_signature.status\" | \"process.code_signature.subject_name\" | \"process.code_signature.team_id\" | \"process.code_signature.timestamp\" | \"process.code_signature.trusted\" | \"process.code_signature.valid\" | \"process.command_line\" | \"process.elf.architecture\" | \"process.elf.byte_order\" | \"process.elf.cpu_type\" | \"process.elf.creation_date\" | \"process.elf.exports\" | \"process.elf.go_import_hash\" | \"process.elf.go_imports\" | \"process.elf.go_imports_names_entropy\" | \"process.elf.go_imports_names_var_entropy\" | \"process.elf.go_stripped\" | \"process.elf.header.abi_version\" | \"process.elf.header.class\" | \"process.elf.header.data\" | \"process.elf.header.entrypoint\" | \"process.elf.header.object_version\" | \"process.elf.header.os_abi\" | \"process.elf.header.type\" | \"process.elf.header.version\" | \"process.elf.import_hash\" | \"process.elf.imports\" | \"process.elf.imports_names_entropy\" | \"process.elf.imports_names_var_entropy\" | \"process.elf.sections\" | \"process.elf.segments\" | \"process.elf.shared_libraries\" | \"process.elf.telfhash\" | \"process.end\" | \"process.entity_id\" | \"process.entry_leader.args\" | \"process.entry_leader.args_count\" | \"process.entry_leader.attested_groups.name\" | \"process.entry_leader.attested_user.id\" | \"process.entry_leader.attested_user.name\" | \"process.entry_leader.command_line\" | \"process.entry_leader.entity_id\" | \"process.entry_leader.entry_meta.source.ip\" | \"process.entry_leader.entry_meta.type\" | \"process.entry_leader.executable\" | \"process.entry_leader.group.id\" | \"process.entry_leader.group.name\" | \"process.entry_leader.interactive\" | \"process.entry_leader.name\" | \"process.entry_leader.parent.entity_id\" | \"process.entry_leader.parent.pid\" | \"process.entry_leader.parent.session_leader.entity_id\" | \"process.entry_leader.parent.session_leader.pid\" | \"process.entry_leader.parent.session_leader.start\" | \"process.entry_leader.parent.session_leader.vpid\" | \"process.entry_leader.parent.start\" | \"process.entry_leader.parent.vpid\" | \"process.entry_leader.pid\" | \"process.entry_leader.real_group.id\" | \"process.entry_leader.real_group.name\" | \"process.entry_leader.real_user.id\" | \"process.entry_leader.real_user.name\" | \"process.entry_leader.same_as_process\" | \"process.entry_leader.saved_group.id\" | \"process.entry_leader.saved_group.name\" | \"process.entry_leader.saved_user.id\" | \"process.entry_leader.saved_user.name\" | \"process.entry_leader.start\" | \"process.entry_leader.supplemental_groups.id\" | \"process.entry_leader.supplemental_groups.name\" | \"process.entry_leader.tty\" | \"process.entry_leader.user.id\" | \"process.entry_leader.user.name\" | \"process.entry_leader.vpid\" | \"process.entry_leader.working_directory\" | \"process.env_vars\" | \"process.executable\" | \"process.exit_code\" | \"process.group_leader.args\" | \"process.group_leader.args_count\" | \"process.group_leader.command_line\" | \"process.group_leader.entity_id\" | \"process.group_leader.executable\" | \"process.group_leader.group.id\" | \"process.group_leader.group.name\" | \"process.group_leader.interactive\" | \"process.group_leader.name\" | \"process.group_leader.pid\" | \"process.group_leader.real_group.id\" | \"process.group_leader.real_group.name\" | \"process.group_leader.real_user.id\" | \"process.group_leader.real_user.name\" | \"process.group_leader.same_as_process\" | \"process.group_leader.saved_group.id\" | \"process.group_leader.saved_group.name\" | \"process.group_leader.saved_user.id\" | \"process.group_leader.saved_user.name\" | \"process.group_leader.start\" | \"process.group_leader.supplemental_groups.id\" | \"process.group_leader.supplemental_groups.name\" | \"process.group_leader.tty\" | \"process.group_leader.user.id\" | \"process.group_leader.user.name\" | \"process.group_leader.vpid\" | \"process.group_leader.working_directory\" | \"process.hash.md5\" | \"process.hash.sha1\" | \"process.hash.sha256\" | \"process.hash.sha384\" | \"process.hash.sha512\" | \"process.hash.ssdeep\" | \"process.hash.tlsh\" | \"process.interactive\" | \"process.io\" | \"process.macho.go_import_hash\" | \"process.macho.go_imports\" | \"process.macho.go_imports_names_entropy\" | \"process.macho.go_imports_names_var_entropy\" | \"process.macho.go_stripped\" | \"process.macho.import_hash\" | \"process.macho.imports\" | \"process.macho.imports_names_entropy\" | \"process.macho.imports_names_var_entropy\" | \"process.macho.sections\" | \"process.macho.symhash\" | \"process.name\" | \"process.parent.args\" | \"process.parent.args_count\" | \"process.parent.code_signature.digest_algorithm\" | \"process.parent.code_signature.exists\" | \"process.parent.code_signature.signing_id\" | \"process.parent.code_signature.status\" | \"process.parent.code_signature.subject_name\" | \"process.parent.code_signature.team_id\" | \"process.parent.code_signature.timestamp\" | \"process.parent.code_signature.trusted\" | \"process.parent.code_signature.valid\" | \"process.parent.command_line\" | \"process.parent.elf.architecture\" | \"process.parent.elf.byte_order\" | \"process.parent.elf.cpu_type\" | \"process.parent.elf.creation_date\" | \"process.parent.elf.exports\" | \"process.parent.elf.go_import_hash\" | \"process.parent.elf.go_imports\" | \"process.parent.elf.go_imports_names_entropy\" | \"process.parent.elf.go_imports_names_var_entropy\" | \"process.parent.elf.go_stripped\" | \"process.parent.elf.header.abi_version\" | \"process.parent.elf.header.class\" | \"process.parent.elf.header.data\" | \"process.parent.elf.header.entrypoint\" | \"process.parent.elf.header.object_version\" | \"process.parent.elf.header.os_abi\" | \"process.parent.elf.header.type\" | \"process.parent.elf.header.version\" | \"process.parent.elf.import_hash\" | \"process.parent.elf.imports\" | \"process.parent.elf.imports_names_entropy\" | \"process.parent.elf.imports_names_var_entropy\" | \"process.parent.elf.sections\" | \"process.parent.elf.segments\" | \"process.parent.elf.shared_libraries\" | \"process.parent.elf.telfhash\" | \"process.parent.end\" | \"process.parent.entity_id\" | \"process.parent.executable\" | \"process.parent.exit_code\" | \"process.parent.group.id\" | \"process.parent.group.name\" | \"process.parent.group_leader.entity_id\" | \"process.parent.group_leader.pid\" | \"process.parent.group_leader.start\" | \"process.parent.group_leader.vpid\" | \"process.parent.hash.md5\" | \"process.parent.hash.sha1\" | \"process.parent.hash.sha256\" | \"process.parent.hash.sha384\" | \"process.parent.hash.sha512\" | \"process.parent.hash.ssdeep\" | \"process.parent.hash.tlsh\" | \"process.parent.interactive\" | \"process.parent.macho.go_import_hash\" | \"process.parent.macho.go_imports\" | \"process.parent.macho.go_imports_names_entropy\" | \"process.parent.macho.go_imports_names_var_entropy\" | \"process.parent.macho.go_stripped\" | \"process.parent.macho.import_hash\" | \"process.parent.macho.imports\" | \"process.parent.macho.imports_names_entropy\" | \"process.parent.macho.imports_names_var_entropy\" | \"process.parent.macho.sections\" | \"process.parent.macho.symhash\" | \"process.parent.name\" | \"process.parent.pe.architecture\" | \"process.parent.pe.company\" | \"process.parent.pe.description\" | \"process.parent.pe.file_version\" | \"process.parent.pe.go_import_hash\" | \"process.parent.pe.go_imports\" | \"process.parent.pe.go_imports_names_entropy\" | \"process.parent.pe.go_imports_names_var_entropy\" | \"process.parent.pe.go_stripped\" | \"process.parent.pe.imphash\" | \"process.parent.pe.import_hash\" | \"process.parent.pe.imports\" | \"process.parent.pe.imports_names_entropy\" | \"process.parent.pe.imports_names_var_entropy\" | \"process.parent.pe.original_file_name\" | \"process.parent.pe.pehash\" | \"process.parent.pe.product\" | \"process.parent.pe.sections\" | \"process.parent.pgid\" | \"process.parent.pid\" | \"process.parent.real_group.id\" | \"process.parent.real_group.name\" | \"process.parent.real_user.id\" | \"process.parent.real_user.name\" | \"process.parent.saved_group.id\" | \"process.parent.saved_group.name\" | \"process.parent.saved_user.id\" | \"process.parent.saved_user.name\" | \"process.parent.start\" | \"process.parent.supplemental_groups.id\" | \"process.parent.supplemental_groups.name\" | \"process.parent.thread.capabilities.effective\" | \"process.parent.thread.capabilities.permitted\" | \"process.parent.thread.id\" | \"process.parent.thread.name\" | \"process.parent.title\" | \"process.parent.tty\" | \"process.parent.uptime\" | \"process.parent.user.id\" | \"process.parent.user.name\" | \"process.parent.vpid\" | \"process.parent.working_directory\" | \"process.pe.architecture\" | \"process.pe.company\" | \"process.pe.description\" | \"process.pe.file_version\" | \"process.pe.go_import_hash\" | \"process.pe.go_imports\" | \"process.pe.go_imports_names_entropy\" | \"process.pe.go_imports_names_var_entropy\" | \"process.pe.go_stripped\" | \"process.pe.imphash\" | \"process.pe.import_hash\" | \"process.pe.imports\" | \"process.pe.imports_names_entropy\" | \"process.pe.imports_names_var_entropy\" | \"process.pe.original_file_name\" | \"process.pe.pehash\" | \"process.pe.product\" | \"process.pe.sections\" | \"process.pgid\" | \"process.pid\" | \"process.previous.args\" | \"process.previous.args_count\" | \"process.previous.executable\" | \"process.real_group.id\" | \"process.real_group.name\" | \"process.real_user.id\" | \"process.real_user.name\" | \"process.saved_group.id\" | \"process.saved_group.name\" | \"process.saved_user.id\" | \"process.saved_user.name\" | \"process.session_leader.args\" | \"process.session_leader.args_count\" | \"process.session_leader.command_line\" | \"process.session_leader.entity_id\" | \"process.session_leader.executable\" | \"process.session_leader.group.id\" | \"process.session_leader.group.name\" | \"process.session_leader.interactive\" | \"process.session_leader.name\" | \"process.session_leader.parent.entity_id\" | \"process.session_leader.parent.pid\" | \"process.session_leader.parent.session_leader.entity_id\" | \"process.session_leader.parent.session_leader.pid\" | \"process.session_leader.parent.session_leader.start\" | \"process.session_leader.parent.session_leader.vpid\" | \"process.session_leader.parent.start\" | \"process.session_leader.parent.vpid\" | \"process.session_leader.pid\" | \"process.session_leader.real_group.id\" | \"process.session_leader.real_group.name\" | \"process.session_leader.real_user.id\" | \"process.session_leader.real_user.name\" | \"process.session_leader.same_as_process\" | \"process.session_leader.saved_group.id\" | \"process.session_leader.saved_group.name\" | \"process.session_leader.saved_user.id\" | \"process.session_leader.saved_user.name\" | \"process.session_leader.start\" | \"process.session_leader.supplemental_groups.id\" | \"process.session_leader.supplemental_groups.name\" | \"process.session_leader.tty\" | \"process.session_leader.user.id\" | \"process.session_leader.user.name\" | \"process.session_leader.vpid\" | \"process.session_leader.working_directory\" | \"process.start\" | \"process.supplemental_groups.id\" | \"process.supplemental_groups.name\" | \"process.thread.capabilities.effective\" | \"process.thread.capabilities.permitted\" | \"process.thread.id\" | \"process.thread.name\" | \"process.title\" | \"process.tty\" | \"process.uptime\" | \"process.user.id\" | \"process.user.name\" | \"process.vpid\" | \"process.working_directory\" | \"registry.data.bytes\" | \"registry.data.strings\" | \"registry.data.type\" | \"registry.hive\" | \"registry.key\" | \"registry.path\" | \"registry.value\" | \"related.hash\" | \"related.hosts\" | \"related.ip\" | \"related.user\" | \"rule.author\" | \"rule.category\" | \"rule.description\" | \"rule.id\" | \"rule.license\" | \"rule.name\" | \"rule.reference\" | \"rule.ruleset\" | \"rule.uuid\" | \"rule.version\" | \"server.address\" | \"server.as.number\" | \"server.as.organization.name\" | \"server.bytes\" | \"server.domain\" | \"server.geo.city_name\" | \"server.geo.continent_code\" | \"server.geo.continent_name\" | \"server.geo.country_iso_code\" | \"server.geo.country_name\" | \"server.geo.location\" | \"server.geo.name\" | \"server.geo.postal_code\" | \"server.geo.region_iso_code\" | \"server.geo.region_name\" | \"server.geo.timezone\" | \"server.ip\" | \"server.mac\" | \"server.nat.ip\" | \"server.nat.port\" | \"server.packets\" | \"server.port\" | \"server.registered_domain\" | \"server.subdomain\" | \"server.top_level_domain\" | \"server.user.domain\" | \"server.user.email\" | \"server.user.full_name\" | \"server.user.group.domain\" | \"server.user.group.id\" | \"server.user.group.name\" | \"server.user.hash\" | \"server.user.id\" | \"server.user.name\" | \"server.user.roles\" | \"service.address\" | \"service.ephemeral_id\" | \"service.id\" | \"service.node.name\" | \"service.node.role\" | \"service.node.roles\" | \"service.origin.address\" | \"service.origin.environment\" | \"service.origin.ephemeral_id\" | \"service.origin.id\" | \"service.origin.name\" | \"service.origin.node.name\" | \"service.origin.node.role\" | \"service.origin.node.roles\" | \"service.origin.state\" | \"service.origin.type\" | \"service.origin.version\" | \"service.state\" | \"service.target.address\" | \"service.target.environment\" | \"service.target.ephemeral_id\" | \"service.target.id\" | \"service.target.name\" | \"service.target.node.name\" | \"service.target.node.role\" | \"service.target.node.roles\" | \"service.target.state\" | \"service.target.type\" | \"service.target.version\" | \"service.type\" | \"service.version\" | \"source.address\" | \"source.as.number\" | \"source.as.organization.name\" | \"source.bytes\" | \"source.domain\" | \"source.geo.city_name\" | \"source.geo.continent_code\" | \"source.geo.continent_name\" | \"source.geo.country_iso_code\" | \"source.geo.country_name\" | \"source.geo.location\" | \"source.geo.name\" | \"source.geo.postal_code\" | \"source.geo.region_iso_code\" | \"source.geo.region_name\" | \"source.geo.timezone\" | \"source.ip\" | \"source.mac\" | \"source.nat.ip\" | \"source.nat.port\" | \"source.packets\" | \"source.port\" | \"source.registered_domain\" | \"source.subdomain\" | \"source.top_level_domain\" | \"source.user.domain\" | \"source.user.email\" | \"source.user.full_name\" | \"source.user.group.domain\" | \"source.user.group.id\" | \"source.user.group.name\" | \"source.user.hash\" | \"source.user.id\" | \"source.user.name\" | \"source.user.roles\" | \"span.id\" | \"threat.enrichments\" | \"threat.feed.dashboard_id\" | \"threat.feed.description\" | \"threat.feed.name\" | \"threat.feed.reference\" | \"threat.framework\" | \"threat.group.alias\" | \"threat.group.id\" | \"threat.group.name\" | \"threat.group.reference\" | \"threat.indicator.as.number\" | \"threat.indicator.as.organization.name\" | \"threat.indicator.confidence\" | \"threat.indicator.description\" | \"threat.indicator.email.address\" | \"threat.indicator.file.accessed\" | \"threat.indicator.file.attributes\" | \"threat.indicator.file.code_signature.digest_algorithm\" | \"threat.indicator.file.code_signature.exists\" | \"threat.indicator.file.code_signature.signing_id\" | \"threat.indicator.file.code_signature.status\" | \"threat.indicator.file.code_signature.subject_name\" | \"threat.indicator.file.code_signature.team_id\" | \"threat.indicator.file.code_signature.timestamp\" | \"threat.indicator.file.code_signature.trusted\" | \"threat.indicator.file.code_signature.valid\" | \"threat.indicator.file.created\" | \"threat.indicator.file.ctime\" | \"threat.indicator.file.device\" | \"threat.indicator.file.directory\" | \"threat.indicator.file.drive_letter\" | \"threat.indicator.file.elf.architecture\" | \"threat.indicator.file.elf.byte_order\" | \"threat.indicator.file.elf.cpu_type\" | \"threat.indicator.file.elf.creation_date\" | \"threat.indicator.file.elf.exports\" | \"threat.indicator.file.elf.go_import_hash\" | \"threat.indicator.file.elf.go_imports\" | \"threat.indicator.file.elf.go_imports_names_entropy\" | \"threat.indicator.file.elf.go_imports_names_var_entropy\" | \"threat.indicator.file.elf.go_stripped\" | \"threat.indicator.file.elf.header.abi_version\" | \"threat.indicator.file.elf.header.class\" | \"threat.indicator.file.elf.header.data\" | \"threat.indicator.file.elf.header.entrypoint\" | \"threat.indicator.file.elf.header.object_version\" | \"threat.indicator.file.elf.header.os_abi\" | \"threat.indicator.file.elf.header.type\" | \"threat.indicator.file.elf.header.version\" | \"threat.indicator.file.elf.import_hash\" | \"threat.indicator.file.elf.imports\" | \"threat.indicator.file.elf.imports_names_entropy\" | \"threat.indicator.file.elf.imports_names_var_entropy\" | \"threat.indicator.file.elf.sections\" | \"threat.indicator.file.elf.segments\" | \"threat.indicator.file.elf.shared_libraries\" | \"threat.indicator.file.elf.telfhash\" | \"threat.indicator.file.extension\" | \"threat.indicator.file.fork_name\" | \"threat.indicator.file.gid\" | \"threat.indicator.file.group\" | \"threat.indicator.file.hash.md5\" | \"threat.indicator.file.hash.sha1\" | \"threat.indicator.file.hash.sha256\" | \"threat.indicator.file.hash.sha384\" | \"threat.indicator.file.hash.sha512\" | \"threat.indicator.file.hash.ssdeep\" | \"threat.indicator.file.hash.tlsh\" | \"threat.indicator.file.inode\" | \"threat.indicator.file.mime_type\" | \"threat.indicator.file.mode\" | \"threat.indicator.file.mtime\" | \"threat.indicator.file.name\" | \"threat.indicator.file.owner\" | \"threat.indicator.file.path\" | \"threat.indicator.file.pe.architecture\" | \"threat.indicator.file.pe.company\" | \"threat.indicator.file.pe.description\" | \"threat.indicator.file.pe.file_version\" | \"threat.indicator.file.pe.go_import_hash\" | \"threat.indicator.file.pe.go_imports\" | \"threat.indicator.file.pe.go_imports_names_entropy\" | \"threat.indicator.file.pe.go_imports_names_var_entropy\" | \"threat.indicator.file.pe.go_stripped\" | \"threat.indicator.file.pe.imphash\" | \"threat.indicator.file.pe.import_hash\" | \"threat.indicator.file.pe.imports\" | \"threat.indicator.file.pe.imports_names_entropy\" | \"threat.indicator.file.pe.imports_names_var_entropy\" | \"threat.indicator.file.pe.original_file_name\" | \"threat.indicator.file.pe.pehash\" | \"threat.indicator.file.pe.product\" | \"threat.indicator.file.pe.sections\" | \"threat.indicator.file.size\" | \"threat.indicator.file.target_path\" | \"threat.indicator.file.type\" | \"threat.indicator.file.uid\" | \"threat.indicator.file.x509.alternative_names\" | \"threat.indicator.file.x509.issuer.common_name\" | \"threat.indicator.file.x509.issuer.country\" | \"threat.indicator.file.x509.issuer.distinguished_name\" | \"threat.indicator.file.x509.issuer.locality\" | \"threat.indicator.file.x509.issuer.organization\" | \"threat.indicator.file.x509.issuer.organizational_unit\" | \"threat.indicator.file.x509.issuer.state_or_province\" | \"threat.indicator.file.x509.not_after\" | \"threat.indicator.file.x509.not_before\" | \"threat.indicator.file.x509.public_key_algorithm\" | \"threat.indicator.file.x509.public_key_curve\" | \"threat.indicator.file.x509.public_key_exponent\" | \"threat.indicator.file.x509.public_key_size\" | \"threat.indicator.file.x509.serial_number\" | \"threat.indicator.file.x509.signature_algorithm\" | \"threat.indicator.file.x509.subject.common_name\" | \"threat.indicator.file.x509.subject.country\" | \"threat.indicator.file.x509.subject.distinguished_name\" | \"threat.indicator.file.x509.subject.locality\" | \"threat.indicator.file.x509.subject.organization\" | \"threat.indicator.file.x509.subject.organizational_unit\" | \"threat.indicator.file.x509.subject.state_or_province\" | \"threat.indicator.file.x509.version_number\" | \"threat.indicator.first_seen\" | \"threat.indicator.geo.city_name\" | \"threat.indicator.geo.continent_code\" | \"threat.indicator.geo.continent_name\" | \"threat.indicator.geo.country_iso_code\" | \"threat.indicator.geo.country_name\" | \"threat.indicator.geo.location\" | \"threat.indicator.geo.name\" | \"threat.indicator.geo.postal_code\" | \"threat.indicator.geo.region_iso_code\" | \"threat.indicator.geo.region_name\" | \"threat.indicator.geo.timezone\" | \"threat.indicator.ip\" | \"threat.indicator.last_seen\" | \"threat.indicator.marking.tlp\" | \"threat.indicator.marking.tlp_version\" | \"threat.indicator.modified_at\" | \"threat.indicator.name\" | \"threat.indicator.port\" | \"threat.indicator.provider\" | \"threat.indicator.reference\" | \"threat.indicator.registry.data.bytes\" | \"threat.indicator.registry.data.strings\" | \"threat.indicator.registry.data.type\" | \"threat.indicator.registry.hive\" | \"threat.indicator.registry.key\" | \"threat.indicator.registry.path\" | \"threat.indicator.registry.value\" | \"threat.indicator.scanner_stats\" | \"threat.indicator.sightings\" | \"threat.indicator.type\" | \"threat.indicator.url.domain\" | \"threat.indicator.url.extension\" | \"threat.indicator.url.fragment\" | \"threat.indicator.url.full\" | \"threat.indicator.url.original\" | \"threat.indicator.url.password\" | \"threat.indicator.url.path\" | \"threat.indicator.url.port\" | \"threat.indicator.url.query\" | \"threat.indicator.url.registered_domain\" | \"threat.indicator.url.scheme\" | \"threat.indicator.url.subdomain\" | \"threat.indicator.url.top_level_domain\" | \"threat.indicator.url.username\" | \"threat.indicator.x509.alternative_names\" | \"threat.indicator.x509.issuer.common_name\" | \"threat.indicator.x509.issuer.country\" | \"threat.indicator.x509.issuer.distinguished_name\" | \"threat.indicator.x509.issuer.locality\" | \"threat.indicator.x509.issuer.organization\" | \"threat.indicator.x509.issuer.organizational_unit\" | \"threat.indicator.x509.issuer.state_or_province\" | \"threat.indicator.x509.not_after\" | \"threat.indicator.x509.not_before\" | \"threat.indicator.x509.public_key_algorithm\" | \"threat.indicator.x509.public_key_curve\" | \"threat.indicator.x509.public_key_exponent\" | \"threat.indicator.x509.public_key_size\" | \"threat.indicator.x509.serial_number\" | \"threat.indicator.x509.signature_algorithm\" | \"threat.indicator.x509.subject.common_name\" | \"threat.indicator.x509.subject.country\" | \"threat.indicator.x509.subject.distinguished_name\" | \"threat.indicator.x509.subject.locality\" | \"threat.indicator.x509.subject.organization\" | \"threat.indicator.x509.subject.organizational_unit\" | \"threat.indicator.x509.subject.state_or_province\" | \"threat.indicator.x509.version_number\" | \"threat.software.alias\" | \"threat.software.id\" | \"threat.software.name\" | \"threat.software.platforms\" | \"threat.software.reference\" | \"threat.software.type\" | \"threat.tactic.id\" | \"threat.tactic.name\" | \"threat.tactic.reference\" | \"threat.technique.id\" | \"threat.technique.name\" | \"threat.technique.reference\" | \"threat.technique.subtechnique.id\" | \"threat.technique.subtechnique.name\" | \"threat.technique.subtechnique.reference\" | \"tls.cipher\" | \"tls.client.certificate\" | \"tls.client.certificate_chain\" | \"tls.client.hash.md5\" | \"tls.client.hash.sha1\" | \"tls.client.hash.sha256\" | \"tls.client.issuer\" | \"tls.client.ja3\" | \"tls.client.not_after\" | \"tls.client.not_before\" | \"tls.client.server_name\" | \"tls.client.subject\" | \"tls.client.supported_ciphers\" | \"tls.client.x509.alternative_names\" | \"tls.client.x509.issuer.common_name\" | \"tls.client.x509.issuer.country\" | \"tls.client.x509.issuer.distinguished_name\" | \"tls.client.x509.issuer.locality\" | \"tls.client.x509.issuer.organization\" | \"tls.client.x509.issuer.organizational_unit\" | \"tls.client.x509.issuer.state_or_province\" | \"tls.client.x509.not_after\" | \"tls.client.x509.not_before\" | \"tls.client.x509.public_key_algorithm\" | \"tls.client.x509.public_key_curve\" | \"tls.client.x509.public_key_exponent\" | \"tls.client.x509.public_key_size\" | \"tls.client.x509.serial_number\" | \"tls.client.x509.signature_algorithm\" | \"tls.client.x509.subject.common_name\" | \"tls.client.x509.subject.country\" | \"tls.client.x509.subject.distinguished_name\" | \"tls.client.x509.subject.locality\" | \"tls.client.x509.subject.organization\" | \"tls.client.x509.subject.organizational_unit\" | \"tls.client.x509.subject.state_or_province\" | \"tls.client.x509.version_number\" | \"tls.curve\" | \"tls.established\" | \"tls.next_protocol\" | \"tls.resumed\" | \"tls.server.certificate\" | \"tls.server.certificate_chain\" | \"tls.server.hash.md5\" | \"tls.server.hash.sha1\" | \"tls.server.hash.sha256\" | \"tls.server.issuer\" | \"tls.server.ja3s\" | \"tls.server.not_after\" | \"tls.server.not_before\" | \"tls.server.subject\" | \"tls.server.x509.alternative_names\" | \"tls.server.x509.issuer.common_name\" | \"tls.server.x509.issuer.country\" | \"tls.server.x509.issuer.distinguished_name\" | \"tls.server.x509.issuer.locality\" | \"tls.server.x509.issuer.organization\" | \"tls.server.x509.issuer.organizational_unit\" | \"tls.server.x509.issuer.state_or_province\" | \"tls.server.x509.not_after\" | \"tls.server.x509.not_before\" | \"tls.server.x509.public_key_algorithm\" | \"tls.server.x509.public_key_curve\" | \"tls.server.x509.public_key_exponent\" | \"tls.server.x509.public_key_size\" | \"tls.server.x509.serial_number\" | \"tls.server.x509.signature_algorithm\" | \"tls.server.x509.subject.common_name\" | \"tls.server.x509.subject.country\" | \"tls.server.x509.subject.distinguished_name\" | \"tls.server.x509.subject.locality\" | \"tls.server.x509.subject.organization\" | \"tls.server.x509.subject.organizational_unit\" | \"tls.server.x509.subject.state_or_province\" | \"tls.server.x509.version_number\" | \"tls.version\" | \"tls.version_protocol\" | \"trace.id\" | \"transaction.id\" | \"url.domain\" | \"url.extension\" | \"url.fragment\" | \"url.full\" | \"url.original\" | \"url.password\" | \"url.path\" | \"url.port\" | \"url.query\" | \"url.registered_domain\" | \"url.scheme\" | \"url.subdomain\" | \"url.top_level_domain\" | \"url.username\" | \"user.changes.domain\" | \"user.changes.email\" | \"user.changes.full_name\" | \"user.changes.group.domain\" | \"user.changes.group.id\" | \"user.changes.group.name\" | \"user.changes.hash\" | \"user.changes.id\" | \"user.changes.name\" | \"user.changes.roles\" | \"user.domain\" | \"user.effective.domain\" | \"user.effective.email\" | \"user.effective.full_name\" | \"user.effective.group.domain\" | \"user.effective.group.id\" | \"user.effective.group.name\" | \"user.effective.hash\" | \"user.effective.id\" | \"user.effective.name\" | \"user.effective.roles\" | \"user.email\" | \"user.full_name\" | \"user.group.domain\" | \"user.group.id\" | \"user.group.name\" | \"user.hash\" | \"user.id\" | \"user.name\" | \"user.risk.calculated_level\" | \"user.risk.calculated_score\" | \"user.risk.calculated_score_norm\" | \"user.risk.static_level\" | \"user.risk.static_score\" | \"user.risk.static_score_norm\" | \"user.roles\" | \"user.target.domain\" | \"user.target.email\" | \"user.target.full_name\" | \"user.target.group.domain\" | \"user.target.group.id\" | \"user.target.group.name\" | \"user.target.hash\" | \"user.target.id\" | \"user.target.name\" | \"user.target.roles\" | \"user_agent.device.name\" | \"user_agent.name\" | \"user_agent.original\" | \"user_agent.os.family\" | \"user_agent.os.full\" | \"user_agent.os.kernel\" | \"user_agent.os.name\" | \"user_agent.os.platform\" | \"user_agent.os.type\" | \"user_agent.os.version\" | \"user_agent.version\" | \"vulnerability.category\" | \"vulnerability.classification\" | \"vulnerability.description\" | \"vulnerability.enumeration\" | \"vulnerability.id\" | \"vulnerability.reference\" | \"vulnerability.report_id\" | \"vulnerability.scanner.vendor\" | \"vulnerability.score.base\" | \"vulnerability.score.environmental\" | \"vulnerability.score.temporal\" | \"vulnerability.score.version\" | \"vulnerability.severity\" | \"data_stream.dataset\" | \"data_stream.namespace\" | \"data_stream.type\" | \"dll.pe.sections.entropy\" | \"dll.pe.sections.name\" | \"dll.pe.sections.physical_size\" | \"dll.pe.sections.var_entropy\" | \"dll.pe.sections.virtual_size\" | \"dns.answers.class\" | \"dns.answers.data\" | \"dns.answers.name\" | \"dns.answers.ttl\" | \"dns.answers.type\" | \"email.attachments.file.extension\" | \"email.attachments.file.hash.md5\" | \"email.attachments.file.hash.sha1\" | \"email.attachments.file.hash.sha256\" | \"email.attachments.file.hash.sha384\" | \"email.attachments.file.hash.sha512\" | \"email.attachments.file.hash.ssdeep\" | \"email.attachments.file.hash.tlsh\" | \"email.attachments.file.mime_type\" | \"email.attachments.file.name\" | \"email.attachments.file.size\" | \"faas.trigger.request_id\" | \"faas.trigger.type\" | \"file.elf.sections.chi2\" | \"file.elf.sections.entropy\" | \"file.elf.sections.flags\" | \"file.elf.sections.name\" | \"file.elf.sections.physical_offset\" | \"file.elf.sections.physical_size\" | \"file.elf.sections.type\" | \"file.elf.sections.var_entropy\" | \"file.elf.sections.virtual_address\" | \"file.elf.sections.virtual_size\" | \"file.elf.segments.sections\" | \"file.elf.segments.type\" | \"file.macho.sections.entropy\" | \"file.macho.sections.name\" | \"file.macho.sections.physical_size\" | \"file.macho.sections.var_entropy\" | \"file.macho.sections.virtual_size\" | \"file.pe.sections.entropy\" | \"file.pe.sections.name\" | \"file.pe.sections.physical_size\" | \"file.pe.sections.var_entropy\" | \"file.pe.sections.virtual_size\" | \"log.syslog.appname\" | \"log.syslog.facility.code\" | \"log.syslog.facility.name\" | \"log.syslog.hostname\" | \"log.syslog.msgid\" | \"log.syslog.priority\" | \"log.syslog.procid\" | \"log.syslog.severity.code\" | \"log.syslog.severity.name\" | \"log.syslog.structured_data\" | \"log.syslog.version\" | \"network.inner.vlan.id\" | \"network.inner.vlan.name\" | \"observer.egress.interface.alias\" | \"observer.egress.interface.id\" | \"observer.egress.interface.name\" | \"observer.egress.vlan.id\" | \"observer.egress.vlan.name\" | \"observer.egress.zone\" | \"observer.ingress.interface.alias\" | \"observer.ingress.interface.id\" | \"observer.ingress.interface.name\" | \"observer.ingress.vlan.id\" | \"observer.ingress.vlan.name\" | \"observer.ingress.zone\" | \"process.elf.sections.chi2\" | \"process.elf.sections.entropy\" | \"process.elf.sections.flags\" | \"process.elf.sections.name\" | \"process.elf.sections.physical_offset\" | \"process.elf.sections.physical_size\" | \"process.elf.sections.type\" | \"process.elf.sections.var_entropy\" | \"process.elf.sections.virtual_address\" | \"process.elf.sections.virtual_size\" | \"process.elf.segments.sections\" | \"process.elf.segments.type\" | \"process.entry_leader.tty.char_device.major\" | \"process.entry_leader.tty.char_device.minor\" | \"process.group_leader.tty.char_device.major\" | \"process.group_leader.tty.char_device.minor\" | \"process.io.bytes_skipped\" | \"process.io.bytes_skipped.length\" | \"process.io.bytes_skipped.offset\" | \"process.io.max_bytes_per_process_exceeded\" | \"process.io.text\" | \"process.io.total_bytes_captured\" | \"process.io.total_bytes_skipped\" | \"process.io.type\" | \"process.macho.sections.entropy\" | \"process.macho.sections.name\" | \"process.macho.sections.physical_size\" | \"process.macho.sections.var_entropy\" | \"process.macho.sections.virtual_size\" | \"process.parent.elf.sections.chi2\" | \"process.parent.elf.sections.entropy\" | \"process.parent.elf.sections.flags\" | \"process.parent.elf.sections.name\" | \"process.parent.elf.sections.physical_offset\" | \"process.parent.elf.sections.physical_size\" | \"process.parent.elf.sections.type\" | \"process.parent.elf.sections.var_entropy\" | \"process.parent.elf.sections.virtual_address\" | \"process.parent.elf.sections.virtual_size\" | \"process.parent.elf.segments.sections\" | \"process.parent.elf.segments.type\" | \"process.parent.macho.sections.entropy\" | \"process.parent.macho.sections.name\" | \"process.parent.macho.sections.physical_size\" | \"process.parent.macho.sections.var_entropy\" | \"process.parent.macho.sections.virtual_size\" | \"process.parent.pe.sections.entropy\" | \"process.parent.pe.sections.name\" | \"process.parent.pe.sections.physical_size\" | \"process.parent.pe.sections.var_entropy\" | \"process.parent.pe.sections.virtual_size\" | \"process.parent.tty.char_device.major\" | \"process.parent.tty.char_device.minor\" | \"process.pe.sections.entropy\" | \"process.pe.sections.name\" | \"process.pe.sections.physical_size\" | \"process.pe.sections.var_entropy\" | \"process.pe.sections.virtual_size\" | \"process.session_leader.tty.char_device.major\" | \"process.session_leader.tty.char_device.minor\" | \"process.tty.char_device.major\" | \"process.tty.char_device.minor\" | \"process.tty.columns\" | \"process.tty.rows\" | \"threat.enrichments.indicator\" | \"threat.enrichments.indicator.as.number\" | \"threat.enrichments.indicator.as.organization.name\" | \"threat.enrichments.indicator.confidence\" | \"threat.enrichments.indicator.description\" | \"threat.enrichments.indicator.email.address\" | \"threat.enrichments.indicator.file.accessed\" | \"threat.enrichments.indicator.file.attributes\" | \"threat.enrichments.indicator.file.code_signature.digest_algorithm\" | \"threat.enrichments.indicator.file.code_signature.exists\" | \"threat.enrichments.indicator.file.code_signature.signing_id\" | \"threat.enrichments.indicator.file.code_signature.status\" | \"threat.enrichments.indicator.file.code_signature.subject_name\" | \"threat.enrichments.indicator.file.code_signature.team_id\" | \"threat.enrichments.indicator.file.code_signature.timestamp\" | \"threat.enrichments.indicator.file.code_signature.trusted\" | \"threat.enrichments.indicator.file.code_signature.valid\" | \"threat.enrichments.indicator.file.created\" | \"threat.enrichments.indicator.file.ctime\" | \"threat.enrichments.indicator.file.device\" | \"threat.enrichments.indicator.file.directory\" | \"threat.enrichments.indicator.file.drive_letter\" | \"threat.enrichments.indicator.file.elf.architecture\" | \"threat.enrichments.indicator.file.elf.byte_order\" | \"threat.enrichments.indicator.file.elf.cpu_type\" | \"threat.enrichments.indicator.file.elf.creation_date\" | \"threat.enrichments.indicator.file.elf.exports\" | \"threat.enrichments.indicator.file.elf.go_import_hash\" | \"threat.enrichments.indicator.file.elf.go_imports\" | \"threat.enrichments.indicator.file.elf.go_imports_names_entropy\" | \"threat.enrichments.indicator.file.elf.go_imports_names_var_entropy\" | \"threat.enrichments.indicator.file.elf.go_stripped\" | \"threat.enrichments.indicator.file.elf.header.abi_version\" | \"threat.enrichments.indicator.file.elf.header.class\" | \"threat.enrichments.indicator.file.elf.header.data\" | \"threat.enrichments.indicator.file.elf.header.entrypoint\" | \"threat.enrichments.indicator.file.elf.header.object_version\" | \"threat.enrichments.indicator.file.elf.header.os_abi\" | \"threat.enrichments.indicator.file.elf.header.type\" | \"threat.enrichments.indicator.file.elf.header.version\" | \"threat.enrichments.indicator.file.elf.import_hash\" | \"threat.enrichments.indicator.file.elf.imports\" | \"threat.enrichments.indicator.file.elf.imports_names_entropy\" | \"threat.enrichments.indicator.file.elf.imports_names_var_entropy\" | \"threat.enrichments.indicator.file.elf.sections\" | \"threat.enrichments.indicator.file.elf.sections.chi2\" | \"threat.enrichments.indicator.file.elf.sections.entropy\" | \"threat.enrichments.indicator.file.elf.sections.flags\" | \"threat.enrichments.indicator.file.elf.sections.name\" | \"threat.enrichments.indicator.file.elf.sections.physical_offset\" | \"threat.enrichments.indicator.file.elf.sections.physical_size\" | \"threat.enrichments.indicator.file.elf.sections.type\" | \"threat.enrichments.indicator.file.elf.sections.var_entropy\" | \"threat.enrichments.indicator.file.elf.sections.virtual_address\" | \"threat.enrichments.indicator.file.elf.sections.virtual_size\" | \"threat.enrichments.indicator.file.elf.segments\" | \"threat.enrichments.indicator.file.elf.segments.sections\" | \"threat.enrichments.indicator.file.elf.segments.type\" | \"threat.enrichments.indicator.file.elf.shared_libraries\" | \"threat.enrichments.indicator.file.elf.telfhash\" | \"threat.enrichments.indicator.file.extension\" | \"threat.enrichments.indicator.file.fork_name\" | \"threat.enrichments.indicator.file.gid\" | \"threat.enrichments.indicator.file.group\" | \"threat.enrichments.indicator.file.hash.md5\" | \"threat.enrichments.indicator.file.hash.sha1\" | \"threat.enrichments.indicator.file.hash.sha256\" | \"threat.enrichments.indicator.file.hash.sha384\" | \"threat.enrichments.indicator.file.hash.sha512\" | \"threat.enrichments.indicator.file.hash.ssdeep\" | \"threat.enrichments.indicator.file.hash.tlsh\" | \"threat.enrichments.indicator.file.inode\" | \"threat.enrichments.indicator.file.mime_type\" | \"threat.enrichments.indicator.file.mode\" | \"threat.enrichments.indicator.file.mtime\" | \"threat.enrichments.indicator.file.name\" | \"threat.enrichments.indicator.file.owner\" | \"threat.enrichments.indicator.file.path\" | \"threat.enrichments.indicator.file.pe.architecture\" | \"threat.enrichments.indicator.file.pe.company\" | \"threat.enrichments.indicator.file.pe.description\" | \"threat.enrichments.indicator.file.pe.file_version\" | \"threat.enrichments.indicator.file.pe.go_import_hash\" | \"threat.enrichments.indicator.file.pe.go_imports\" | \"threat.enrichments.indicator.file.pe.go_imports_names_entropy\" | \"threat.enrichments.indicator.file.pe.go_imports_names_var_entropy\" | \"threat.enrichments.indicator.file.pe.go_stripped\" | \"threat.enrichments.indicator.file.pe.imphash\" | \"threat.enrichments.indicator.file.pe.import_hash\" | \"threat.enrichments.indicator.file.pe.imports\" | \"threat.enrichments.indicator.file.pe.imports_names_entropy\" | \"threat.enrichments.indicator.file.pe.imports_names_var_entropy\" | \"threat.enrichments.indicator.file.pe.original_file_name\" | \"threat.enrichments.indicator.file.pe.pehash\" | \"threat.enrichments.indicator.file.pe.product\" | \"threat.enrichments.indicator.file.pe.sections\" | \"threat.enrichments.indicator.file.pe.sections.entropy\" | \"threat.enrichments.indicator.file.pe.sections.name\" | \"threat.enrichments.indicator.file.pe.sections.physical_size\" | \"threat.enrichments.indicator.file.pe.sections.var_entropy\" | \"threat.enrichments.indicator.file.pe.sections.virtual_size\" | \"threat.enrichments.indicator.file.size\" | \"threat.enrichments.indicator.file.target_path\" | \"threat.enrichments.indicator.file.type\" | \"threat.enrichments.indicator.file.uid\" | \"threat.enrichments.indicator.file.x509.alternative_names\" | \"threat.enrichments.indicator.file.x509.issuer.common_name\" | \"threat.enrichments.indicator.file.x509.issuer.country\" | \"threat.enrichments.indicator.file.x509.issuer.distinguished_name\" | \"threat.enrichments.indicator.file.x509.issuer.locality\" | \"threat.enrichments.indicator.file.x509.issuer.organization\" | \"threat.enrichments.indicator.file.x509.issuer.organizational_unit\" | \"threat.enrichments.indicator.file.x509.issuer.state_or_province\" | \"threat.enrichments.indicator.file.x509.not_after\" | \"threat.enrichments.indicator.file.x509.not_before\" | \"threat.enrichments.indicator.file.x509.public_key_algorithm\" | \"threat.enrichments.indicator.file.x509.public_key_curve\" | \"threat.enrichments.indicator.file.x509.public_key_exponent\" | \"threat.enrichments.indicator.file.x509.public_key_size\" | \"threat.enrichments.indicator.file.x509.serial_number\" | \"threat.enrichments.indicator.file.x509.signature_algorithm\" | \"threat.enrichments.indicator.file.x509.subject.common_name\" | \"threat.enrichments.indicator.file.x509.subject.country\" | \"threat.enrichments.indicator.file.x509.subject.distinguished_name\" | \"threat.enrichments.indicator.file.x509.subject.locality\" | \"threat.enrichments.indicator.file.x509.subject.organization\" | \"threat.enrichments.indicator.file.x509.subject.organizational_unit\" | \"threat.enrichments.indicator.file.x509.subject.state_or_province\" | \"threat.enrichments.indicator.file.x509.version_number\" | \"threat.enrichments.indicator.first_seen\" | \"threat.enrichments.indicator.geo.city_name\" | \"threat.enrichments.indicator.geo.continent_code\" | \"threat.enrichments.indicator.geo.continent_name\" | \"threat.enrichments.indicator.geo.country_iso_code\" | \"threat.enrichments.indicator.geo.country_name\" | \"threat.enrichments.indicator.geo.location\" | \"threat.enrichments.indicator.geo.name\" | \"threat.enrichments.indicator.geo.postal_code\" | \"threat.enrichments.indicator.geo.region_iso_code\" | \"threat.enrichments.indicator.geo.region_name\" | \"threat.enrichments.indicator.geo.timezone\" | \"threat.enrichments.indicator.ip\" | \"threat.enrichments.indicator.last_seen\" | \"threat.enrichments.indicator.marking.tlp\" | \"threat.enrichments.indicator.marking.tlp_version\" | \"threat.enrichments.indicator.modified_at\" | \"threat.enrichments.indicator.name\" | \"threat.enrichments.indicator.port\" | \"threat.enrichments.indicator.provider\" | \"threat.enrichments.indicator.reference\" | \"threat.enrichments.indicator.registry.data.bytes\" | \"threat.enrichments.indicator.registry.data.strings\" | \"threat.enrichments.indicator.registry.data.type\" | \"threat.enrichments.indicator.registry.hive\" | \"threat.enrichments.indicator.registry.key\" | \"threat.enrichments.indicator.registry.path\" | \"threat.enrichments.indicator.registry.value\" | \"threat.enrichments.indicator.scanner_stats\" | \"threat.enrichments.indicator.sightings\" | \"threat.enrichments.indicator.type\" | \"threat.enrichments.indicator.url.domain\" | \"threat.enrichments.indicator.url.extension\" | \"threat.enrichments.indicator.url.fragment\" | \"threat.enrichments.indicator.url.full\" | \"threat.enrichments.indicator.url.original\" | \"threat.enrichments.indicator.url.password\" | \"threat.enrichments.indicator.url.path\" | \"threat.enrichments.indicator.url.port\" | \"threat.enrichments.indicator.url.query\" | \"threat.enrichments.indicator.url.registered_domain\" | \"threat.enrichments.indicator.url.scheme\" | \"threat.enrichments.indicator.url.subdomain\" | \"threat.enrichments.indicator.url.top_level_domain\" | \"threat.enrichments.indicator.url.username\" | \"threat.enrichments.indicator.x509.alternative_names\" | \"threat.enrichments.indicator.x509.issuer.common_name\" | \"threat.enrichments.indicator.x509.issuer.country\" | \"threat.enrichments.indicator.x509.issuer.distinguished_name\" | \"threat.enrichments.indicator.x509.issuer.locality\" | \"threat.enrichments.indicator.x509.issuer.organization\" | \"threat.enrichments.indicator.x509.issuer.organizational_unit\" | \"threat.enrichments.indicator.x509.issuer.state_or_province\" | \"threat.enrichments.indicator.x509.not_after\" | \"threat.enrichments.indicator.x509.not_before\" | \"threat.enrichments.indicator.x509.public_key_algorithm\" | \"threat.enrichments.indicator.x509.public_key_curve\" | \"threat.enrichments.indicator.x509.public_key_exponent\" | \"threat.enrichments.indicator.x509.public_key_size\" | \"threat.enrichments.indicator.x509.serial_number\" | \"threat.enrichments.indicator.x509.signature_algorithm\" | \"threat.enrichments.indicator.x509.subject.common_name\" | \"threat.enrichments.indicator.x509.subject.country\" | \"threat.enrichments.indicator.x509.subject.distinguished_name\" | \"threat.enrichments.indicator.x509.subject.locality\" | \"threat.enrichments.indicator.x509.subject.organization\" | \"threat.enrichments.indicator.x509.subject.organizational_unit\" | \"threat.enrichments.indicator.x509.subject.state_or_province\" | \"threat.enrichments.indicator.x509.version_number\" | \"threat.enrichments.matched.atomic\" | \"threat.enrichments.matched.field\" | \"threat.enrichments.matched.id\" | \"threat.enrichments.matched.index\" | \"threat.enrichments.matched.occurred\" | \"threat.enrichments.matched.type\" | \"threat.indicator.file.elf.sections.chi2\" | \"threat.indicator.file.elf.sections.entropy\" | \"threat.indicator.file.elf.sections.flags\" | \"threat.indicator.file.elf.sections.name\" | \"threat.indicator.file.elf.sections.physical_offset\" | \"threat.indicator.file.elf.sections.physical_size\" | \"threat.indicator.file.elf.sections.type\" | \"threat.indicator.file.elf.sections.var_entropy\" | \"threat.indicator.file.elf.sections.virtual_address\" | \"threat.indicator.file.elf.sections.virtual_size\" | \"threat.indicator.file.elf.segments.sections\" | \"threat.indicator.file.elf.segments.type\" | \"threat.indicator.file.pe.sections.entropy\" | \"threat.indicator.file.pe.sections.name\" | \"threat.indicator.file.pe.sections.physical_size\" | \"threat.indicator.file.pe.sections.var_entropy\" | \"threat.indicator.file.pe.sections.virtual_size\"" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldAttribute", + "type": "Type", + "tags": [], + "label": "FieldAttribute", + "description": [], + "signature": [ + "\"source\" | \"type\" | \"normalize\" | \"short\" | \"format\" | \"name\" | \"index\" | \"pattern\" | \"description\" | \"doc_values\" | \"ignore_above\" | \"beta\" | \"required\" | \"level\" | \"allowed_values\" | \"dashed_name\" | \"example\" | \"expected_values\" | \"flat_name\" | \"input_format\" | \"multi_fields\" | \"object_type\" | \"original_fieldset\" | \"output_format\" | \"output_precision\" | \"scaling_factor\"" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldMetadataPlain", + "type": "Type", + "tags": [], + "label": "FieldMetadataPlain", + "description": [], + "signature": [ + "{ name: string; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.FieldName", + "type": "Type", + "tags": [], + "label": "FieldName", + "description": [], + "signature": [ + "\"@timestamp\" | \"event.sequence\" | \"event.start\" | \"event.end\" | \"event.provider\" | \"event.duration\" | \"event.action\" | \"message\" | \"event.outcome\" | \"tags\" | \"event.kind\" | \"agent.name\" | \"container.id\" | \"host.name\" | \"labels\" | \"service.environment\" | \"service.name\" | \"ecs.version\" | \"agent.build.original\" | \"agent.ephemeral_id\" | \"agent.id\" | \"agent.type\" | \"agent.version\" | \"client.address\" | \"client.as.number\" | \"client.as.organization.name\" | \"client.bytes\" | \"client.domain\" | \"client.geo.city_name\" | \"client.geo.continent_code\" | \"client.geo.continent_name\" | \"client.geo.country_iso_code\" | \"client.geo.country_name\" | \"client.geo.location\" | \"client.geo.name\" | \"client.geo.postal_code\" | \"client.geo.region_iso_code\" | \"client.geo.region_name\" | \"client.geo.timezone\" | \"client.ip\" | \"client.mac\" | \"client.nat.ip\" | \"client.nat.port\" | \"client.packets\" | \"client.port\" | \"client.registered_domain\" | \"client.subdomain\" | \"client.top_level_domain\" | \"client.user.domain\" | \"client.user.email\" | \"client.user.full_name\" | \"client.user.group.domain\" | \"client.user.group.id\" | \"client.user.group.name\" | \"client.user.hash\" | \"client.user.id\" | \"client.user.name\" | \"client.user.roles\" | \"cloud.account.id\" | \"cloud.account.name\" | \"cloud.availability_zone\" | \"cloud.instance.id\" | \"cloud.instance.name\" | \"cloud.machine.type\" | \"cloud.origin.account.id\" | \"cloud.origin.account.name\" | \"cloud.origin.availability_zone\" | \"cloud.origin.instance.id\" | \"cloud.origin.instance.name\" | \"cloud.origin.machine.type\" | \"cloud.origin.project.id\" | \"cloud.origin.project.name\" | \"cloud.origin.provider\" | \"cloud.origin.region\" | \"cloud.origin.service.name\" | \"cloud.project.id\" | \"cloud.project.name\" | \"cloud.provider\" | \"cloud.region\" | \"cloud.service.name\" | \"cloud.target.account.id\" | \"cloud.target.account.name\" | \"cloud.target.availability_zone\" | \"cloud.target.instance.id\" | \"cloud.target.instance.name\" | \"cloud.target.machine.type\" | \"cloud.target.project.id\" | \"cloud.target.project.name\" | \"cloud.target.provider\" | \"cloud.target.region\" | \"cloud.target.service.name\" | \"container.cpu.usage\" | \"container.disk.read.bytes\" | \"container.disk.write.bytes\" | \"container.image.hash.all\" | \"container.image.name\" | \"container.image.tag\" | \"container.labels\" | \"container.memory.usage\" | \"container.name\" | \"container.network.egress.bytes\" | \"container.network.ingress.bytes\" | \"container.runtime\" | \"container.security_context.privileged\" | \"destination.address\" | \"destination.as.number\" | \"destination.as.organization.name\" | \"destination.bytes\" | \"destination.domain\" | \"destination.geo.city_name\" | \"destination.geo.continent_code\" | \"destination.geo.continent_name\" | \"destination.geo.country_iso_code\" | \"destination.geo.country_name\" | \"destination.geo.location\" | \"destination.geo.name\" | \"destination.geo.postal_code\" | \"destination.geo.region_iso_code\" | \"destination.geo.region_name\" | \"destination.geo.timezone\" | \"destination.ip\" | \"destination.mac\" | \"destination.nat.ip\" | \"destination.nat.port\" | \"destination.packets\" | \"destination.port\" | \"destination.registered_domain\" | \"destination.subdomain\" | \"destination.top_level_domain\" | \"destination.user.domain\" | \"destination.user.email\" | \"destination.user.full_name\" | \"destination.user.group.domain\" | \"destination.user.group.id\" | \"destination.user.group.name\" | \"destination.user.hash\" | \"destination.user.id\" | \"destination.user.name\" | \"destination.user.roles\" | \"device.id\" | \"device.manufacturer\" | \"device.model.identifier\" | \"device.model.name\" | \"dll.code_signature.digest_algorithm\" | \"dll.code_signature.exists\" | \"dll.code_signature.signing_id\" | \"dll.code_signature.status\" | \"dll.code_signature.subject_name\" | \"dll.code_signature.team_id\" | \"dll.code_signature.timestamp\" | \"dll.code_signature.trusted\" | \"dll.code_signature.valid\" | \"dll.hash.md5\" | \"dll.hash.sha1\" | \"dll.hash.sha256\" | \"dll.hash.sha384\" | \"dll.hash.sha512\" | \"dll.hash.ssdeep\" | \"dll.hash.tlsh\" | \"dll.name\" | \"dll.path\" | \"dll.pe.architecture\" | \"dll.pe.company\" | \"dll.pe.description\" | \"dll.pe.file_version\" | \"dll.pe.go_import_hash\" | \"dll.pe.go_imports\" | \"dll.pe.go_imports_names_entropy\" | \"dll.pe.go_imports_names_var_entropy\" | \"dll.pe.go_stripped\" | \"dll.pe.imphash\" | \"dll.pe.import_hash\" | \"dll.pe.imports\" | \"dll.pe.imports_names_entropy\" | \"dll.pe.imports_names_var_entropy\" | \"dll.pe.original_file_name\" | \"dll.pe.pehash\" | \"dll.pe.product\" | \"dll.pe.sections\" | \"dns.answers\" | \"dns.header_flags\" | \"dns.id\" | \"dns.op_code\" | \"dns.question.class\" | \"dns.question.name\" | \"dns.question.registered_domain\" | \"dns.question.subdomain\" | \"dns.question.top_level_domain\" | \"dns.question.type\" | \"dns.resolved_ip\" | \"dns.response_code\" | \"dns.type\" | \"email.attachments\" | \"file.extension\" | \"file.hash.md5\" | \"file.hash.sha1\" | \"file.hash.sha256\" | \"file.hash.sha384\" | \"file.hash.sha512\" | \"file.hash.ssdeep\" | \"file.hash.tlsh\" | \"file.mime_type\" | \"file.name\" | \"file.size\" | \"email.bcc.address\" | \"email.cc.address\" | \"email.content_type\" | \"email.delivery_timestamp\" | \"email.direction\" | \"email.from.address\" | \"email.local_id\" | \"email.message_id\" | \"email.origination_timestamp\" | \"email.reply_to.address\" | \"email.sender.address\" | \"email.subject\" | \"email.to.address\" | \"email.x_mailer\" | \"error.code\" | \"error.id\" | \"error.message\" | \"error.stack_trace\" | \"error.type\" | \"event.agent_id_status\" | \"event.category\" | \"event.code\" | \"event.created\" | \"event.dataset\" | \"event.hash\" | \"event.id\" | \"event.ingested\" | \"event.module\" | \"event.original\" | \"event.reason\" | \"event.reference\" | \"event.risk_score\" | \"event.risk_score_norm\" | \"event.severity\" | \"event.timezone\" | \"event.type\" | \"event.url\" | \"faas.coldstart\" | \"faas.execution\" | \"faas.id\" | \"faas.name\" | \"faas.version\" | \"file.accessed\" | \"file.attributes\" | \"file.code_signature.digest_algorithm\" | \"file.code_signature.exists\" | \"file.code_signature.signing_id\" | \"file.code_signature.status\" | \"file.code_signature.subject_name\" | \"file.code_signature.team_id\" | \"file.code_signature.timestamp\" | \"file.code_signature.trusted\" | \"file.code_signature.valid\" | \"file.created\" | \"file.ctime\" | \"file.device\" | \"file.directory\" | \"file.drive_letter\" | \"file.elf.architecture\" | \"file.elf.byte_order\" | \"file.elf.cpu_type\" | \"file.elf.creation_date\" | \"file.elf.exports\" | \"file.elf.go_import_hash\" | \"file.elf.go_imports\" | \"file.elf.go_imports_names_entropy\" | \"file.elf.go_imports_names_var_entropy\" | \"file.elf.go_stripped\" | \"file.elf.header.abi_version\" | \"file.elf.header.class\" | \"file.elf.header.data\" | \"file.elf.header.entrypoint\" | \"file.elf.header.object_version\" | \"file.elf.header.os_abi\" | \"file.elf.header.type\" | \"file.elf.header.version\" | \"file.elf.import_hash\" | \"file.elf.imports\" | \"file.elf.imports_names_entropy\" | \"file.elf.imports_names_var_entropy\" | \"file.elf.sections\" | \"file.elf.segments\" | \"file.elf.shared_libraries\" | \"file.elf.telfhash\" | \"file.fork_name\" | \"file.gid\" | \"file.group\" | \"file.inode\" | \"file.macho.go_import_hash\" | \"file.macho.go_imports\" | \"file.macho.go_imports_names_entropy\" | \"file.macho.go_imports_names_var_entropy\" | \"file.macho.go_stripped\" | \"file.macho.import_hash\" | \"file.macho.imports\" | \"file.macho.imports_names_entropy\" | \"file.macho.imports_names_var_entropy\" | \"file.macho.sections\" | \"file.macho.symhash\" | \"file.mode\" | \"file.mtime\" | \"file.owner\" | \"file.path\" | \"file.pe.architecture\" | \"file.pe.company\" | \"file.pe.description\" | \"file.pe.file_version\" | \"file.pe.go_import_hash\" | \"file.pe.go_imports\" | \"file.pe.go_imports_names_entropy\" | \"file.pe.go_imports_names_var_entropy\" | \"file.pe.go_stripped\" | \"file.pe.imphash\" | \"file.pe.import_hash\" | \"file.pe.imports\" | \"file.pe.imports_names_entropy\" | \"file.pe.imports_names_var_entropy\" | \"file.pe.original_file_name\" | \"file.pe.pehash\" | \"file.pe.product\" | \"file.pe.sections\" | \"file.target_path\" | \"file.type\" | \"file.uid\" | \"file.x509.alternative_names\" | \"file.x509.issuer.common_name\" | \"file.x509.issuer.country\" | \"file.x509.issuer.distinguished_name\" | \"file.x509.issuer.locality\" | \"file.x509.issuer.organization\" | \"file.x509.issuer.organizational_unit\" | \"file.x509.issuer.state_or_province\" | \"file.x509.not_after\" | \"file.x509.not_before\" | \"file.x509.public_key_algorithm\" | \"file.x509.public_key_curve\" | \"file.x509.public_key_exponent\" | \"file.x509.public_key_size\" | \"file.x509.serial_number\" | \"file.x509.signature_algorithm\" | \"file.x509.subject.common_name\" | \"file.x509.subject.country\" | \"file.x509.subject.distinguished_name\" | \"file.x509.subject.locality\" | \"file.x509.subject.organization\" | \"file.x509.subject.organizational_unit\" | \"file.x509.subject.state_or_province\" | \"file.x509.version_number\" | \"group.domain\" | \"group.id\" | \"group.name\" | \"host.architecture\" | \"host.boot.id\" | \"host.cpu.usage\" | \"host.disk.read.bytes\" | \"host.disk.write.bytes\" | \"host.domain\" | \"host.geo.city_name\" | \"host.geo.continent_code\" | \"host.geo.continent_name\" | \"host.geo.country_iso_code\" | \"host.geo.country_name\" | \"host.geo.location\" | \"host.geo.name\" | \"host.geo.postal_code\" | \"host.geo.region_iso_code\" | \"host.geo.region_name\" | \"host.geo.timezone\" | \"host.hostname\" | \"host.id\" | \"host.ip\" | \"host.mac\" | \"host.network.egress.bytes\" | \"host.network.egress.packets\" | \"host.network.ingress.bytes\" | \"host.network.ingress.packets\" | \"host.os.family\" | \"host.os.full\" | \"host.os.kernel\" | \"host.os.name\" | \"host.os.platform\" | \"host.os.type\" | \"host.os.version\" | \"host.pid_ns_ino\" | \"host.risk.calculated_level\" | \"host.risk.calculated_score\" | \"host.risk.calculated_score_norm\" | \"host.risk.static_level\" | \"host.risk.static_score\" | \"host.risk.static_score_norm\" | \"host.type\" | \"host.uptime\" | \"http.request.body.bytes\" | \"http.request.body.content\" | \"http.request.bytes\" | \"http.request.id\" | \"http.request.method\" | \"http.request.mime_type\" | \"http.request.referrer\" | \"http.response.body.bytes\" | \"http.response.body.content\" | \"http.response.bytes\" | \"http.response.mime_type\" | \"http.response.status_code\" | \"http.version\" | \"log.file.path\" | \"log.level\" | \"log.logger\" | \"log.origin.file.line\" | \"log.origin.file.name\" | \"log.origin.function\" | \"log.syslog\" | \"network.application\" | \"network.bytes\" | \"network.community_id\" | \"network.direction\" | \"network.forwarded_ip\" | \"network.iana_number\" | \"network.inner\" | \"network.name\" | \"network.packets\" | \"network.protocol\" | \"network.transport\" | \"network.type\" | \"network.vlan.id\" | \"network.vlan.name\" | \"observer.egress\" | \"observer.geo.city_name\" | \"observer.geo.continent_code\" | \"observer.geo.continent_name\" | \"observer.geo.country_iso_code\" | \"observer.geo.country_name\" | \"observer.geo.location\" | \"observer.geo.name\" | \"observer.geo.postal_code\" | \"observer.geo.region_iso_code\" | \"observer.geo.region_name\" | \"observer.geo.timezone\" | \"observer.hostname\" | \"observer.ingress\" | \"observer.ip\" | \"observer.mac\" | \"observer.name\" | \"observer.os.family\" | \"observer.os.full\" | \"observer.os.kernel\" | \"observer.os.name\" | \"observer.os.platform\" | \"observer.os.type\" | \"observer.os.version\" | \"observer.product\" | \"observer.serial_number\" | \"observer.type\" | \"observer.vendor\" | \"observer.version\" | \"orchestrator.api_version\" | \"orchestrator.cluster.id\" | \"orchestrator.cluster.name\" | \"orchestrator.cluster.url\" | \"orchestrator.cluster.version\" | \"orchestrator.namespace\" | \"orchestrator.organization\" | \"orchestrator.resource.annotation\" | \"orchestrator.resource.id\" | \"orchestrator.resource.ip\" | \"orchestrator.resource.label\" | \"orchestrator.resource.name\" | \"orchestrator.resource.parent.type\" | \"orchestrator.resource.type\" | \"orchestrator.type\" | \"organization.id\" | \"organization.name\" | \"package.architecture\" | \"package.build_version\" | \"package.checksum\" | \"package.description\" | \"package.install_scope\" | \"package.installed\" | \"package.license\" | \"package.name\" | \"package.path\" | \"package.reference\" | \"package.size\" | \"package.type\" | \"package.version\" | \"process.args\" | \"process.args_count\" | \"process.code_signature.digest_algorithm\" | \"process.code_signature.exists\" | \"process.code_signature.signing_id\" | \"process.code_signature.status\" | \"process.code_signature.subject_name\" | \"process.code_signature.team_id\" | \"process.code_signature.timestamp\" | \"process.code_signature.trusted\" | \"process.code_signature.valid\" | \"process.command_line\" | \"process.elf.architecture\" | \"process.elf.byte_order\" | \"process.elf.cpu_type\" | \"process.elf.creation_date\" | \"process.elf.exports\" | \"process.elf.go_import_hash\" | \"process.elf.go_imports\" | \"process.elf.go_imports_names_entropy\" | \"process.elf.go_imports_names_var_entropy\" | \"process.elf.go_stripped\" | \"process.elf.header.abi_version\" | \"process.elf.header.class\" | \"process.elf.header.data\" | \"process.elf.header.entrypoint\" | \"process.elf.header.object_version\" | \"process.elf.header.os_abi\" | \"process.elf.header.type\" | \"process.elf.header.version\" | \"process.elf.import_hash\" | \"process.elf.imports\" | \"process.elf.imports_names_entropy\" | \"process.elf.imports_names_var_entropy\" | \"process.elf.sections\" | \"process.elf.segments\" | \"process.elf.shared_libraries\" | \"process.elf.telfhash\" | \"process.end\" | \"process.entity_id\" | \"process.entry_leader.args\" | \"process.entry_leader.args_count\" | \"process.entry_leader.attested_groups.name\" | \"process.entry_leader.attested_user.id\" | \"process.entry_leader.attested_user.name\" | \"process.entry_leader.command_line\" | \"process.entry_leader.entity_id\" | \"process.entry_leader.entry_meta.source.ip\" | \"process.entry_leader.entry_meta.type\" | \"process.entry_leader.executable\" | \"process.entry_leader.group.id\" | \"process.entry_leader.group.name\" | \"process.entry_leader.interactive\" | \"process.entry_leader.name\" | \"process.entry_leader.parent.entity_id\" | \"process.entry_leader.parent.pid\" | \"process.entry_leader.parent.session_leader.entity_id\" | \"process.entry_leader.parent.session_leader.pid\" | \"process.entry_leader.parent.session_leader.start\" | \"process.entry_leader.parent.session_leader.vpid\" | \"process.entry_leader.parent.start\" | \"process.entry_leader.parent.vpid\" | \"process.entry_leader.pid\" | \"process.entry_leader.real_group.id\" | \"process.entry_leader.real_group.name\" | \"process.entry_leader.real_user.id\" | \"process.entry_leader.real_user.name\" | \"process.entry_leader.same_as_process\" | \"process.entry_leader.saved_group.id\" | \"process.entry_leader.saved_group.name\" | \"process.entry_leader.saved_user.id\" | \"process.entry_leader.saved_user.name\" | \"process.entry_leader.start\" | \"process.entry_leader.supplemental_groups.id\" | \"process.entry_leader.supplemental_groups.name\" | \"process.entry_leader.tty\" | \"process.entry_leader.user.id\" | \"process.entry_leader.user.name\" | \"process.entry_leader.vpid\" | \"process.entry_leader.working_directory\" | \"process.env_vars\" | \"process.executable\" | \"process.exit_code\" | \"process.group_leader.args\" | \"process.group_leader.args_count\" | \"process.group_leader.command_line\" | \"process.group_leader.entity_id\" | \"process.group_leader.executable\" | \"process.group_leader.group.id\" | \"process.group_leader.group.name\" | \"process.group_leader.interactive\" | \"process.group_leader.name\" | \"process.group_leader.pid\" | \"process.group_leader.real_group.id\" | \"process.group_leader.real_group.name\" | \"process.group_leader.real_user.id\" | \"process.group_leader.real_user.name\" | \"process.group_leader.same_as_process\" | \"process.group_leader.saved_group.id\" | \"process.group_leader.saved_group.name\" | \"process.group_leader.saved_user.id\" | \"process.group_leader.saved_user.name\" | \"process.group_leader.start\" | \"process.group_leader.supplemental_groups.id\" | \"process.group_leader.supplemental_groups.name\" | \"process.group_leader.tty\" | \"process.group_leader.user.id\" | \"process.group_leader.user.name\" | \"process.group_leader.vpid\" | \"process.group_leader.working_directory\" | \"process.hash.md5\" | \"process.hash.sha1\" | \"process.hash.sha256\" | \"process.hash.sha384\" | \"process.hash.sha512\" | \"process.hash.ssdeep\" | \"process.hash.tlsh\" | \"process.interactive\" | \"process.io\" | \"process.macho.go_import_hash\" | \"process.macho.go_imports\" | \"process.macho.go_imports_names_entropy\" | \"process.macho.go_imports_names_var_entropy\" | \"process.macho.go_stripped\" | \"process.macho.import_hash\" | \"process.macho.imports\" | \"process.macho.imports_names_entropy\" | \"process.macho.imports_names_var_entropy\" | \"process.macho.sections\" | \"process.macho.symhash\" | \"process.name\" | \"process.parent.args\" | \"process.parent.args_count\" | \"process.parent.code_signature.digest_algorithm\" | \"process.parent.code_signature.exists\" | \"process.parent.code_signature.signing_id\" | \"process.parent.code_signature.status\" | \"process.parent.code_signature.subject_name\" | \"process.parent.code_signature.team_id\" | \"process.parent.code_signature.timestamp\" | \"process.parent.code_signature.trusted\" | \"process.parent.code_signature.valid\" | \"process.parent.command_line\" | \"process.parent.elf.architecture\" | \"process.parent.elf.byte_order\" | \"process.parent.elf.cpu_type\" | \"process.parent.elf.creation_date\" | \"process.parent.elf.exports\" | \"process.parent.elf.go_import_hash\" | \"process.parent.elf.go_imports\" | \"process.parent.elf.go_imports_names_entropy\" | \"process.parent.elf.go_imports_names_var_entropy\" | \"process.parent.elf.go_stripped\" | \"process.parent.elf.header.abi_version\" | \"process.parent.elf.header.class\" | \"process.parent.elf.header.data\" | \"process.parent.elf.header.entrypoint\" | \"process.parent.elf.header.object_version\" | \"process.parent.elf.header.os_abi\" | \"process.parent.elf.header.type\" | \"process.parent.elf.header.version\" | \"process.parent.elf.import_hash\" | \"process.parent.elf.imports\" | \"process.parent.elf.imports_names_entropy\" | \"process.parent.elf.imports_names_var_entropy\" | \"process.parent.elf.sections\" | \"process.parent.elf.segments\" | \"process.parent.elf.shared_libraries\" | \"process.parent.elf.telfhash\" | \"process.parent.end\" | \"process.parent.entity_id\" | \"process.parent.executable\" | \"process.parent.exit_code\" | \"process.parent.group.id\" | \"process.parent.group.name\" | \"process.parent.group_leader.entity_id\" | \"process.parent.group_leader.pid\" | \"process.parent.group_leader.start\" | \"process.parent.group_leader.vpid\" | \"process.parent.hash.md5\" | \"process.parent.hash.sha1\" | \"process.parent.hash.sha256\" | \"process.parent.hash.sha384\" | \"process.parent.hash.sha512\" | \"process.parent.hash.ssdeep\" | \"process.parent.hash.tlsh\" | \"process.parent.interactive\" | \"process.parent.macho.go_import_hash\" | \"process.parent.macho.go_imports\" | \"process.parent.macho.go_imports_names_entropy\" | \"process.parent.macho.go_imports_names_var_entropy\" | \"process.parent.macho.go_stripped\" | \"process.parent.macho.import_hash\" | \"process.parent.macho.imports\" | \"process.parent.macho.imports_names_entropy\" | \"process.parent.macho.imports_names_var_entropy\" | \"process.parent.macho.sections\" | \"process.parent.macho.symhash\" | \"process.parent.name\" | \"process.parent.pe.architecture\" | \"process.parent.pe.company\" | \"process.parent.pe.description\" | \"process.parent.pe.file_version\" | \"process.parent.pe.go_import_hash\" | \"process.parent.pe.go_imports\" | \"process.parent.pe.go_imports_names_entropy\" | \"process.parent.pe.go_imports_names_var_entropy\" | \"process.parent.pe.go_stripped\" | \"process.parent.pe.imphash\" | \"process.parent.pe.import_hash\" | \"process.parent.pe.imports\" | \"process.parent.pe.imports_names_entropy\" | \"process.parent.pe.imports_names_var_entropy\" | \"process.parent.pe.original_file_name\" | \"process.parent.pe.pehash\" | \"process.parent.pe.product\" | \"process.parent.pe.sections\" | \"process.parent.pgid\" | \"process.parent.pid\" | \"process.parent.real_group.id\" | \"process.parent.real_group.name\" | \"process.parent.real_user.id\" | \"process.parent.real_user.name\" | \"process.parent.saved_group.id\" | \"process.parent.saved_group.name\" | \"process.parent.saved_user.id\" | \"process.parent.saved_user.name\" | \"process.parent.start\" | \"process.parent.supplemental_groups.id\" | \"process.parent.supplemental_groups.name\" | \"process.parent.thread.capabilities.effective\" | \"process.parent.thread.capabilities.permitted\" | \"process.parent.thread.id\" | \"process.parent.thread.name\" | \"process.parent.title\" | \"process.parent.tty\" | \"process.parent.uptime\" | \"process.parent.user.id\" | \"process.parent.user.name\" | \"process.parent.vpid\" | \"process.parent.working_directory\" | \"process.pe.architecture\" | \"process.pe.company\" | \"process.pe.description\" | \"process.pe.file_version\" | \"process.pe.go_import_hash\" | \"process.pe.go_imports\" | \"process.pe.go_imports_names_entropy\" | \"process.pe.go_imports_names_var_entropy\" | \"process.pe.go_stripped\" | \"process.pe.imphash\" | \"process.pe.import_hash\" | \"process.pe.imports\" | \"process.pe.imports_names_entropy\" | \"process.pe.imports_names_var_entropy\" | \"process.pe.original_file_name\" | \"process.pe.pehash\" | \"process.pe.product\" | \"process.pe.sections\" | \"process.pgid\" | \"process.pid\" | \"process.previous.args\" | \"process.previous.args_count\" | \"process.previous.executable\" | \"process.real_group.id\" | \"process.real_group.name\" | \"process.real_user.id\" | \"process.real_user.name\" | \"process.saved_group.id\" | \"process.saved_group.name\" | \"process.saved_user.id\" | \"process.saved_user.name\" | \"process.session_leader.args\" | \"process.session_leader.args_count\" | \"process.session_leader.command_line\" | \"process.session_leader.entity_id\" | \"process.session_leader.executable\" | \"process.session_leader.group.id\" | \"process.session_leader.group.name\" | \"process.session_leader.interactive\" | \"process.session_leader.name\" | \"process.session_leader.parent.entity_id\" | \"process.session_leader.parent.pid\" | \"process.session_leader.parent.session_leader.entity_id\" | \"process.session_leader.parent.session_leader.pid\" | \"process.session_leader.parent.session_leader.start\" | \"process.session_leader.parent.session_leader.vpid\" | \"process.session_leader.parent.start\" | \"process.session_leader.parent.vpid\" | \"process.session_leader.pid\" | \"process.session_leader.real_group.id\" | \"process.session_leader.real_group.name\" | \"process.session_leader.real_user.id\" | \"process.session_leader.real_user.name\" | \"process.session_leader.same_as_process\" | \"process.session_leader.saved_group.id\" | \"process.session_leader.saved_group.name\" | \"process.session_leader.saved_user.id\" | \"process.session_leader.saved_user.name\" | \"process.session_leader.start\" | \"process.session_leader.supplemental_groups.id\" | \"process.session_leader.supplemental_groups.name\" | \"process.session_leader.tty\" | \"process.session_leader.user.id\" | \"process.session_leader.user.name\" | \"process.session_leader.vpid\" | \"process.session_leader.working_directory\" | \"process.start\" | \"process.supplemental_groups.id\" | \"process.supplemental_groups.name\" | \"process.thread.capabilities.effective\" | \"process.thread.capabilities.permitted\" | \"process.thread.id\" | \"process.thread.name\" | \"process.title\" | \"process.tty\" | \"process.uptime\" | \"process.user.id\" | \"process.user.name\" | \"process.vpid\" | \"process.working_directory\" | \"registry.data.bytes\" | \"registry.data.strings\" | \"registry.data.type\" | \"registry.hive\" | \"registry.key\" | \"registry.path\" | \"registry.value\" | \"related.hash\" | \"related.hosts\" | \"related.ip\" | \"related.user\" | \"rule.author\" | \"rule.category\" | \"rule.description\" | \"rule.id\" | \"rule.license\" | \"rule.name\" | \"rule.reference\" | \"rule.ruleset\" | \"rule.uuid\" | \"rule.version\" | \"server.address\" | \"server.as.number\" | \"server.as.organization.name\" | \"server.bytes\" | \"server.domain\" | \"server.geo.city_name\" | \"server.geo.continent_code\" | \"server.geo.continent_name\" | \"server.geo.country_iso_code\" | \"server.geo.country_name\" | \"server.geo.location\" | \"server.geo.name\" | \"server.geo.postal_code\" | \"server.geo.region_iso_code\" | \"server.geo.region_name\" | \"server.geo.timezone\" | \"server.ip\" | \"server.mac\" | \"server.nat.ip\" | \"server.nat.port\" | \"server.packets\" | \"server.port\" | \"server.registered_domain\" | \"server.subdomain\" | \"server.top_level_domain\" | \"server.user.domain\" | \"server.user.email\" | \"server.user.full_name\" | \"server.user.group.domain\" | \"server.user.group.id\" | \"server.user.group.name\" | \"server.user.hash\" | \"server.user.id\" | \"server.user.name\" | \"server.user.roles\" | \"service.address\" | \"service.ephemeral_id\" | \"service.id\" | \"service.node.name\" | \"service.node.role\" | \"service.node.roles\" | \"service.origin.address\" | \"service.origin.environment\" | \"service.origin.ephemeral_id\" | \"service.origin.id\" | \"service.origin.name\" | \"service.origin.node.name\" | \"service.origin.node.role\" | \"service.origin.node.roles\" | \"service.origin.state\" | \"service.origin.type\" | \"service.origin.version\" | \"service.state\" | \"service.target.address\" | \"service.target.environment\" | \"service.target.ephemeral_id\" | \"service.target.id\" | \"service.target.name\" | \"service.target.node.name\" | \"service.target.node.role\" | \"service.target.node.roles\" | \"service.target.state\" | \"service.target.type\" | \"service.target.version\" | \"service.type\" | \"service.version\" | \"source.address\" | \"source.as.number\" | \"source.as.organization.name\" | \"source.bytes\" | \"source.domain\" | \"source.geo.city_name\" | \"source.geo.continent_code\" | \"source.geo.continent_name\" | \"source.geo.country_iso_code\" | \"source.geo.country_name\" | \"source.geo.location\" | \"source.geo.name\" | \"source.geo.postal_code\" | \"source.geo.region_iso_code\" | \"source.geo.region_name\" | \"source.geo.timezone\" | \"source.ip\" | \"source.mac\" | \"source.nat.ip\" | \"source.nat.port\" | \"source.packets\" | \"source.port\" | \"source.registered_domain\" | \"source.subdomain\" | \"source.top_level_domain\" | \"source.user.domain\" | \"source.user.email\" | \"source.user.full_name\" | \"source.user.group.domain\" | \"source.user.group.id\" | \"source.user.group.name\" | \"source.user.hash\" | \"source.user.id\" | \"source.user.name\" | \"source.user.roles\" | \"span.id\" | \"threat.enrichments\" | \"threat.feed.dashboard_id\" | \"threat.feed.description\" | \"threat.feed.name\" | \"threat.feed.reference\" | \"threat.framework\" | \"threat.group.alias\" | \"threat.group.id\" | \"threat.group.name\" | \"threat.group.reference\" | \"threat.indicator.as.number\" | \"threat.indicator.as.organization.name\" | \"threat.indicator.confidence\" | \"threat.indicator.description\" | \"threat.indicator.email.address\" | \"threat.indicator.file.accessed\" | \"threat.indicator.file.attributes\" | \"threat.indicator.file.code_signature.digest_algorithm\" | \"threat.indicator.file.code_signature.exists\" | \"threat.indicator.file.code_signature.signing_id\" | \"threat.indicator.file.code_signature.status\" | \"threat.indicator.file.code_signature.subject_name\" | \"threat.indicator.file.code_signature.team_id\" | \"threat.indicator.file.code_signature.timestamp\" | \"threat.indicator.file.code_signature.trusted\" | \"threat.indicator.file.code_signature.valid\" | \"threat.indicator.file.created\" | \"threat.indicator.file.ctime\" | \"threat.indicator.file.device\" | \"threat.indicator.file.directory\" | \"threat.indicator.file.drive_letter\" | \"threat.indicator.file.elf.architecture\" | \"threat.indicator.file.elf.byte_order\" | \"threat.indicator.file.elf.cpu_type\" | \"threat.indicator.file.elf.creation_date\" | \"threat.indicator.file.elf.exports\" | \"threat.indicator.file.elf.go_import_hash\" | \"threat.indicator.file.elf.go_imports\" | \"threat.indicator.file.elf.go_imports_names_entropy\" | \"threat.indicator.file.elf.go_imports_names_var_entropy\" | \"threat.indicator.file.elf.go_stripped\" | \"threat.indicator.file.elf.header.abi_version\" | \"threat.indicator.file.elf.header.class\" | \"threat.indicator.file.elf.header.data\" | \"threat.indicator.file.elf.header.entrypoint\" | \"threat.indicator.file.elf.header.object_version\" | \"threat.indicator.file.elf.header.os_abi\" | \"threat.indicator.file.elf.header.type\" | \"threat.indicator.file.elf.header.version\" | \"threat.indicator.file.elf.import_hash\" | \"threat.indicator.file.elf.imports\" | \"threat.indicator.file.elf.imports_names_entropy\" | \"threat.indicator.file.elf.imports_names_var_entropy\" | \"threat.indicator.file.elf.sections\" | \"threat.indicator.file.elf.segments\" | \"threat.indicator.file.elf.shared_libraries\" | \"threat.indicator.file.elf.telfhash\" | \"threat.indicator.file.extension\" | \"threat.indicator.file.fork_name\" | \"threat.indicator.file.gid\" | \"threat.indicator.file.group\" | \"threat.indicator.file.hash.md5\" | \"threat.indicator.file.hash.sha1\" | \"threat.indicator.file.hash.sha256\" | \"threat.indicator.file.hash.sha384\" | \"threat.indicator.file.hash.sha512\" | \"threat.indicator.file.hash.ssdeep\" | \"threat.indicator.file.hash.tlsh\" | \"threat.indicator.file.inode\" | \"threat.indicator.file.mime_type\" | \"threat.indicator.file.mode\" | \"threat.indicator.file.mtime\" | \"threat.indicator.file.name\" | \"threat.indicator.file.owner\" | \"threat.indicator.file.path\" | \"threat.indicator.file.pe.architecture\" | \"threat.indicator.file.pe.company\" | \"threat.indicator.file.pe.description\" | \"threat.indicator.file.pe.file_version\" | \"threat.indicator.file.pe.go_import_hash\" | \"threat.indicator.file.pe.go_imports\" | \"threat.indicator.file.pe.go_imports_names_entropy\" | \"threat.indicator.file.pe.go_imports_names_var_entropy\" | \"threat.indicator.file.pe.go_stripped\" | \"threat.indicator.file.pe.imphash\" | \"threat.indicator.file.pe.import_hash\" | \"threat.indicator.file.pe.imports\" | \"threat.indicator.file.pe.imports_names_entropy\" | \"threat.indicator.file.pe.imports_names_var_entropy\" | \"threat.indicator.file.pe.original_file_name\" | \"threat.indicator.file.pe.pehash\" | \"threat.indicator.file.pe.product\" | \"threat.indicator.file.pe.sections\" | \"threat.indicator.file.size\" | \"threat.indicator.file.target_path\" | \"threat.indicator.file.type\" | \"threat.indicator.file.uid\" | \"threat.indicator.file.x509.alternative_names\" | \"threat.indicator.file.x509.issuer.common_name\" | \"threat.indicator.file.x509.issuer.country\" | \"threat.indicator.file.x509.issuer.distinguished_name\" | \"threat.indicator.file.x509.issuer.locality\" | \"threat.indicator.file.x509.issuer.organization\" | \"threat.indicator.file.x509.issuer.organizational_unit\" | \"threat.indicator.file.x509.issuer.state_or_province\" | \"threat.indicator.file.x509.not_after\" | \"threat.indicator.file.x509.not_before\" | \"threat.indicator.file.x509.public_key_algorithm\" | \"threat.indicator.file.x509.public_key_curve\" | \"threat.indicator.file.x509.public_key_exponent\" | \"threat.indicator.file.x509.public_key_size\" | \"threat.indicator.file.x509.serial_number\" | \"threat.indicator.file.x509.signature_algorithm\" | \"threat.indicator.file.x509.subject.common_name\" | \"threat.indicator.file.x509.subject.country\" | \"threat.indicator.file.x509.subject.distinguished_name\" | \"threat.indicator.file.x509.subject.locality\" | \"threat.indicator.file.x509.subject.organization\" | \"threat.indicator.file.x509.subject.organizational_unit\" | \"threat.indicator.file.x509.subject.state_or_province\" | \"threat.indicator.file.x509.version_number\" | \"threat.indicator.first_seen\" | \"threat.indicator.geo.city_name\" | \"threat.indicator.geo.continent_code\" | \"threat.indicator.geo.continent_name\" | \"threat.indicator.geo.country_iso_code\" | \"threat.indicator.geo.country_name\" | \"threat.indicator.geo.location\" | \"threat.indicator.geo.name\" | \"threat.indicator.geo.postal_code\" | \"threat.indicator.geo.region_iso_code\" | \"threat.indicator.geo.region_name\" | \"threat.indicator.geo.timezone\" | \"threat.indicator.ip\" | \"threat.indicator.last_seen\" | \"threat.indicator.marking.tlp\" | \"threat.indicator.marking.tlp_version\" | \"threat.indicator.modified_at\" | \"threat.indicator.name\" | \"threat.indicator.port\" | \"threat.indicator.provider\" | \"threat.indicator.reference\" | \"threat.indicator.registry.data.bytes\" | \"threat.indicator.registry.data.strings\" | \"threat.indicator.registry.data.type\" | \"threat.indicator.registry.hive\" | \"threat.indicator.registry.key\" | \"threat.indicator.registry.path\" | \"threat.indicator.registry.value\" | \"threat.indicator.scanner_stats\" | \"threat.indicator.sightings\" | \"threat.indicator.type\" | \"threat.indicator.url.domain\" | \"threat.indicator.url.extension\" | \"threat.indicator.url.fragment\" | \"threat.indicator.url.full\" | \"threat.indicator.url.original\" | \"threat.indicator.url.password\" | \"threat.indicator.url.path\" | \"threat.indicator.url.port\" | \"threat.indicator.url.query\" | \"threat.indicator.url.registered_domain\" | \"threat.indicator.url.scheme\" | \"threat.indicator.url.subdomain\" | \"threat.indicator.url.top_level_domain\" | \"threat.indicator.url.username\" | \"threat.indicator.x509.alternative_names\" | \"threat.indicator.x509.issuer.common_name\" | \"threat.indicator.x509.issuer.country\" | \"threat.indicator.x509.issuer.distinguished_name\" | \"threat.indicator.x509.issuer.locality\" | \"threat.indicator.x509.issuer.organization\" | \"threat.indicator.x509.issuer.organizational_unit\" | \"threat.indicator.x509.issuer.state_or_province\" | \"threat.indicator.x509.not_after\" | \"threat.indicator.x509.not_before\" | \"threat.indicator.x509.public_key_algorithm\" | \"threat.indicator.x509.public_key_curve\" | \"threat.indicator.x509.public_key_exponent\" | \"threat.indicator.x509.public_key_size\" | \"threat.indicator.x509.serial_number\" | \"threat.indicator.x509.signature_algorithm\" | \"threat.indicator.x509.subject.common_name\" | \"threat.indicator.x509.subject.country\" | \"threat.indicator.x509.subject.distinguished_name\" | \"threat.indicator.x509.subject.locality\" | \"threat.indicator.x509.subject.organization\" | \"threat.indicator.x509.subject.organizational_unit\" | \"threat.indicator.x509.subject.state_or_province\" | \"threat.indicator.x509.version_number\" | \"threat.software.alias\" | \"threat.software.id\" | \"threat.software.name\" | \"threat.software.platforms\" | \"threat.software.reference\" | \"threat.software.type\" | \"threat.tactic.id\" | \"threat.tactic.name\" | \"threat.tactic.reference\" | \"threat.technique.id\" | \"threat.technique.name\" | \"threat.technique.reference\" | \"threat.technique.subtechnique.id\" | \"threat.technique.subtechnique.name\" | \"threat.technique.subtechnique.reference\" | \"tls.cipher\" | \"tls.client.certificate\" | \"tls.client.certificate_chain\" | \"tls.client.hash.md5\" | \"tls.client.hash.sha1\" | \"tls.client.hash.sha256\" | \"tls.client.issuer\" | \"tls.client.ja3\" | \"tls.client.not_after\" | \"tls.client.not_before\" | \"tls.client.server_name\" | \"tls.client.subject\" | \"tls.client.supported_ciphers\" | \"tls.client.x509.alternative_names\" | \"tls.client.x509.issuer.common_name\" | \"tls.client.x509.issuer.country\" | \"tls.client.x509.issuer.distinguished_name\" | \"tls.client.x509.issuer.locality\" | \"tls.client.x509.issuer.organization\" | \"tls.client.x509.issuer.organizational_unit\" | \"tls.client.x509.issuer.state_or_province\" | \"tls.client.x509.not_after\" | \"tls.client.x509.not_before\" | \"tls.client.x509.public_key_algorithm\" | \"tls.client.x509.public_key_curve\" | \"tls.client.x509.public_key_exponent\" | \"tls.client.x509.public_key_size\" | \"tls.client.x509.serial_number\" | \"tls.client.x509.signature_algorithm\" | \"tls.client.x509.subject.common_name\" | \"tls.client.x509.subject.country\" | \"tls.client.x509.subject.distinguished_name\" | \"tls.client.x509.subject.locality\" | \"tls.client.x509.subject.organization\" | \"tls.client.x509.subject.organizational_unit\" | \"tls.client.x509.subject.state_or_province\" | \"tls.client.x509.version_number\" | \"tls.curve\" | \"tls.established\" | \"tls.next_protocol\" | \"tls.resumed\" | \"tls.server.certificate\" | \"tls.server.certificate_chain\" | \"tls.server.hash.md5\" | \"tls.server.hash.sha1\" | \"tls.server.hash.sha256\" | \"tls.server.issuer\" | \"tls.server.ja3s\" | \"tls.server.not_after\" | \"tls.server.not_before\" | \"tls.server.subject\" | \"tls.server.x509.alternative_names\" | \"tls.server.x509.issuer.common_name\" | \"tls.server.x509.issuer.country\" | \"tls.server.x509.issuer.distinguished_name\" | \"tls.server.x509.issuer.locality\" | \"tls.server.x509.issuer.organization\" | \"tls.server.x509.issuer.organizational_unit\" | \"tls.server.x509.issuer.state_or_province\" | \"tls.server.x509.not_after\" | \"tls.server.x509.not_before\" | \"tls.server.x509.public_key_algorithm\" | \"tls.server.x509.public_key_curve\" | \"tls.server.x509.public_key_exponent\" | \"tls.server.x509.public_key_size\" | \"tls.server.x509.serial_number\" | \"tls.server.x509.signature_algorithm\" | \"tls.server.x509.subject.common_name\" | \"tls.server.x509.subject.country\" | \"tls.server.x509.subject.distinguished_name\" | \"tls.server.x509.subject.locality\" | \"tls.server.x509.subject.organization\" | \"tls.server.x509.subject.organizational_unit\" | \"tls.server.x509.subject.state_or_province\" | \"tls.server.x509.version_number\" | \"tls.version\" | \"tls.version_protocol\" | \"trace.id\" | \"transaction.id\" | \"url.domain\" | \"url.extension\" | \"url.fragment\" | \"url.full\" | \"url.original\" | \"url.password\" | \"url.path\" | \"url.port\" | \"url.query\" | \"url.registered_domain\" | \"url.scheme\" | \"url.subdomain\" | \"url.top_level_domain\" | \"url.username\" | \"user.changes.domain\" | \"user.changes.email\" | \"user.changes.full_name\" | \"user.changes.group.domain\" | \"user.changes.group.id\" | \"user.changes.group.name\" | \"user.changes.hash\" | \"user.changes.id\" | \"user.changes.name\" | \"user.changes.roles\" | \"user.domain\" | \"user.effective.domain\" | \"user.effective.email\" | \"user.effective.full_name\" | \"user.effective.group.domain\" | \"user.effective.group.id\" | \"user.effective.group.name\" | \"user.effective.hash\" | \"user.effective.id\" | \"user.effective.name\" | \"user.effective.roles\" | \"user.email\" | \"user.full_name\" | \"user.group.domain\" | \"user.group.id\" | \"user.group.name\" | \"user.hash\" | \"user.id\" | \"user.name\" | \"user.risk.calculated_level\" | \"user.risk.calculated_score\" | \"user.risk.calculated_score_norm\" | \"user.risk.static_level\" | \"user.risk.static_score\" | \"user.risk.static_score_norm\" | \"user.roles\" | \"user.target.domain\" | \"user.target.email\" | \"user.target.full_name\" | \"user.target.group.domain\" | \"user.target.group.id\" | \"user.target.group.name\" | \"user.target.hash\" | \"user.target.id\" | \"user.target.name\" | \"user.target.roles\" | \"user_agent.device.name\" | \"user_agent.name\" | \"user_agent.original\" | \"user_agent.os.family\" | \"user_agent.os.full\" | \"user_agent.os.kernel\" | \"user_agent.os.name\" | \"user_agent.os.platform\" | \"user_agent.os.type\" | \"user_agent.os.version\" | \"user_agent.version\" | \"vulnerability.category\" | \"vulnerability.classification\" | \"vulnerability.description\" | \"vulnerability.enumeration\" | \"vulnerability.id\" | \"vulnerability.reference\" | \"vulnerability.report_id\" | \"vulnerability.scanner.vendor\" | \"vulnerability.score.base\" | \"vulnerability.score.environmental\" | \"vulnerability.score.temporal\" | \"vulnerability.score.version\" | \"vulnerability.severity\" | (string & {}) | \"data_stream.dataset\" | \"data_stream.namespace\" | \"data_stream.type\" | \"dll.pe.sections.entropy\" | \"dll.pe.sections.name\" | \"dll.pe.sections.physical_size\" | \"dll.pe.sections.var_entropy\" | \"dll.pe.sections.virtual_size\" | \"dns.answers.class\" | \"dns.answers.data\" | \"dns.answers.name\" | \"dns.answers.ttl\" | \"dns.answers.type\" | \"email.attachments.file.extension\" | \"email.attachments.file.hash.md5\" | \"email.attachments.file.hash.sha1\" | \"email.attachments.file.hash.sha256\" | \"email.attachments.file.hash.sha384\" | \"email.attachments.file.hash.sha512\" | \"email.attachments.file.hash.ssdeep\" | \"email.attachments.file.hash.tlsh\" | \"email.attachments.file.mime_type\" | \"email.attachments.file.name\" | \"email.attachments.file.size\" | \"faas.trigger.request_id\" | \"faas.trigger.type\" | \"file.elf.sections.chi2\" | \"file.elf.sections.entropy\" | \"file.elf.sections.flags\" | \"file.elf.sections.name\" | \"file.elf.sections.physical_offset\" | \"file.elf.sections.physical_size\" | \"file.elf.sections.type\" | \"file.elf.sections.var_entropy\" | \"file.elf.sections.virtual_address\" | \"file.elf.sections.virtual_size\" | \"file.elf.segments.sections\" | \"file.elf.segments.type\" | \"file.macho.sections.entropy\" | \"file.macho.sections.name\" | \"file.macho.sections.physical_size\" | \"file.macho.sections.var_entropy\" | \"file.macho.sections.virtual_size\" | \"file.pe.sections.entropy\" | \"file.pe.sections.name\" | \"file.pe.sections.physical_size\" | \"file.pe.sections.var_entropy\" | \"file.pe.sections.virtual_size\" | \"log.syslog.appname\" | \"log.syslog.facility.code\" | \"log.syslog.facility.name\" | \"log.syslog.hostname\" | \"log.syslog.msgid\" | \"log.syslog.priority\" | \"log.syslog.procid\" | \"log.syslog.severity.code\" | \"log.syslog.severity.name\" | \"log.syslog.structured_data\" | \"log.syslog.version\" | \"network.inner.vlan.id\" | \"network.inner.vlan.name\" | \"observer.egress.interface.alias\" | \"observer.egress.interface.id\" | \"observer.egress.interface.name\" | \"observer.egress.vlan.id\" | \"observer.egress.vlan.name\" | \"observer.egress.zone\" | \"observer.ingress.interface.alias\" | \"observer.ingress.interface.id\" | \"observer.ingress.interface.name\" | \"observer.ingress.vlan.id\" | \"observer.ingress.vlan.name\" | \"observer.ingress.zone\" | \"process.elf.sections.chi2\" | \"process.elf.sections.entropy\" | \"process.elf.sections.flags\" | \"process.elf.sections.name\" | \"process.elf.sections.physical_offset\" | \"process.elf.sections.physical_size\" | \"process.elf.sections.type\" | \"process.elf.sections.var_entropy\" | \"process.elf.sections.virtual_address\" | \"process.elf.sections.virtual_size\" | \"process.elf.segments.sections\" | \"process.elf.segments.type\" | \"process.entry_leader.tty.char_device.major\" | \"process.entry_leader.tty.char_device.minor\" | \"process.group_leader.tty.char_device.major\" | \"process.group_leader.tty.char_device.minor\" | \"process.io.bytes_skipped\" | \"process.io.bytes_skipped.length\" | \"process.io.bytes_skipped.offset\" | \"process.io.max_bytes_per_process_exceeded\" | \"process.io.text\" | \"process.io.total_bytes_captured\" | \"process.io.total_bytes_skipped\" | \"process.io.type\" | \"process.macho.sections.entropy\" | \"process.macho.sections.name\" | \"process.macho.sections.physical_size\" | \"process.macho.sections.var_entropy\" | \"process.macho.sections.virtual_size\" | \"process.parent.elf.sections.chi2\" | \"process.parent.elf.sections.entropy\" | \"process.parent.elf.sections.flags\" | \"process.parent.elf.sections.name\" | \"process.parent.elf.sections.physical_offset\" | \"process.parent.elf.sections.physical_size\" | \"process.parent.elf.sections.type\" | \"process.parent.elf.sections.var_entropy\" | \"process.parent.elf.sections.virtual_address\" | \"process.parent.elf.sections.virtual_size\" | \"process.parent.elf.segments.sections\" | \"process.parent.elf.segments.type\" | \"process.parent.macho.sections.entropy\" | \"process.parent.macho.sections.name\" | \"process.parent.macho.sections.physical_size\" | \"process.parent.macho.sections.var_entropy\" | \"process.parent.macho.sections.virtual_size\" | \"process.parent.pe.sections.entropy\" | \"process.parent.pe.sections.name\" | \"process.parent.pe.sections.physical_size\" | \"process.parent.pe.sections.var_entropy\" | \"process.parent.pe.sections.virtual_size\" | \"process.parent.tty.char_device.major\" | \"process.parent.tty.char_device.minor\" | \"process.pe.sections.entropy\" | \"process.pe.sections.name\" | \"process.pe.sections.physical_size\" | \"process.pe.sections.var_entropy\" | \"process.pe.sections.virtual_size\" | \"process.session_leader.tty.char_device.major\" | \"process.session_leader.tty.char_device.minor\" | \"process.tty.char_device.major\" | \"process.tty.char_device.minor\" | \"process.tty.columns\" | \"process.tty.rows\" | \"threat.enrichments.indicator\" | \"threat.enrichments.indicator.as.number\" | \"threat.enrichments.indicator.as.organization.name\" | \"threat.enrichments.indicator.confidence\" | \"threat.enrichments.indicator.description\" | \"threat.enrichments.indicator.email.address\" | \"threat.enrichments.indicator.file.accessed\" | \"threat.enrichments.indicator.file.attributes\" | \"threat.enrichments.indicator.file.code_signature.digest_algorithm\" | \"threat.enrichments.indicator.file.code_signature.exists\" | \"threat.enrichments.indicator.file.code_signature.signing_id\" | \"threat.enrichments.indicator.file.code_signature.status\" | \"threat.enrichments.indicator.file.code_signature.subject_name\" | \"threat.enrichments.indicator.file.code_signature.team_id\" | \"threat.enrichments.indicator.file.code_signature.timestamp\" | \"threat.enrichments.indicator.file.code_signature.trusted\" | \"threat.enrichments.indicator.file.code_signature.valid\" | \"threat.enrichments.indicator.file.created\" | \"threat.enrichments.indicator.file.ctime\" | \"threat.enrichments.indicator.file.device\" | \"threat.enrichments.indicator.file.directory\" | \"threat.enrichments.indicator.file.drive_letter\" | \"threat.enrichments.indicator.file.elf.architecture\" | \"threat.enrichments.indicator.file.elf.byte_order\" | \"threat.enrichments.indicator.file.elf.cpu_type\" | \"threat.enrichments.indicator.file.elf.creation_date\" | \"threat.enrichments.indicator.file.elf.exports\" | \"threat.enrichments.indicator.file.elf.go_import_hash\" | \"threat.enrichments.indicator.file.elf.go_imports\" | \"threat.enrichments.indicator.file.elf.go_imports_names_entropy\" | \"threat.enrichments.indicator.file.elf.go_imports_names_var_entropy\" | \"threat.enrichments.indicator.file.elf.go_stripped\" | \"threat.enrichments.indicator.file.elf.header.abi_version\" | \"threat.enrichments.indicator.file.elf.header.class\" | \"threat.enrichments.indicator.file.elf.header.data\" | \"threat.enrichments.indicator.file.elf.header.entrypoint\" | \"threat.enrichments.indicator.file.elf.header.object_version\" | \"threat.enrichments.indicator.file.elf.header.os_abi\" | \"threat.enrichments.indicator.file.elf.header.type\" | \"threat.enrichments.indicator.file.elf.header.version\" | \"threat.enrichments.indicator.file.elf.import_hash\" | \"threat.enrichments.indicator.file.elf.imports\" | \"threat.enrichments.indicator.file.elf.imports_names_entropy\" | \"threat.enrichments.indicator.file.elf.imports_names_var_entropy\" | \"threat.enrichments.indicator.file.elf.sections\" | \"threat.enrichments.indicator.file.elf.sections.chi2\" | \"threat.enrichments.indicator.file.elf.sections.entropy\" | \"threat.enrichments.indicator.file.elf.sections.flags\" | \"threat.enrichments.indicator.file.elf.sections.name\" | \"threat.enrichments.indicator.file.elf.sections.physical_offset\" | \"threat.enrichments.indicator.file.elf.sections.physical_size\" | \"threat.enrichments.indicator.file.elf.sections.type\" | \"threat.enrichments.indicator.file.elf.sections.var_entropy\" | \"threat.enrichments.indicator.file.elf.sections.virtual_address\" | \"threat.enrichments.indicator.file.elf.sections.virtual_size\" | \"threat.enrichments.indicator.file.elf.segments\" | \"threat.enrichments.indicator.file.elf.segments.sections\" | \"threat.enrichments.indicator.file.elf.segments.type\" | \"threat.enrichments.indicator.file.elf.shared_libraries\" | \"threat.enrichments.indicator.file.elf.telfhash\" | \"threat.enrichments.indicator.file.extension\" | \"threat.enrichments.indicator.file.fork_name\" | \"threat.enrichments.indicator.file.gid\" | \"threat.enrichments.indicator.file.group\" | \"threat.enrichments.indicator.file.hash.md5\" | \"threat.enrichments.indicator.file.hash.sha1\" | \"threat.enrichments.indicator.file.hash.sha256\" | \"threat.enrichments.indicator.file.hash.sha384\" | \"threat.enrichments.indicator.file.hash.sha512\" | \"threat.enrichments.indicator.file.hash.ssdeep\" | \"threat.enrichments.indicator.file.hash.tlsh\" | \"threat.enrichments.indicator.file.inode\" | \"threat.enrichments.indicator.file.mime_type\" | \"threat.enrichments.indicator.file.mode\" | \"threat.enrichments.indicator.file.mtime\" | \"threat.enrichments.indicator.file.name\" | \"threat.enrichments.indicator.file.owner\" | \"threat.enrichments.indicator.file.path\" | \"threat.enrichments.indicator.file.pe.architecture\" | \"threat.enrichments.indicator.file.pe.company\" | \"threat.enrichments.indicator.file.pe.description\" | \"threat.enrichments.indicator.file.pe.file_version\" | \"threat.enrichments.indicator.file.pe.go_import_hash\" | \"threat.enrichments.indicator.file.pe.go_imports\" | \"threat.enrichments.indicator.file.pe.go_imports_names_entropy\" | \"threat.enrichments.indicator.file.pe.go_imports_names_var_entropy\" | \"threat.enrichments.indicator.file.pe.go_stripped\" | \"threat.enrichments.indicator.file.pe.imphash\" | \"threat.enrichments.indicator.file.pe.import_hash\" | \"threat.enrichments.indicator.file.pe.imports\" | \"threat.enrichments.indicator.file.pe.imports_names_entropy\" | \"threat.enrichments.indicator.file.pe.imports_names_var_entropy\" | \"threat.enrichments.indicator.file.pe.original_file_name\" | \"threat.enrichments.indicator.file.pe.pehash\" | \"threat.enrichments.indicator.file.pe.product\" | \"threat.enrichments.indicator.file.pe.sections\" | \"threat.enrichments.indicator.file.pe.sections.entropy\" | \"threat.enrichments.indicator.file.pe.sections.name\" | \"threat.enrichments.indicator.file.pe.sections.physical_size\" | \"threat.enrichments.indicator.file.pe.sections.var_entropy\" | \"threat.enrichments.indicator.file.pe.sections.virtual_size\" | \"threat.enrichments.indicator.file.size\" | \"threat.enrichments.indicator.file.target_path\" | \"threat.enrichments.indicator.file.type\" | \"threat.enrichments.indicator.file.uid\" | \"threat.enrichments.indicator.file.x509.alternative_names\" | \"threat.enrichments.indicator.file.x509.issuer.common_name\" | \"threat.enrichments.indicator.file.x509.issuer.country\" | \"threat.enrichments.indicator.file.x509.issuer.distinguished_name\" | \"threat.enrichments.indicator.file.x509.issuer.locality\" | \"threat.enrichments.indicator.file.x509.issuer.organization\" | \"threat.enrichments.indicator.file.x509.issuer.organizational_unit\" | \"threat.enrichments.indicator.file.x509.issuer.state_or_province\" | \"threat.enrichments.indicator.file.x509.not_after\" | \"threat.enrichments.indicator.file.x509.not_before\" | \"threat.enrichments.indicator.file.x509.public_key_algorithm\" | \"threat.enrichments.indicator.file.x509.public_key_curve\" | \"threat.enrichments.indicator.file.x509.public_key_exponent\" | \"threat.enrichments.indicator.file.x509.public_key_size\" | \"threat.enrichments.indicator.file.x509.serial_number\" | \"threat.enrichments.indicator.file.x509.signature_algorithm\" | \"threat.enrichments.indicator.file.x509.subject.common_name\" | \"threat.enrichments.indicator.file.x509.subject.country\" | \"threat.enrichments.indicator.file.x509.subject.distinguished_name\" | \"threat.enrichments.indicator.file.x509.subject.locality\" | \"threat.enrichments.indicator.file.x509.subject.organization\" | \"threat.enrichments.indicator.file.x509.subject.organizational_unit\" | \"threat.enrichments.indicator.file.x509.subject.state_or_province\" | \"threat.enrichments.indicator.file.x509.version_number\" | \"threat.enrichments.indicator.first_seen\" | \"threat.enrichments.indicator.geo.city_name\" | \"threat.enrichments.indicator.geo.continent_code\" | \"threat.enrichments.indicator.geo.continent_name\" | \"threat.enrichments.indicator.geo.country_iso_code\" | \"threat.enrichments.indicator.geo.country_name\" | \"threat.enrichments.indicator.geo.location\" | \"threat.enrichments.indicator.geo.name\" | \"threat.enrichments.indicator.geo.postal_code\" | \"threat.enrichments.indicator.geo.region_iso_code\" | \"threat.enrichments.indicator.geo.region_name\" | \"threat.enrichments.indicator.geo.timezone\" | \"threat.enrichments.indicator.ip\" | \"threat.enrichments.indicator.last_seen\" | \"threat.enrichments.indicator.marking.tlp\" | \"threat.enrichments.indicator.marking.tlp_version\" | \"threat.enrichments.indicator.modified_at\" | \"threat.enrichments.indicator.name\" | \"threat.enrichments.indicator.port\" | \"threat.enrichments.indicator.provider\" | \"threat.enrichments.indicator.reference\" | \"threat.enrichments.indicator.registry.data.bytes\" | \"threat.enrichments.indicator.registry.data.strings\" | \"threat.enrichments.indicator.registry.data.type\" | \"threat.enrichments.indicator.registry.hive\" | \"threat.enrichments.indicator.registry.key\" | \"threat.enrichments.indicator.registry.path\" | \"threat.enrichments.indicator.registry.value\" | \"threat.enrichments.indicator.scanner_stats\" | \"threat.enrichments.indicator.sightings\" | \"threat.enrichments.indicator.type\" | \"threat.enrichments.indicator.url.domain\" | \"threat.enrichments.indicator.url.extension\" | \"threat.enrichments.indicator.url.fragment\" | \"threat.enrichments.indicator.url.full\" | \"threat.enrichments.indicator.url.original\" | \"threat.enrichments.indicator.url.password\" | \"threat.enrichments.indicator.url.path\" | \"threat.enrichments.indicator.url.port\" | \"threat.enrichments.indicator.url.query\" | \"threat.enrichments.indicator.url.registered_domain\" | \"threat.enrichments.indicator.url.scheme\" | \"threat.enrichments.indicator.url.subdomain\" | \"threat.enrichments.indicator.url.top_level_domain\" | \"threat.enrichments.indicator.url.username\" | \"threat.enrichments.indicator.x509.alternative_names\" | \"threat.enrichments.indicator.x509.issuer.common_name\" | \"threat.enrichments.indicator.x509.issuer.country\" | \"threat.enrichments.indicator.x509.issuer.distinguished_name\" | \"threat.enrichments.indicator.x509.issuer.locality\" | \"threat.enrichments.indicator.x509.issuer.organization\" | \"threat.enrichments.indicator.x509.issuer.organizational_unit\" | \"threat.enrichments.indicator.x509.issuer.state_or_province\" | \"threat.enrichments.indicator.x509.not_after\" | \"threat.enrichments.indicator.x509.not_before\" | \"threat.enrichments.indicator.x509.public_key_algorithm\" | \"threat.enrichments.indicator.x509.public_key_curve\" | \"threat.enrichments.indicator.x509.public_key_exponent\" | \"threat.enrichments.indicator.x509.public_key_size\" | \"threat.enrichments.indicator.x509.serial_number\" | \"threat.enrichments.indicator.x509.signature_algorithm\" | \"threat.enrichments.indicator.x509.subject.common_name\" | \"threat.enrichments.indicator.x509.subject.country\" | \"threat.enrichments.indicator.x509.subject.distinguished_name\" | \"threat.enrichments.indicator.x509.subject.locality\" | \"threat.enrichments.indicator.x509.subject.organization\" | \"threat.enrichments.indicator.x509.subject.organizational_unit\" | \"threat.enrichments.indicator.x509.subject.state_or_province\" | \"threat.enrichments.indicator.x509.version_number\" | \"threat.enrichments.matched.atomic\" | \"threat.enrichments.matched.field\" | \"threat.enrichments.matched.id\" | \"threat.enrichments.matched.index\" | \"threat.enrichments.matched.occurred\" | \"threat.enrichments.matched.type\" | \"threat.indicator.file.elf.sections.chi2\" | \"threat.indicator.file.elf.sections.entropy\" | \"threat.indicator.file.elf.sections.flags\" | \"threat.indicator.file.elf.sections.name\" | \"threat.indicator.file.elf.sections.physical_offset\" | \"threat.indicator.file.elf.sections.physical_size\" | \"threat.indicator.file.elf.sections.type\" | \"threat.indicator.file.elf.sections.var_entropy\" | \"threat.indicator.file.elf.sections.virtual_address\" | \"threat.indicator.file.elf.sections.virtual_size\" | \"threat.indicator.file.elf.segments.sections\" | \"threat.indicator.file.elf.segments.type\" | \"threat.indicator.file.pe.sections.entropy\" | \"threat.indicator.file.pe.sections.name\" | \"threat.indicator.file.pe.sections.physical_size\" | \"threat.indicator.file.pe.sections.var_entropy\" | \"threat.indicator.file.pe.sections.virtual_size\"" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.IntegrationFieldName", + "type": "Type", + "tags": [], + "label": "IntegrationFieldName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.PartialFieldMetadataPlain", + "type": "Type", + "tags": [], + "label": "PartialFieldMetadataPlain", + "description": [], + "signature": [ + "{ name?: string | undefined; } & { allowed_values?: ({ description: string; name: string; } & { expected_event_types?: string[] | undefined; beta?: string | undefined; })[] | undefined; beta?: string | undefined; dashed_name?: string | undefined; description?: string | undefined; doc_values?: boolean | undefined; example?: unknown; expected_values?: string[] | undefined; flat_name?: string | undefined; format?: string | undefined; ignore_above?: number | undefined; index?: boolean | undefined; input_format?: string | undefined; level?: string | undefined; multi_fields?: { flat_name: string; name: string; type: string; }[] | undefined; normalize?: string[] | undefined; object_type?: string | undefined; original_fieldset?: string | undefined; output_format?: string | undefined; output_precision?: number | undefined; pattern?: string | undefined; required?: boolean | undefined; scaling_factor?: number | undefined; short?: string | undefined; source?: \"unknown\" | \"ecs\" | \"integration\" | undefined; type?: string | undefined; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.TEcsFields", + "type": "Type", + "tags": [], + "label": "TEcsFields", + "description": [], + "signature": [ + "{ '@timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; required: boolean; short: string; type: string; }; 'agent.build.original': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'agent.ephemeral_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'agent.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'agent.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'agent.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'agent.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.address': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; pattern: string; short: string; type: string; }; 'client.nat.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.nat.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.packets': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'client.user.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'client.user.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'cloud.account.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.account.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.availability_zone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.instance.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.instance.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.machine.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.origin.account.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.account.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.availability_zone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.instance.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.instance.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.machine.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.project.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.project.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.region': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.origin.service.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.project.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.project.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.region': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.service.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'cloud.target.account.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.account.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.availability_zone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.instance.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.instance.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.machine.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.project.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.project.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.region': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'cloud.target.service.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'container.cpu.usage': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; scaling_factor: number; short: string; type: string; }; 'container.disk.read.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.disk.write.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.image.hash.all': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'container.image.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.image.tag': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'container.labels': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; object_type: string; short: string; type: string; }; 'container.memory.usage': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; scaling_factor: number; short: string; type: string; }; 'container.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.network.egress.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.network.ingress.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.runtime': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'container.security_context.privileged': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'data_stream.dataset': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'data_stream.namespace': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'data_stream.type': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.address': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; pattern: string; short: string; type: string; }; 'destination.nat.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.nat.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.packets': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'destination.user.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'destination.user.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'device.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'device.manufacturer': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'device.model.identifier': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'device.model.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dll.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dll.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dll.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dll.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'dns.answers': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'dns.answers.class': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.answers.data': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.answers.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.answers.ttl': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.answers.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.header_flags': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'dns.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.op_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.class': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.question.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.resolved_ip': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'dns.response_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'dns.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'ecs.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; required: boolean; short: string; type: string; }; 'email.attachments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.attachments.file.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.attachments.file.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'email.attachments.file.mime_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.attachments.file.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.attachments.file.size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.bcc.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.cc.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.content_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.delivery_timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.direction': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.from.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.local_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.message_id': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.origination_timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.reply_to.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.sender.address': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'email.subject': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'email.to.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'email.x_mailer': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'error.code': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'error.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'error.message': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'error.stack_trace': { dashed_name: string; description: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'error.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.action': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.agent_id_status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.category': { allowed_values: { description: string; expected_event_types: string[]; name: string; }[]; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'event.code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.created': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.dataset': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.duration': { dashed_name: string; description: string; flat_name: string; format: string; input_format: string; level: string; name: string; normalize: never[]; output_format: string; output_precision: number; short: string; type: string; }; 'event.end': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.ingested': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.kind': { allowed_values: ({ description: string; name: string; beta?: undefined; } | { beta: string; description: string; name: string; })[]; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.module': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.original': { dashed_name: string; description: string; doc_values: boolean; example: string; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.outcome': { allowed_values: { description: string; name: string; }[]; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.reason': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.risk_score': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.risk_score_norm': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.sequence': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.severity': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.start': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.timezone': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'event.type': { allowed_values: { description: string; name: string; }[]; dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'event.url': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.coldstart': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.execution': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.trigger.request_id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.trigger.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'faas.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.accessed': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.attributes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'file.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.created': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.ctime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.device': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.drive_letter': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.elf.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.byte_order': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.cpu_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.creation_date': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.exports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.elf.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.abi_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.class': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.data': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.entrypoint': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.object_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.os_abi': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.header.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.elf.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.chi2': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.flags': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.physical_offset': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.virtual_address': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.segments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.elf.segments.sections': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.segments.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.elf.shared_libraries': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.elf.telfhash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.fork_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.gid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.group': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.inode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.macho.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.macho.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.macho.symhash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.mime_type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.mode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.mtime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.owner': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'file.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.target_path': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'file.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.uid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'file.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'file.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.boot.id': { beta: string; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.cpu.usage': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; scaling_factor: number; short: string; type: string; }; 'host.disk.read.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.disk.write.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.hostname': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'host.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; pattern: string; short: string; type: string; }; 'host.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.network.egress.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.network.egress.packets': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.network.ingress.bytes': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.network.ingress.packets': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.os.family': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.full': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.kernel': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.platform': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.os.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.pid_ns_ino': { beta: string; dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.risk.calculated_level': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.risk.calculated_score': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.risk.calculated_score_norm': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.risk.static_level': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.risk.static_score': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.risk.static_score_norm': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'host.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'host.uptime': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.body.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.body.content': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'http.request.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.method': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.mime_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.request.referrer': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.response.body.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.response.body.content': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'http.response.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.response.mime_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.response.status_code': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'http.version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; labels: { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; object_type: string; short: string; type: string; }; 'log.file.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.level': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.logger': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.origin.file.line': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.origin.file.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.origin.function': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.appname': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.facility.code': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.facility.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.hostname': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.msgid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.priority': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.procid': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.severity.code': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.severity.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.structured_data': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'log.syslog.version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; message: { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.application': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.community_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.direction': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.forwarded_ip': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.iana_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.inner': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.inner.vlan.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'network.inner.vlan.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'network.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.packets': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.protocol': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.transport': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'network.vlan.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'network.vlan.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.egress.interface.alias': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress.interface.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress.interface.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress.vlan.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress.vlan.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.egress.zone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.hostname': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.ingress': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.ingress.interface.alias': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.ingress.interface.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.ingress.interface.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.ingress.vlan.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.ingress.vlan.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.ingress.zone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'observer.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; pattern: string; short: string; type: string; }; 'observer.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.os.family': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.full': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.kernel': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.platform': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.os.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'observer.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.serial_number': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.vendor': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'observer.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.api_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.cluster.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.cluster.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.cluster.url': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.cluster.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.namespace': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.resource.annotation': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'orchestrator.resource.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.resource.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'orchestrator.resource.label': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'orchestrator.resource.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.resource.parent.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.resource.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'orchestrator.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'organization.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'organization.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'package.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.build_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.checksum': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.install_scope': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.installed': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.license': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.size': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'package.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'process.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.command_line': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'process.elf.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.byte_order': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.cpu_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.creation_date': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.exports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.elf.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.abi_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.class': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.data': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.entrypoint': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.object_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.os_abi': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.header.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.elf.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.chi2': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.flags': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.physical_offset': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.virtual_address': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.segments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.elf.segments.sections': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.segments.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.elf.shared_libraries': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.elf.telfhash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.end': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.entry_leader.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.attested_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.attested_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.attested_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.command_line': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.entry_meta.source.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.entry_meta.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.interactive': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.session_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.session_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.session_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.session_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.parent.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.real_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.real_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.real_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.real_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.same_as_process': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.saved_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.saved_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.saved_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.saved_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.supplemental_groups.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.supplemental_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.tty': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.tty.char_device.major': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.tty.char_device.minor': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.entry_leader.working_directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.env_vars': { beta: string; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'process.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'process.exit_code': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.group_leader.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.command_line': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.interactive': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.real_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.real_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.real_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.real_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.same_as_process': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.saved_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.saved_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.saved_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.saved_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.supplemental_groups.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.supplemental_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.tty': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.tty.char_device.major': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.tty.char_device.minor': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.group_leader.working_directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.interactive': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.bytes_skipped': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'process.io.bytes_skipped.length': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.bytes_skipped.offset': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.max_bytes_per_process_exceeded': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.text': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.total_bytes_captured': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.total_bytes_skipped': { beta: string; dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.io.type': { beta: string; dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.macho.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.macho.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.macho.symhash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'process.parent.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.command_line': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.byte_order': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.cpu_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.creation_date': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.exports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.abi_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.class': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.data': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.entrypoint': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.object_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.os_abi': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.header.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.chi2': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.flags': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.physical_offset': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.virtual_address': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.segments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.segments.sections': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.segments.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.shared_libraries': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.elf.telfhash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.end': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.exit_code': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.group_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.interactive': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.macho.symhash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pgid': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.real_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.real_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.real_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.real_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.saved_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.saved_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.saved_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.saved_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.supplemental_groups.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.supplemental_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.thread.capabilities.effective': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; pattern: string; short: string; type: string; }; 'process.parent.thread.capabilities.permitted': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; pattern: string; short: string; type: string; }; 'process.parent.thread.id': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.thread.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.title': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.tty': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.tty.char_device.major': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.tty.char_device.minor': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.uptime': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.parent.working_directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.pgid': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.previous.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.previous.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.previous.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.real_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.real_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.real_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.real_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.saved_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.saved_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.saved_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.saved_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.args': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.args_count': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.command_line': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.executable': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.interactive': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.session_leader.entity_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.session_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.session_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.session_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.parent.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.pid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.real_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.real_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.real_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.real_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.same_as_process': { dashed_name: string; description: string; example: boolean; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.saved_group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.saved_group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.saved_user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.saved_user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.supplemental_groups.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.supplemental_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.tty': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.tty.char_device.major': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.tty.char_device.minor': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.session_leader.working_directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.start': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.supplemental_groups.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.supplemental_groups.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.thread.capabilities.effective': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; pattern: string; short: string; type: string; }; 'process.thread.capabilities.permitted': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; pattern: string; short: string; type: string; }; 'process.thread.id': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.thread.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.title': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'process.tty': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.tty.char_device.major': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.tty.char_device.minor': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.tty.columns': { beta: string; dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.tty.rows': { beta: string; dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.uptime': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'process.vpid': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'process.working_directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'registry.data.bytes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'registry.data.strings': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'registry.data.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'registry.hive': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'registry.key': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'registry.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'registry.value': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'related.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'related.hosts': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'related.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'related.user': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'rule.author': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'rule.category': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.license': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.ruleset': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.uuid': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'rule.version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.address': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; pattern: string; short: string; type: string; }; 'server.nat.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.nat.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.packets': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'server.user.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'server.user.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'service.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.environment': { beta: string; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.ephemeral_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.node.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.node.role': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.node.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'service.origin.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.environment': { beta: string; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.ephemeral_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.node.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.node.role': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.node.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'service.origin.state': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.origin.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.state': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.target.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.environment': { beta: string; dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.ephemeral_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.node.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.node.role': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.node.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'service.target.state': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.target.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'service.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'service.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.address': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.bytes': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.mac': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; pattern: string; short: string; type: string; }; 'source.nat.ip': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.nat.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.packets': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.port': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'source.user.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'source.user.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'span.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; tags: { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.enrichments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.enrichments.indicator': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.confidence': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.email.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.file.accessed': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.attributes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.created': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.ctime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.device': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.drive_letter': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.byte_order': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.cpu_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.creation_date': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.exports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.abi_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.class': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.data': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.entrypoint': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.object_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.os_abi': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.header.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.chi2': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.flags': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.physical_offset': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.virtual_address': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.segments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.segments.sections': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.segments.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.shared_libraries': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.elf.telfhash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.fork_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.gid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.group': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.inode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.mime_type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.mode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.mtime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.owner': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.target_path': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.uid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.file.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.first_seen': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.ip': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.last_seen': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.marking.tlp': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.marking.tlp_version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.modified_at': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.port': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.registry.data.bytes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.data.strings': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.data.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.hive': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.key': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.registry.value': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.scanner_stats': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.sightings': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.indicator.url.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.fragment': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.full': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.original': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.password': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.path': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.port': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.query': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.scheme': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.url.username': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.indicator.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.enrichments.matched.atomic': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.matched.field': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.matched.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.matched.index': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.matched.occurred': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.enrichments.matched.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.feed.dashboard_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.feed.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.feed.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.feed.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.framework': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.group.alias': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.group.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.group.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.group.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.as.number': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.as.organization.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.confidence': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.email.address': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.file.accessed': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.attributes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.digest_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.exists': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.signing_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.status': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.subject_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.team_id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.timestamp': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.trusted': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.code_signature.valid': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.created': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.ctime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.device': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.directory': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.drive_letter': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.byte_order': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.cpu_type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.creation_date': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.exports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.abi_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.class': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.data': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.entrypoint': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.object_version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.os_abi': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.header.version': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.chi2': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.flags': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.physical_offset': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.virtual_address': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.segments': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.segments.sections': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.segments.type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.shared_libraries': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.elf.telfhash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.fork_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.gid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.group': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.md5': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.sha1': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.sha256': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.sha384': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.sha512': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.ssdeep': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.hash.tlsh': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.inode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.mime_type': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.mode': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.mtime': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.owner': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.architecture': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.company': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.file_version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.go_import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.go_imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.go_imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.go_imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.go_stripped': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.imphash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.import_hash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.imports': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.imports_names_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.imports_names_var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.original_file_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.pehash': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.product': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections.entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections.physical_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections.var_entropy': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.pe.sections.virtual_size': { dashed_name: string; description: string; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.target_path': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.uid': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.file.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.first_seen': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.geo.city_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.continent_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.continent_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.country_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.country_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.location': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.postal_code': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.region_iso_code': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.region_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.geo.timezone': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.ip': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.last_seen': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.marking.tlp': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.marking.tlp_version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.modified_at': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.port': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.provider': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.registry.data.bytes': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.data.strings': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.data.type': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.hive': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.key': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.path': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.registry.value': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.scanner_stats': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.sightings': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.indicator.url.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.fragment': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.full': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.original': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.password': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.path': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.port': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.query': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.scheme': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.url.username': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'threat.indicator.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'threat.software.alias': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.software.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.software.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.software.platforms': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.software.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.software.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'threat.tactic.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.tactic.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.tactic.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.subtechnique.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.subtechnique.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: string[]; short: string; type: string; }; 'threat.technique.subtechnique.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'tls.cipher': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.certificate': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.certificate_chain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'tls.client.hash.md5': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.hash.sha1': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.hash.sha256': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.issuer': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.ja3': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.server_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.subject': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.client.supported_ciphers': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'tls.client.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.client.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.established': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.next_protocol': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.resumed': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.certificate': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.certificate_chain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'tls.server.hash.md5': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.hash.sha1': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.hash.sha256': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.issuer': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.ja3s': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.subject': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.server.x509.alternative_names': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.organizational_unit': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.issuer.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.not_after': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.not_before': { dashed_name: string; description: string; example: string; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.public_key_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.public_key_curve': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.public_key_exponent': { dashed_name: string; description: string; doc_values: boolean; example: number; flat_name: string; index: boolean; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.public_key_size': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.serial_number': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.signature_algorithm': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.common_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.country': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.distinguished_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.locality': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.organization': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.organizational_unit': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.subject.state_or_province': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'tls.server.x509.version_number': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'tls.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'tls.version_protocol': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'trace.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'transaction.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.extension': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.fragment': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.full': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'url.original': { dashed_name: string; description: string; example: string; flat_name: string; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'url.password': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.path': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.port': { dashed_name: string; description: string; example: number; flat_name: string; format: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.query': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.registered_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.scheme': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.subdomain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.top_level_domain': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'url.username': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user.changes.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.changes.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'user.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user.effective.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.effective.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'user.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'user.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'user.risk.calculated_level': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.risk.calculated_score': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.risk.calculated_score_norm': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.risk.static_level': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.risk.static_score': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.risk.static_score_norm': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'user.target.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.email': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.full_name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.group.domain': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.group.id': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.group.name': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.hash': { dashed_name: string; description: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user.target.roles': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; original_fieldset: string; short: string; type: string; }; 'user_agent.device.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user_agent.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'user_agent.original': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'user_agent.os.family': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.full': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.kernel': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.name': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.platform': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.type': { dashed_name: string; description: string; example: string; expected_values: string[]; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.os.version': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; original_fieldset: string; short: string; type: string; }; 'user_agent.version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.category': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: string[]; short: string; type: string; }; 'vulnerability.classification': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.description': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; multi_fields: { flat_name: string; name: string; type: string; }[]; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.enumeration': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.id': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.reference': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.report_id': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.scanner.vendor': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.score.base': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.score.environmental': { dashed_name: string; description: string; example: number; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.score.temporal': { dashed_name: string; description: string; flat_name: string; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.score.version': { dashed_name: string; description: string; example: number; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; 'vulnerability.severity': { dashed_name: string; description: string; example: string; flat_name: string; ignore_above: number; level: string; name: string; normalize: never[]; short: string; type: string; }; }" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [ + { + "parentPluginId": "fieldsMetadata", + "id": "def-common.fieldMetadataPlainRT", + "type": "Object", + "tags": [], + "label": "fieldMetadataPlainRT", + "description": [], + "signature": [ + "IntersectionC", + "<[", + "TypeC", + "<{ name: ", + "StringC", + "; }>, ", + "PartialC", + "<{ allowed_values: ", + "ArrayC", + "<", + "IntersectionC", + "<[", + "TypeC", + "<{ description: ", + "StringC", + "; name: ", + "StringC", + "; }>, ", + "PartialC", + "<{ expected_event_types: ", + "ArrayC", + "<", + "StringC", + ">; beta: ", + "StringC", + "; }>]>>; beta: ", + "StringC", + "; dashed_name: ", + "StringC", + "; description: ", + "StringC", + "; doc_values: ", + "BooleanC", + "; example: ", + "UnknownC", + "; expected_values: ", + "ArrayC", + "<", + "StringC", + ">; flat_name: ", + "StringC", + "; format: ", + "StringC", + "; ignore_above: ", + "NumberC", + "; index: ", + "BooleanC", + "; input_format: ", + "StringC", + "; level: ", + "StringC", + "; multi_fields: ", + "ArrayC", + "<", + "TypeC", + "<{ flat_name: ", + "StringC", + "; name: ", + "StringC", + "; type: ", + "StringC", + "; }>>; normalize: ", + "ArrayC", + "<", + "StringC", + ">; object_type: ", + "StringC", + "; original_fieldset: ", + "StringC", + "; output_format: ", + "StringC", + "; output_precision: ", + "NumberC", + "; pattern: ", + "StringC", + "; required: ", + "BooleanC", + "; scaling_factor: ", + "NumberC", + "; short: ", + "StringC", + "; source: ", + "KeyofC", + "<{ ecs: null; integration: null; unknown: null; }>; type: ", + "StringC", + "; }>]>" + ], + "path": "x-pack/plugins/fields_metadata/common/fields_metadata/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ] + } +} \ No newline at end of file diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx new file mode 100644 index 00000000000000..9f679f164075cb --- /dev/null +++ b/api_docs/fields_metadata.mdx @@ -0,0 +1,61 @@ +--- +#### +#### 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: kibFieldsMetadataPluginApi +slug: /kibana-dev-docs/api/fieldsMetadata +title: "fieldsMetadata" +image: https://source.unsplash.com/400x175/?github +description: API docs for the fieldsMetadata plugin +date: 2024-06-09 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] +--- +import fieldsMetadataObj from './fields_metadata.devdocs.json'; + +Exposes services for async usage and search of fields metadata. + +Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 39 | 0 | 39 | 7 | + +## Client + +### Setup + + +### Start + + +### Interfaces + + +## Server + +### Setup + + +### Start + + +### Consts, variables and types + + +## Common + +### Objects + + +### Classes + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index dc94e0e07c8762..54f40d08329240 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2024-06-05 +date: 2024-06-09 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 e1b00b3fefd77e..fcc8d1075f70db 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2024-06-05 +date: 2024-06-09 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 c607e70f124245..b1de172e076888 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 4323df4ca57100..9a94c33392803a 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -7480,6 +7480,26 @@ "path": "x-pack/plugins/fleet/server/plugin.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "fleet", + "id": "def-server.FleetSetupDeps.fieldsMetadata", + "type": "Object", + "tags": [], + "label": "fieldsMetadata", + "description": [], + "signature": [ + { + "pluginId": "fieldsMetadata", + "scope": "server", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-server.FieldsMetadataServerSetup", + "text": "FieldsMetadataServerSetup" + } + ], + "path": "x-pack/plugins/fleet/server/plugin.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -8326,7 +8346,7 @@ "label": "getPackage", "description": [], "signature": [ - "(packageName: string, packageVersion: string) => Promise<{ packageInfo: ", + "(packageName: string, packageVersion: string, options?: { ignoreUnverified?: boolean | undefined; } | undefined) => Promise<{ paths: string[]; packageInfo: ", { "pluginId": "fleet", "scope": "common", @@ -8334,7 +8354,11 @@ "section": "def-common.ArchivePackage", "text": "ArchivePackage" }, - "; paths: string[]; }>" + "; assetsMap: ", + "AssetsMap", + "; verificationResult?: ", + "PackageVerificationResult", + " | undefined; }>" ], "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", "deprecated": false, @@ -8369,6 +8393,76 @@ "deprecated": false, "trackAdoption": false, "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getPackage.$3", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ ignoreUnverified?: boolean | undefined; } | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getPackageFieldsMetadata", + "type": "Function", + "tags": [], + "label": "getPackageFieldsMetadata", + "description": [], + "signature": [ + "(params: { packageName: string; datasetName?: string | undefined; }, options?: { excludedFieldsAssets?: string[] | undefined; } | undefined) => Promise<", + { + "pluginId": "fieldsMetadata", + "scope": "server", + "docId": "kibFieldsMetadataPluginApi", + "section": "def-server.ExtractedIntegrationFields", + "text": "ExtractedIntegrationFields" + }, + ">" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getPackageFieldsMetadata.$1", + "type": "Object", + "tags": [], + "label": "params", + "description": [], + "signature": [ + "{ packageName: string; datasetName?: string | undefined; }" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "fleet", + "id": "def-server.PackageClient.getPackageFieldsMetadata.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ excludedFieldsAssets?: string[] | undefined; } | undefined" + ], + "path": "x-pack/plugins/fleet/server/services/epm/package_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -19453,6 +19547,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.AgentPolicy.space_id", + "type": "string", + "tags": [], + "label": "space_id", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.AgentPolicy.status", @@ -21158,6 +21266,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FullAgentPolicy.namespaces", + "type": "Array", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "fleet", "id": "def-common.FullAgentPolicy.outputs", @@ -26400,21 +26522,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "fleet", - "id": "def-common.FLEET_SERVER_SERVERS_INDEX", - "type": "string", - "tags": [], - "label": "FLEET_SERVER_SERVERS_INDEX", - "description": [], - "signature": [ - "\".fleet-servers\"" - ], - "path": "x-pack/plugins/fleet/common/constants/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "fleet", "id": "def-common.FLEET_SYNTHETICS_PACKAGE", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index c70634c5c6b95b..a15901488f3fd1 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1329 | 5 | 1208 | 69 | +| 1335 | 5 | 1214 | 71 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 527ddc2cf51cd7..9efe2e9626b676 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2024-06-05 +date: 2024-06-09 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 cca990045a0594..c6612b960c27c7 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2024-06-05 +date: 2024-06-09 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 bd6531ba1ceb9f..e441fa46aca62c 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2024-06-05 +date: 2024-06-09 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 6f4d3fec1811b5..bb0087213d7887 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2024-06-05 +date: 2024-06-09 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 dbc92c5cf922cf..86a7cc593b65e7 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2024-06-05 +date: 2024-06-09 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 46df890f8428ab..79dee9bb31ba84 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2024-06-05 +date: 2024-06-09 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 a11b76955488cb..ddfac4502fa456 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index b13b8b8dd1ff15..b5222004f44fa2 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 704ff05bd42081..bb4260b93c6394 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2024-06-05 +date: 2024-06-09 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 81757417b05825..17ead3c7b0e718 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/investigate.devdocs.json b/api_docs/investigate.devdocs.json new file mode 100644 index 00000000000000..aef706f8842922 --- /dev/null +++ b/api_docs/investigate.devdocs.json @@ -0,0 +1,8904 @@ +{ + "id": "investigate", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "investigate", + "id": "def-public.createEsqlWidget", + "type": "Function", + "tags": [], + "label": "createEsqlWidget", + "description": [], + "signature": [ + ", PredefinedKeys>>(widgetCreate: T) => Pick<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidgetCreate", + "text": "InvestigateWidgetCreate" + }, + "<", + { + "pluginId": "investigate", + "scope": "public", + "docId": "kibInvestigatePluginApi", + "section": "def-public.EsqlWidgetParameters", + "text": "EsqlWidgetParameters" + }, + ">, PredefinedKeys> & Omit & { parameters: T[\"parameters\"] & ", + "_DeepPartialObject", + "<", + "GlobalWidgetParameters", + ">; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/create_esql_widget.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.createEsqlWidget.$1", + "type": "Uncategorized", + "tags": [], + "label": "widgetCreate", + "description": [], + "signature": [ + "T" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/create_widget.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.createWidgetFactory", + "type": "Function", + "tags": [], + "label": "createWidgetFactory", + "description": [], + "signature": [ + "(type: string, defaults: Pick>, AllowedDefaultKeys> | undefined) => ", + "WidgetFactory", + "" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/create_widget.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.createWidgetFactory.$1", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/create_widget.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "investigate", + "id": "def-public.createWidgetFactory.$2", + "type": "Object", + "tags": [], + "label": "defaults", + "description": [], + "signature": [ + "Pick>, AllowedDefaultKeys> | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/create_widget.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.getEsFilterFromGlobalParameters", + "type": "Function", + "tags": [], + "label": "getEsFilterFromGlobalParameters", + "description": [], + "signature": [ + "({\n query,\n filters,\n timeRange,\n}: Partial<", + "GlobalWidgetParameters", + ">) => { bool: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.BoolQuery", + "text": "BoolQuery" + }, + "; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/util/get_es_filters_from_global_parameters.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.getEsFilterFromGlobalParameters.$1", + "type": "Object", + "tags": [], + "label": "{\n query,\n filters,\n timeRange,\n}", + "description": [], + "signature": [ + "Partial<", + "GlobalWidgetParameters", + ">" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/util/get_es_filters_from_global_parameters.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "investigate", + "id": "def-public.EsqlWidgetParameters", + "type": "Interface", + "tags": [], + "label": "EsqlWidgetParameters", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.EsqlWidgetParameters.esql", + "type": "string", + "tags": [], + "label": "esql", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.EsqlWidgetParameters.suggestion", + "type": "Object", + "tags": [], + "label": "suggestion", + "description": [], + "signature": [ + "Suggestion | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.EsqlWidgetParameters.predefined", + "type": "Object", + "tags": [], + "label": "predefined", + "description": [], + "signature": [ + "Partial<", + "GlobalWidgetParameters", + "> | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.GlobalWidgetParameters", + "type": "Interface", + "tags": [], + "label": "GlobalWidgetParameters", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.GlobalWidgetParameters.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [], + "signature": [ + "{ from: string; to: string; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.GlobalWidgetParameters.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + "{ query: string; language: \"kuery\"; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.GlobalWidgetParameters.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[]" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline", + "type": "Interface", + "tags": [], + "label": "InvestigateTimeline", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline.timestamp", + "type": "number", + "tags": [], + "label": "'@timestamp'", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "InvestigateUser" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateTimeline.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>[]" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateUser", + "type": "Interface", + "tags": [], + "label": "InvestigateUser", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateUser.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget", + "type": "Interface", + "tags": [], + "label": "InvestigateWidget", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.created", + "type": "number", + "tags": [], + "label": "created", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.last_updated", + "type": "number", + "tags": [], + "label": "last_updated", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "InvestigateUser" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.parameters", + "type": "CompoundType", + "tags": [], + "label": "parameters", + "description": [], + "signature": [ + "GlobalWidgetParameters", + " & TParameters" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.data", + "type": "Uncategorized", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "TData" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.columns", + "type": "Enum", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidgetColumnSpan", + "text": "InvestigateWidgetColumnSpan" + } + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.rows", + "type": "number", + "tags": [], + "label": "rows", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidget.locked", + "type": "boolean", + "tags": [], + "label": "locked", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WidgetRenderAPI", + "type": "Interface", + "tags": [], + "label": "WidgetRenderAPI", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.WidgetRenderAPI.onDelete", + "type": "Function", + "tags": [], + "label": "onDelete", + "description": [], + "signature": [ + "() => void" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "investigate", + "id": "def-public.WidgetRenderAPI.onWidgetAdd", + "type": "Function", + "tags": [], + "label": "onWidgetAdd", + "description": [], + "signature": [ + "(create: ", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidgetCreate", + "text": "InvestigateWidgetCreate" + }, + "<{}>) => Promise" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.WidgetRenderAPI.onWidgetAdd.$1", + "type": "CompoundType", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>, \"type\" | \"title\" | \"description\" | \"rows\" | \"columns\" | \"locked\"> & { parameters: ", + "_DeepPartialObject", + "<", + "GlobalWidgetParameters", + ">; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "investigate", + "id": "def-public.WidgetRenderAPI.blocks", + "type": "Object", + "tags": [], + "label": "blocks", + "description": [], + "signature": [ + "{ publish: (blocks: ", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.WorkflowBlock", + "text": "WorkflowBlock" + }, + "[]) => UnregisterFunction; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock", + "type": "Interface", + "tags": [], + "label": "WorkflowBlock", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.content", + "type": "string", + "tags": [], + "label": "content", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.loading", + "type": "boolean", + "tags": [], + "label": "loading", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.onClick", + "type": "Function", + "tags": [], + "label": "onClick", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.color", + "type": "CompoundType", + "tags": [], + "label": "color", + "description": [], + "signature": [ + "\"link\" | \"text\" | \"title\" | \"warning\" | \"disabled\" | \"success\" | \"body\" | \"highlight\" | \"primary\" | \"accent\" | \"danger\" | \"primaryText\" | \"accentText\" | \"successText\" | \"warningText\" | \"dangerText\" | \"emptyShade\" | \"lightestShade\" | \"lightShade\" | \"mediumShade\" | \"darkShade\" | \"darkestShade\" | \"fullShade\" | \"disabledText\" | \"shadow\" | \"subduedText\" | \"ghost\" | \"ink\" | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.WorkflowBlock.children", + "type": "CompoundType", + "tags": [], + "label": "children", + "description": [], + "signature": [ + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "investigate", + "id": "def-public.ChromeOption", + "type": "Enum", + "tags": [], + "label": "ChromeOption", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidgetColumnSpan", + "type": "Enum", + "tags": [], + "label": "InvestigateWidgetColumnSpan", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "investigate", + "id": "def-public.ESQL_WIDGET_NAME", + "type": "string", + "tags": [], + "label": "ESQL_WIDGET_NAME", + "description": [], + "signature": [ + "\"esql\"" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/esql_widget/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigateWidgetCreate", + "type": "Type", + "tags": [], + "label": "InvestigateWidgetCreate", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>, \"type\" | \"title\" | \"description\" | \"rows\" | \"columns\" | \"locked\"> & { parameters: ", + "_DeepPartialObject", + "<", + "GlobalWidgetParameters", + "> & TParameters; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.OnWidgetAdd", + "type": "Type", + "tags": [], + "label": "OnWidgetAdd", + "description": [], + "signature": [ + "(create: ", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidgetCreate", + "text": "InvestigateWidgetCreate" + }, + "<{}>) => Promise" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.OnWidgetAdd.$1", + "type": "CompoundType", + "tags": [], + "label": "create", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>, \"type\" | \"title\" | \"description\" | \"rows\" | \"columns\" | \"locked\"> & { parameters: ", + "_DeepPartialObject", + "<", + "GlobalWidgetParameters", + ">; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "objects": [], + "setup": { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup", + "type": "Interface", + "tags": [], + "label": "InvestigatePublicSetup", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget", + "type": "Function", + "tags": [], + "label": "registerWidget", + "description": [], + "signature": [ + ">(definition: Omit & { schema: TSchema; }, generateCallback: GenerateCallback, renderCallback: (options: WidgetRenderOptions<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + ", TData>>) => React.ReactNode) => void" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget.$1", + "type": "CompoundType", + "tags": [], + "label": "definition", + "description": [], + "signature": [ + "Omit & { schema: TSchema; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget.$2", + "type": "Function", + "tags": [], + "label": "generateCallback", + "description": [], + "signature": [ + "(options: { parameters: (TSchema extends ", + "CompatibleJSONSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/resolve", + "$Resolve<", + "JSONSchema7", + " extends (TSchema extends Record ? ", + "DeepWritable", + " : TSchema) ? ", + "Any", + " : (TSchema extends Record ? ", + "DeepWritable", + " : TSchema) extends string | true ? ", + "Any", + " : (TSchema extends Record ? ", + "DeepWritable", + " : TSchema) extends false ? ", + "Never", + " : (TSchema extends Record ? ", + "DeepWritable", + " : TSchema) extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends string | true ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends false ? ", + "Never", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"$ref\"], \"#\">> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AnyOfSchema", + " ? any : any> : any> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends string | true ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends false ? ", + "Never", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"$ref\"], \"#\">> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AnyOfSchema", + " ? any : any> : any> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends string | true ? ", + "Any", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends false ? ", + "Never", + " : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "AnyOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnAnyOfSchema<(", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"anyOf\"], ", + "AnyOfSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "EnumSchema", + " ? ", + "node_modules/ts-algebra/lib/meta-types/intersection/index", + "$Intersect<", + "If", + "<", + "IsNever", + "<", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>>, ", + "Never", + ", { type: \"enum\"; values: ", + "Compute", + "<(", + "EnumSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"enum\"][number], never>; isSerialized: false; deserialized: never; }>, ", + "Any", + "> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "ConstSchema", + " ? ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseConstSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { const: unknown; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "MultipleTypesSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnMixedSchema<(", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">)[\"type\"], ", + "MultipleTypesSchema", + " & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\"> extends ", + "SingleTypeSchema", + " ? ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> | ", + "ParseSingleTypeSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { type: ", + "JSONSchema7TypeName", + "; } & Omit<", + "NullableSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">> : ", + "Any", + "> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"$ref\"], \"#\">> : Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "JSONSchema7", + " extends Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends string | true ? ", + "Any", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends false ? ", + "Never", + " : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "NullableSchema", + " ? ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> | ", + "ParseNullableSchema", + " & { const?: unknown; enum?: unknown; items?: ", + "JSONSchema7", + " | ", + "JSONSchema7", + "[] | undefined; additionalItems?: ", + "JSONSchema7", + " | undefined; contains?: ", + "JSONSchema7", + " | undefined; properties?: Record | undefined; patternProperties?: Record | undefined; additionalProperties?: ", + "JSONSchema7", + " | undefined; dependencies?: { [key: string]: string[] | ", + "JSONSchema7", + "; } | undefined; propertyNames?: ", + "JSONSchema7", + " | undefined; if?: ", + "JSONSchema7", + " | undefined; then?: ", + "JSONSchema7", + " | undefined; else?: ", + "JSONSchema7", + " | undefined; allOf?: ", + "JSONSchema7", + "[] | undefined; anyOf?: ", + "JSONSchema7", + "[] | undefined; oneOf?: ", + "JSONSchema7", + "[] | undefined; not?: ", + "JSONSchema7", + " | undefined; nullable?: boolean | undefined; definitions?: { [key: string]: ", + "JSONSchema7", + "; } | undefined; examples?: unknown[] | undefined; default?: unknown; [$JSONSchema7]?: typeof ", + "node_modules/json-schema-to-ts/lib/types/definitions/jsonSchema7", + "$JSONSchema7 | undefined; } & { nullable: boolean; } & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "ReferenceSchema", + " ? ", + "ParseReferenceSchema", + "<", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, RecSplit<(", + "ReferenceSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"$ref\"], \"#\">> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AllOfSchema", + " ? RecurseOnAllOfSchema<(", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"allOf\"], ", + "AllOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, ", + "Any", + "> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "OneOfSchema", + " ? ", + "If", + "<", + "IsNever", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>>, ", + "Never", + ", ", + "DoesExtend", + " ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>, ", + "Never", + "> extends true ? ", + "Never", + " : { type: \"union\"; values: RecurseOnOneOfSchema<(", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">)[\"oneOf\"], ", + "OneOfSchema", + " & Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\">, ", + "ParseOptions", + " ? ", + "DeepWritable", + " : TSchema, ", + "FromSchemaDefaultOptions", + ">, never>; }> : Omit<", + "AllOfSchema", + " & Omit<", + "NullableSchema", + " & (TSchema extends Record ? ", + "DeepWritable", + " : TSchema), \"nullable\">, \"allOf\"> extends ", + "AnyOfSchema", + " ? any : any> : any> : any, ", + "ResolveDefaultOptions", + "> : {}) & ", + "GlobalWidgetParameters", + "; signal: AbortSignal; }) => any" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget.$2.$1", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ parameters: (TSchema extends ", + "CompatibleJSONSchema", + " ? any : {}) & ", + "GlobalWidgetParameters", + "; signal: AbortSignal; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget.$3", + "type": "Function", + "tags": [], + "label": "renderCallback", + "description": [], + "signature": [ + "(options: WidgetRenderOptions<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + ", TData>>) => React.ReactNode" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicSetup.registerWidget.$3.$1", + "type": "CompoundType", + "tags": [], + "label": "options", + "description": [], + "signature": [ + "{ widget: any; } & ", + { + "pluginId": "investigate", + "scope": "public", + "docId": "kibInvestigatePluginApi", + "section": "def-public.WidgetRenderAPI", + "text": "WidgetRenderAPI" + } + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ] + } + ], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicStart", + "type": "Interface", + "tags": [], + "label": "InvestigatePublicStart", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-public.InvestigatePublicStart.getWidgetDefinitions", + "type": "Function", + "tags": [], + "label": "getWidgetDefinitions", + "description": [], + "signature": [ + "() => ", + "WidgetDefinition", + "[]" + ], + "path": "x-pack/plugins/observability_solution/investigate/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "investigate", + "id": "def-server.InvestigateServerSetup", + "type": "Interface", + "tags": [], + "label": "InvestigateServerSetup", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "investigate", + "id": "def-server.InvestigateServerStart", + "type": "Interface", + "tags": [], + "label": "InvestigateServerStart", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [ + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline", + "type": "Interface", + "tags": [], + "label": "InvestigateTimeline", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline.timestamp", + "type": "number", + "tags": [], + "label": "'@timestamp'", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "InvestigateUser" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateTimeline.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>[]" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget", + "type": "Interface", + "tags": [], + "label": "InvestigateWidget", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.created", + "type": "number", + "tags": [], + "label": "created", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.last_updated", + "type": "number", + "tags": [], + "label": "last_updated", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.user", + "type": "Object", + "tags": [], + "label": "user", + "description": [], + "signature": [ + "InvestigateUser" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.parameters", + "type": "CompoundType", + "tags": [], + "label": "parameters", + "description": [], + "signature": [ + "GlobalWidgetParameters", + " & TParameters" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.data", + "type": "Uncategorized", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "TData" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.columns", + "type": "Enum", + "tags": [], + "label": "columns", + "description": [], + "signature": [ + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidgetColumnSpan", + "text": "InvestigateWidgetColumnSpan" + } + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.rows", + "type": "number", + "tags": [], + "label": "rows", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidget.locked", + "type": "boolean", + "tags": [], + "label": "locked", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock", + "type": "Interface", + "tags": [], + "label": "WorkflowBlock", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.id", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.content", + "type": "string", + "tags": [], + "label": "content", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.loading", + "type": "boolean", + "tags": [], + "label": "loading", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.onClick", + "type": "Function", + "tags": [], + "label": "onClick", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.color", + "type": "CompoundType", + "tags": [], + "label": "color", + "description": [], + "signature": [ + "\"link\" | \"text\" | \"title\" | \"warning\" | \"disabled\" | \"success\" | \"body\" | \"highlight\" | \"primary\" | \"accent\" | \"danger\" | \"primaryText\" | \"accentText\" | \"successText\" | \"warningText\" | \"dangerText\" | \"emptyShade\" | \"lightestShade\" | \"lightShade\" | \"mediumShade\" | \"darkShade\" | \"darkestShade\" | \"fullShade\" | \"disabledText\" | \"shadow\" | \"subduedText\" | \"ghost\" | \"ink\" | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "investigate", + "id": "def-common.WorkflowBlock.children", + "type": "CompoundType", + "tags": [], + "label": "children", + "description": [], + "signature": [ + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [ + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidgetColumnSpan", + "type": "Enum", + "tags": [], + "label": "InvestigateWidgetColumnSpan", + "description": [], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "misc": [ + { + "parentPluginId": "investigate", + "id": "def-common.InvestigateWidgetCreate", + "type": "Type", + "tags": [], + "label": "InvestigateWidgetCreate", + "description": [], + "signature": [ + "Pick<", + { + "pluginId": "investigate", + "scope": "common", + "docId": "kibInvestigatePluginApi", + "section": "def-common.InvestigateWidget", + "text": "InvestigateWidget" + }, + "<{}, {}>, \"type\" | \"title\" | \"description\" | \"rows\" | \"columns\" | \"locked\"> & { parameters: ", + "_DeepPartialObject", + "<", + "GlobalWidgetParameters", + "> & TParameters; }" + ], + "path": "x-pack/plugins/observability_solution/investigate/common/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx new file mode 100644 index 00000000000000..4cd71308143d3b --- /dev/null +++ b/api_docs/investigate.mdx @@ -0,0 +1,64 @@ +--- +#### +#### 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: kibInvestigatePluginApi +slug: /kibana-dev-docs/api/investigate +title: "investigate" +image: https://source.unsplash.com/400x175/?github +description: API docs for the investigate plugin +date: 2024-06-09 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] +--- +import investigateObj from './investigate.devdocs.json'; + + + +Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 95 | 0 | 95 | 4 | + +## Client + +### Setup + + +### Start + + +### Functions + + +### Interfaces + + +### Enums + + +### Consts, variables and types + + +## Server + +### Setup + + +### Start + + +## Common + +### Interfaces + + +### Enums + + +### Consts, variables and types + + diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 09fcaac9bf1dc8..26b57c2df0d428 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2024-06-05 +date: 2024-06-09 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 007b242d32cc8b..d81f21f0ed8b7d 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-06-05 +date: 2024-06-09 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 55ed34bac5a33e..c857c6e7398aac 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index 3ab0a6163ac19d..26ad41fea15665 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 4d102b95a8790e..753ad8646c9d19 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 791f048b956f82..b37ddcb04a4dc4 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-06-05 +date: 2024-06-09 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_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index b0b6955b0cc72a..84b71a8a31659f 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 8a77d1f1499c3d..24373697fc20a9 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2024-06-05 +date: 2024-06-09 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 8c85406acb3e8d..b2f96c76f12f31 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-06-05 +date: 2024-06-09 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 622df9ae1d281f..eb6b40f3108f37 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 2bd1dd6daaf2fe..a0f155958ab571 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2024-06-05 +date: 2024-06-09 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 85aba8bbda9429..0a4fb858fbcf62 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2024-06-05 +date: 2024-06-09 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 25a7c2f3293d93..9b007d0873dc5f 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2024-06-05 +date: 2024-06-09 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 ee876ddeb8cf44..ac764dea373515 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 5a3e84257bb2b8..5a402386de8a30 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 1475ce7b7e97d4..e8f43f67b31284 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2024-06-05 +date: 2024-06-09 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 e7272922837978..5104355c40bb27 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2024-06-05 +date: 2024-06-09 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 5555e035ed1ddc..77a9ed66be73ec 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index b27b1e1d7641a4..12d449ff288ae7 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2024-06-05 +date: 2024-06-09 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_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index 95ef06f7d37eac..94638ab7ea62d0 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 14e06148cf5628..e4b8fb8913e4b6 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 935496013d4fcb..f8b1769ca6d2e8 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -1845,28 +1845,12 @@ "label": "generateLongId", "description": [], "signature": [ - "(seed: string | undefined) => string" + "() => string" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/apm-synthtrace-client", - "id": "def-common.generateLongId.$1", - "type": "string", - "tags": [], - "label": "seed", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], + "children": [], "returnComment": [], "initialIsOpen": false }, @@ -1878,28 +1862,12 @@ "label": "generateShortId", "description": [], "signature": [ - "(seed: string | undefined) => string" + "() => string" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts", "deprecated": false, "trackAdoption": false, - "children": [ - { - "parentPluginId": "@kbn/apm-synthtrace-client", - "id": "def-common.generateShortId.$1", - "type": "string", - "tags": [], - "label": "seed", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], + "children": [], "returnComment": [], "initialIsOpen": false }, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 942f6958c1230f..172b37d7277c74 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 193 | 0 | 193 | 30 | +| 191 | 0 | 191 | 30 | ## Common diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 1b7372452aca6e..6fb607201e7f6c 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 a94ecaebf13d2b..d500af0273cb2b 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2024-06-05 +date: 2024-06-09 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 d7c81979b51b65..8990a133239151 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-06-05 +date: 2024-06-09 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 2afa9e4e5da5fd..bd04ae38def6df 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-06-05 +date: 2024-06-09 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 01112cc4527a2f..b15ca97c864036 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-06-05 +date: 2024-06-09 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 594fc60c5df8e7..22b5fb0a2f3919 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2024-06-05 +date: 2024-06-09 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 c36ecdc5b7c8a6..09f43c4edb80ad 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2024-06-05 +date: 2024-06-09 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 85311473df6313..d0d888afb76360 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2024-06-05 +date: 2024-06-09 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 833d92ba5f08af..de470981053e21 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2024-06-05 +date: 2024-06-09 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 55d63bb63651a5..36fbf5d847ef0e 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2024-06-05 +date: 2024-06-09 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 b3a603bd94f766..50a7fb7e04e8da 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2024-06-05 +date: 2024-06-09 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 103c33d7f960e7..6a8f9641a07edb 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2024-06-05 +date: 2024-06-09 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 1edc06f2e17d3f..71dc4b8b979fd0 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2024-06-05 +date: 2024-06-09 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 beaa6c5ea38dc7..1d939edd3f8b3b 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index 007cdd8e194959..cff650df128cad 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index 68281cce07b8e1..809ceba957ea29 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-06-05 +date: 2024-06-09 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 3a34d3d05ea0ae..07d4d3e84abe86 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2024-06-05 +date: 2024-06-09 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 06a88dcfd4e939..50a47366134b81 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2024-06-05 +date: 2024-06-09 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 8d1dd41ce03654..78d24546ca3be1 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 35f66bce9fe8f1..a2aa84dd678967 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2024-06-05 +date: 2024-06-09 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 11ec0c6169ca08..7a4be7d228adc3 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2024-06-05 +date: 2024-06-09 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 486fc644ae0737..5543e21d0debf1 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-06-05 +date: 2024-06-09 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 8bc1ff20f5df7e..8a8adc470d455b 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-06-05 +date: 2024-06-09 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 ede2219227138d..97ffe1f1a9f581 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-06-05 +date: 2024-06-09 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 4ba90b4dbee5b1..f5f445704ee700 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-06-05 +date: 2024-06-09 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 b7ec5313f9fb28..c3c8e5f6a99114 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 531dd243033bae..b6429c08f3641d 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 3d123b2e7b5ead..9e947560bef3ba 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 8768cebe137107..c53017c3488df0 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 39e66d12d319ea..ab2eb636fddca0 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2024-06-05 +date: 2024-06-09 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 916df560716ed0..72e072ff2fa92d 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 1f1b2610329e87..b150236e6e9bfd 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ddb4211b42e7a4..2ccbfff332d2a2 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 d27030d6c60b28..7723a7eb99ff13 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 31c815e0cdf58e..4131e5507306d6 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 c3cc070c247eec..c23d75d936ed25 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2024-06-05 +date: 2024-06-09 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 009d223be143a8..8bdf12e7ebf9fb 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 b946ef578f4740..8136f719ae0676 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 8c4770b5346cf7..0fe7bbb7140c89 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 9fca022c70eb28..244f21f79060ae 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ff891f1282f85f..4ac443443b6e19 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2024-06-05 +date: 2024-06-09 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 1d9828563610aa..f1b4bf718c971b 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 fd2531afc3455f..cbfc5764727ad2 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 841c7b0ca57ad6..7d79680b2f0b46 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 58e1c780e1ae81..3711f989ebdba7 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2024-06-05 +date: 2024-06-09 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 3933c683eecc5a..dc7fb8539f8d5a 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2024-06-05 +date: 2024-06-09 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 d747577ec38747..703422c6b18c44 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_core_chrome_browser.devdocs.json index e4c0daecf50a64..0cc31110a2fb6a 100644 --- a/api_docs/kbn_core_chrome_browser.devdocs.json +++ b/api_docs/kbn_core_chrome_browser.devdocs.json @@ -4042,6 +4042,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-chrome-browser", + "id": "def-common.RenderAs", + "type": "Type", + "tags": [], + "label": "RenderAs", + "description": [], + "signature": [ + "\"block\" | \"item\" | \"accordion\" | \"panelOpener\"" + ], + "path": "packages/core/chrome/core-chrome-browser/src/project_navigation.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-chrome-browser", "id": "def-common.RootNavigationItemDefinition", diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 976115a72a0cc2..5bdacf2798d75e 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 206 | 0 | 99 | 0 | +| 207 | 0 | 100 | 0 | ## Common diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index b00aa99ccdaef4..21cbf708f2640a 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 5ca0b6a51b1c8b..3142e20b5a3fa2 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 b3709527cccd8e..f4252d31dddde3 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 38a0eb7f49509d..c4f26e44bf5966 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 127c0d3c884f24..12b49bc6b7ad74 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 35530b12d80f24..c7b039318d9ed0 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2024-06-05 +date: 2024-06-09 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 8c0bd814c72987..166976b013d7bc 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2024-06-05 +date: 2024-06-09 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 a2d5ac543f43df..2849a76ea0f77a 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 90ce3fefa61b8a..64644df1075315 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 2e1de4a80b7b1a..605907edbd126b 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 a71efbe4423bf3..8a1e37340a15c7 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 a2fbe5ec762d40..88bdda76b395ec 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 a1af92782a76e6..649b6181c55f5e 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2024-06-05 +date: 2024-06-09 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 76a45e52318325..84a70ba42a8c29 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2024-06-05 +date: 2024-06-09 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 81b296cabb4c6f..74c67105f0a254 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 8049ffa24ff490..2b2f9308652ed5 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 d0c199a2d85134..b3f06a4d4b5eca 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 f65db4920a0a3a..5f4a2b8639262b 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 871ed55b6b7da9..790b2befeff9c3 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2024-06-05 +date: 2024-06-09 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 747835841ddb9e..bfa3d5dad9deb7 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 e7d06203595a3e..1164f5be15166c 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 91604c9293c47c..9f2592160de363 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 fd50465b9f4a91..79c07b24425bfe 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2024-06-05 +date: 2024-06-09 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 9b56a2878f875c..44d7653ef262d7 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 1c4a5c2f48de5b..bd438e59fe1bc6 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 a7ec2e4cf3484c..8acc90bad6123c 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 922ae2f0e272ce..f212b8d82eb15b 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 fee7e84a3e3011..7eb9e811fa1f3e 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 5d22fbdcc9f942..5ef791da264dbb 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 824691665b7eaa..53ae0516c0ee51 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 0db8271c5a5f03..0d20869b509a4c 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2024-06-05 +date: 2024-06-09 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 db52fbc8f205c7..6f48d22f92edd7 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2024-06-05 +date: 2024-06-09 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 7405cff6c0d2a1..5b11f8abd8c8e8 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 db1c795663298b..41a56932e653c2 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 f26385e7c02f09..528f238276c3b7 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 f50a0138d9b55f..557277bb797df7 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 6b83912b126782..e8c07b6cba4b0b 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 ad771681d50cc0..b38f69d10b5048 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 caade77662b7f6..b6cb529f2d3bd9 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 0a86916b26d4ca..af51a51e221423 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2024-06-05 +date: 2024-06-09 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 0fe2c527e34c91..f495c0218b1b3c 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 abb2deaf0913c1..8c3891d30bd65f 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2024-06-05 +date: 2024-06-09 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 7f06c252138331..8cac495dba5652 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2024-06-05 +date: 2024-06-09 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 66ee6504c35c9a..8c6c964e434bf8 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 01f2d45af626b3..8b4ffbd76091c7 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_core_http_router_server_internal.devdocs.json index 8d9d2e4892dd9f..bd6d96ce1e1d28 100644 --- a/api_docs/kbn_core_http_router_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_router_server_internal.devdocs.json @@ -187,7 +187,7 @@ }, "<", "Method", - ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -258,7 +258,7 @@ }, "<", "Method", - ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -329,7 +329,7 @@ }, "<", "Method", - ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -400,7 +400,7 @@ }, "<", "Method", - ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, @@ -471,7 +471,7 @@ }, "<", "Method", - ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ">, \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-internal/src/versioned_router/core_versioned_router.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index c5c718d8f0cb5f..bb76f454ae2cfe 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_core_http_router_server_mocks.devdocs.json index 271920acee8d61..068d2f989e0d72 100644 --- a/api_docs/kbn_core_http_router_server_mocks.devdocs.json +++ b/api_docs/kbn_core_http_router_server_mocks.devdocs.json @@ -80,7 +80,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-router-server-mocks/src/versioned_router.mock.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index c8a1f89c91ee37..bc2929bdd78650 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 79dd391fa119b7..7fbe9f21461e09 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -12568,6 +12568,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.RouteConfigOptions.summary", + "type": "string", + "tags": [], + "label": "summary", + "description": [ + "\nShort summary of this route. Required for all routes used in OAS documentation.\n" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/route.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-common.RouteConfigOptions.description", @@ -12575,7 +12591,7 @@ "tags": [], "label": "description", "description": [ - "A short, human-friendly description of this endpoint" + "\nOptional API description, which supports [CommonMark](https://spec.commonmark.org) markdown formatting\n" ], "signature": [ "string | undefined" @@ -13984,6 +14000,10 @@ "plugin": "telemetry", "path": "src/plugins/telemetry/server/routes/telemetry_last_reported.ts" }, + { + "plugin": "fieldsMetadata", + "path": "x-pack/plugins/fields_metadata/server/routes/fields_metadata/find_fields_metadata.ts" + }, { "plugin": "fleet", "path": "x-pack/plugins/fleet/server/services/security/fleet_router.ts" @@ -14871,7 +14891,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -15154,7 +15174,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16165,7 +16185,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16292,7 +16312,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16551,7 +16571,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -19229,7 +19249,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -19297,7 +19317,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; description?: string | undefined; }" + ", \"description\" | \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; summary?: string | undefined; description?: string | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 88214c19e1757e..94f67456096ee2 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 486 | 2 | 193 | 0 | +| 487 | 2 | 193 | 0 | ## Common diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 13a272ca13826a..1a5e720fec44a8 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 137aeb008d79dd..4cadec29bea1cc 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 522a9d33e5197d..577ea9f176dcc8 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 5ed6a37ed3f5b3..84a3c0ac4cc9d6 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 b1791db4642972..d60576dd383bad 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2024-06-05 +date: 2024-06-09 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 49549ccfe8ee36..e9ff8f4d9af1a8 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 7094be1d84a05b..a9564f238e2520 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 5b8bf93add9e44..306d9edf960380 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 28cff639fc30e7..3a2c4eba166897 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 d51f32973b4ffe..50ebc27a807156 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 f1462636058192..86d09af803a9f6 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 f82a9b10888cb7..31cd08857b48f5 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 69268e7f5bea61..5de80fc8b06916 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2024-06-05 +date: 2024-06-09 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 87be5fa2ddc3c8..3c60b6f3aa954a 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 48b67dce6f9fe2..bea9d9ff4b66e4 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 5486c47a62eadc..95c08356812d15 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 92bdf89d54a17b..43c9c0149b4636 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2024-06-05 +date: 2024-06-09 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 02d70f12a426fb..17aa32952b2b63 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 efba20139c4972..22459a2b4a8b32 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 2dcebc8f705d45..766d9ed1c610f1 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 d7e81cb16b81fa..44ef82ed91d744 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 a2ed99543132cb..6938ab96a3d2b4 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2024-06-05 +date: 2024-06-09 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 98afbcbd9032d1..c919b6a3cced13 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 26d322b6f717b4..0b099591b74f18 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 91ec2e563d37f8..af909d75f14e3d 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 3a4d1417757d6f..744fe135a9eaa1 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2024-06-05 +date: 2024-06-09 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 3da7120d80faad..52e9b1fde63708 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 74e6abb7a38371..19d2b58bdda1bf 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 8285479dfb7a59..6fcc4f658ed542 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 b2a54a8831547c..f2e4029bd3dd5f 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 b568bf7a9d2507..db806776c64227 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ff572d075e0817..ba0fd3a5c7a826 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 d4bd2a6eb52cea..437f1c56523eb9 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 2e4215ac232e88..a585a19e827649 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 8c32261f432c2c..17e9b4daad27ba 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 21e5c93587448f..8fd9e99c6ae0ac 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 b6c0b8167a1dad..b601a5345dbf1d 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 af9aa19c3a5d0b..efd6e643c57a28 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-06-05 +date: 2024-06-09 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 8caed749fb1043..79a8d06a672412 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2024-06-05 +date: 2024-06-09 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 dfc236c0e90bf6..c40183f9a4bf7d 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 810eb30ba8afad..d05f93f0c2e8aa 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2024-06-05 +date: 2024-06-09 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 94aadceac51e7e..02f9651a410361 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 50c618b952bd2f..4c9dbb9328b769 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 728fb29444dd44..5b7ff9002e53f4 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 1ae92883413956..a2de8c7cc9e124 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 3a84584f63be8c..cd473b98dcda7a 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 2ea7feb3e6e131..a1176c64a3ed9b 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 86d6d1c3d158a4..a29b8d2a9f17d4 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2024-06-05 +date: 2024-06-09 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 8d3fee92f05315..b1368b4ced444d 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 9d94a7899c7a7a..410d0d57fab058 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 510af495000f5e..0fd931b1e44de6 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 a50930627d63ba..ea0f20b0a5ac6f 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 f16ade4e3aa79a..b939ba6a904429 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 3f1d9af8cf16d7..1f8374aa6b060d 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 dc3ed71976258f..4fb3831b5300bd 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2024-06-05 +date: 2024-06-09 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 512e8a5cc98bed..db87a077fab374 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 10a57360fb3e0d..0b37ed7b93e7ab 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 1209144c00d96a..3fedcee0acd269 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 5c8f9ab7d8e97b..72cbfddbab3175 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 9404348e113a3c..3017b2cd8c5aa3 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2024-06-05 +date: 2024-06-09 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 406bdb4117a16e..bfa0e3937f31a8 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 a4688633ef1074..a32c0fca5f41b0 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ba5224cb2da317..d401fdf3cd40f8 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2024-06-05 +date: 2024-06-09 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_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 8d7c70bfcafebd..6517dd714733ac 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index f4b9c3aae6e731..ef64aa6d2c6f48 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index 5f00ef37d81f8b..36590a7840c71a 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index d1b26ebeff3baa..fa65d64b212274 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index d5c40ec06a3413..ae5e5e8487f9f3 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index dbfd838f4512f7..0774786b940c15 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index 03b8942888c826..6585f2b50f7376 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index e159d96b314269..11c0513b04b754 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2024-06-05 +date: 2024-06-09 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 1b03974c743749..f47c5df9c3f3a7 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 a444f4d6748f06..2966ac6daf510e 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2024-06-05 +date: 2024-06-09 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 480e2cc306b3a4..25568e6e1d2298 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 2ae100beb279bd..b3064d9466969f 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 6476db47c83265..1eb9287dc028ff 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2024-06-05 +date: 2024-06-09 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 f1f00a609d99d4..d8a3659e4c2d87 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 1a1d42cdb69667..30b0982971b8c3 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2024-06-05 +date: 2024-06-09 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 ccfc107f999c5d..2787e01e453d3f 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-06-05 +date: 2024-06-09 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 e245b0704e48da..701ee4608145ee 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2024-06-05 +date: 2024-06-09 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 9a9af7001cf38e..384dbdbf609aa7 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 c92bcae9a5b5af..b6bebc46f42b4f 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 f1a96c6840a4c6..3eec1c9b397efe 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ab53cb4aa0ccf2..f5bf52f777cc8f 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 c76d477815de3c..b3b5a37206bf3f 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 75bb1d96b969a9..9bfe708ba00015 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 b6c34f17740aa2..470cc77a883f02 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2024-06-05 +date: 2024-06-09 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 f9e5de0734a2a0..5079f5646edd41 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2024-06-05 +date: 2024-06-09 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 d2bc29dc41c2a1..dacc960e7f97b2 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 ea711b2297d90b..643875902056ca 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 edf596c32409b6..fbb67a227e74c8 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2024-06-05 +date: 2024-06-09 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 36a685f5ab0ec3..e95922c8d2a637 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 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 6f289ebd0e7ae6..e8b74cc77d58c6 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index 45bc3cfaefe84f..b39c3c9c8b2834 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index d82314c4d7d427..82d158a51dc7d1 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 966e6516441ec9..3acdb571d52ba0 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 7ef10f4ec5c155..e36972f369e2d1 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 337aa766174325..b84f0c0ea04f85 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 2136bfacd3c970..8fb70499c6bb2f 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 74ace54ea75d16..8c7f7adaca70c3 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 2697b9a0db2ea3..6c074c00ff3833 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2024-06-05 +date: 2024-06-09 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 75f3dfbffdb57c..88695c62852454 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 4e69f1c6d4e48b..5f54e5892115b5 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2024-06-05 +date: 2024-06-09 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 86ceeafe3c82c9..29d53491a4f837 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 53e240cbf19c46..0624a998722ba8 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-06-05 +date: 2024-06-09 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 1af921f94178dc..aa0b84726889b1 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-06-05 +date: 2024-06-09 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 173b39a085c9a2..f6bdee64fac63f 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index a88979f63fb752..f00effd1be1471 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index ea60b222e54868..06af892ec80eea 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 300abd336b96e6..77bafc9249c920 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 3e7d3b40377a6a..c1d9fa9983c819 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 6fe149edabfa1c..513ae0ce1d8f80 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2024-06-05 +date: 2024-06-09 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 54a91cc24402f7..b14d7088f8701a 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-06-05 +date: 2024-06-09 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 7d323693b396c4..3685255e9868a3 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index b049d34d830131..db5243f2e3f99a 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index e429cfda372453..273f766590437e 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-06-05 +date: 2024-06-09 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 3b74723f63e0ef..df66618ac220bf 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-06-05 +date: 2024-06-09 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 1e2f3725851d73..b7c3b09b2d6780 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-06-05 +date: 2024-06-09 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 dfc485abd4be6a..d2308418ebeb6b 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index ac350787ab8e74..3a5a5a450b9821 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index 5e8e8ae5ad8ea4..7e41ac4468dc51 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index c98676fe8b854a..0d3523a67dbf51 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-06-05 +date: 2024-06-09 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 97487c07eb1f35..083a237749b84f 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-06-05 +date: 2024-06-09 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 827209c6352842..3e3ef26c3115e1 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-06-05 +date: 2024-06-09 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 ff442723861842..edce360158a6e2 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-06-05 +date: 2024-06-09 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 52d0a96c630aef..8072d3d0205050 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2024-06-05 +date: 2024-06-09 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 ef4ba383cd4cf6..ef02db734bc92d 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2024-06-05 +date: 2024-06-09 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 dca12cc50a44d8..6a3133e6bd5a90 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2024-06-05 +date: 2024-06-09 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 542ad1d1631964..2320e68350dc32 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 7104e5f24c812a..47875158ee62f1 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 56152abc3712dd..84badfab59a723 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -840,7 +840,7 @@ "label": "fleet", "description": [], "signature": [ - "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; readonly scalingKubernetesResourcesAndLimits: string; readonly roleAndPrivileges: string; }" + "{ readonly beatsAgentComparison: string; readonly guide: string; readonly fleetServer: string; readonly fleetServerAddFleetServer: string; readonly esSettings: string; readonly settings: string; readonly logstashSettings: string; readonly kafkaSettings: string; readonly settingsFleetServerHostSettings: string; readonly settingsFleetServerProxySettings: string; readonly troubleshooting: string; readonly elasticAgent: string; readonly datastreams: string; readonly datastreamsILM: string; readonly datastreamsNamingScheme: string; readonly datastreamsManualRollover: string; readonly datastreamsTSDS: string; readonly datastreamsTSDSMetrics: string; readonly installElasticAgent: string; readonly installElasticAgentStandalone: string; readonly packageSignatures: string; readonly upgradeElasticAgent: string; readonly learnMoreBlog: string; readonly apiKeysLearnMore: string; readonly onPremRegistry: string; readonly secureLogstash: string; readonly agentPolicy: string; readonly api: string; readonly uninstallAgent: string; readonly installAndUninstallIntegrationAssets: string; readonly elasticAgentInputConfiguration: string; readonly policySecrets: string; readonly remoteESOoutput: string; readonly performancePresets: string; readonly scalingKubernetesResourcesAndLimits: string; readonly roleAndPrivileges: string; readonly proxiesSettings: 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 9f29b4dce871c4..e7764624c2307f 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2024-06-05 +date: 2024-06-09 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 e9a1b5771f4b38..7d20dd01d7744f 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 7f1c8a5d179146..c635fe607cc53a 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2024-06-05 +date: 2024-06-09 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 471b4bd02994cc..834db1f446a424 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 0ff7c3de0a2077..6d2c8056e08d6e 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2024-06-05 +date: 2024-06-09 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 76fa3dc4999c00..e9a84129e0d475 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 fa56282c7d4bd3..b5da5cf95b37a3 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-06-05 +date: 2024-06-09 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 793413695b3e50..59cb76d8b3fdef 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.devdocs.json b/api_docs/kbn_entities_schema.devdocs.json index 8c34887cde94e9..b021defec9a79a 100644 --- a/api_docs/kbn_entities_schema.devdocs.json +++ b/api_docs/kbn_entities_schema.devdocs.json @@ -63,7 +63,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - "; name: string; managed: boolean; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -71,7 +71,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }" + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; latest?: { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; } | undefined; }" ], "path": "x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts", "deprecated": false, @@ -226,7 +226,7 @@ "label": "durationSchema", "description": [], "signature": [ - "Zod.ZodEffects string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }, string>" + "Zod.ZodEffects" ], "path": "x-pack/packages/kbn-entities-schema/src/schema/common.ts", "deprecated": false, @@ -249,7 +249,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - ">; filter: Zod.ZodOptional; indexPatterns: Zod.ZodArray; identityFields: Zod.ZodArray, Zod.ZodEffects]>, \"many\">; identityTemplate: Zod.ZodString; metadata: Zod.ZodOptional; limit: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { source: string; destination?: string | undefined; limit?: number | undefined; }, { source: string; destination?: string | undefined; limit?: number | undefined; }>, Zod.ZodEffects]>, \"many\">>; metrics: Zod.ZodOptional; filter: Zod.ZodOptional; indexPatterns: Zod.ZodArray; identityFields: Zod.ZodArray, Zod.ZodEffects]>, \"many\">; displayNameTemplate: Zod.ZodString; metadata: Zod.ZodOptional; limit: Zod.ZodOptional>; }, \"strip\", Zod.ZodTypeAny, { source: string; destination?: string | undefined; limit?: number | undefined; }, { source: string; destination?: string | undefined; limit?: number | undefined; }>, Zod.ZodEffects]>, \"many\">>; metrics: Zod.ZodOptional, \"many\">>; staticFields: Zod.ZodOptional>; lookback: Zod.ZodEffects string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }, string>; timestampField: Zod.ZodString; managed: Zod.ZodDefault>; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: ", + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }>, \"many\">>; staticFields: Zod.ZodOptional>; managed: Zod.ZodDefault>; history: Zod.ZodObject<{ timestampField: Zod.ZodString; interval: Zod.ZodEffects, moment.Duration, string>; lookbackPeriod: Zod.ZodOptional>; settings: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>; latest: Zod.ZodOptional; syncDelay: Zod.ZodOptional; frequency: Zod.ZodOptional; }, \"strip\", Zod.ZodTypeAny, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }, { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>>; }, \"strip\", Zod.ZodTypeAny, { id: string; type: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -297,7 +297,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - "; name: string; managed: boolean; indexPatterns: string[]; timestampField: string; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: { toJSON: () => string; clone(): moment.Duration; humanize(argWithSuffix?: boolean | undefined, argThresholds?: moment.argThresholdOpts | undefined): string; humanize(argThresholds?: moment.argThresholdOpts | undefined): string; abs(): moment.Duration; as(units: moment.unitOfTime.Base): number; get(units: moment.unitOfTime.Base): number; milliseconds(): number; asMilliseconds(): number; seconds(): number; asSeconds(): number; minutes(): number; asMinutes(): number; hours(): number; asHours(): number; days(): number; asDays(): number; weeks(): number; asWeeks(): number; months(): number; asMonths(): number; years(): number; asYears(): number; add(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; subtract(inp?: moment.DurationInputArg1, unit?: moment.unitOfTime.DurationConstructor | undefined): moment.Duration; locale(): string; locale(locale: moment.LocaleSpecifier): moment.Duration; localeData(): moment.Locale; toISOString(): string; isValid(): boolean; lang(locale: moment.LocaleSpecifier): moment.Moment; lang(): moment.Locale; toIsoString(): string; format: moment.Format; }; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; name: string; history: { interval: moment.Duration; timestampField: string; lookbackPeriod?: moment.Duration | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; managed: boolean; indexPatterns: string[]; identityFields: ({ field: string; optional: boolean; } | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: ({ source: string; destination?: string | undefined; limit?: number | undefined; } | { source: string; destination: string; limit: number; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -305,7 +305,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }, { id: string; type: ", + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; latest?: { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; } | undefined; }, { id: string; type: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -313,7 +313,7 @@ "section": "def-common.EntityType", "text": "EntityType" }, - "; name: string; indexPatterns: string[]; timestampField: string; identityFields: (string | { field: string; optional: boolean; })[]; identityTemplate: string; lookback: string; description?: string | undefined; filter?: string | undefined; metadata?: (string | { source: string; destination?: string | undefined; limit?: number | undefined; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", + "; name: string; history: { interval: string; timestampField: string; lookbackPeriod?: string | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }; indexPatterns: string[]; identityFields: (string | { field: string; optional: boolean; })[]; displayNameTemplate: string; description?: string | undefined; filter?: string | undefined; metadata?: (string | { source: string; destination?: string | undefined; limit?: number | undefined; })[] | undefined; metrics?: { name: string; metrics: ({ name: string; field: string; aggregation: ", { "pluginId": "@kbn/entities-schema", "scope": "common", @@ -321,7 +321,7 @@ "section": "def-common.BasicAggregations", "text": "BasicAggregations" }, - "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; managed?: boolean | undefined; settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; }>" + "; filter?: string | undefined; } | { name: string; aggregation: \"doc_count\"; filter?: string | undefined; } | { name: string; field: string; percentile: number; aggregation: \"percentile\"; filter?: string | undefined; })[]; equation: string; }[] | undefined; staticFields?: Record | undefined; managed?: boolean | undefined; latest?: { settings?: { syncField?: string | undefined; syncDelay?: string | undefined; frequency?: string | undefined; } | undefined; } | undefined; }>" ], "path": "x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts", "deprecated": false, @@ -330,13 +330,28 @@ }, { "parentPluginId": "@kbn/entities-schema", - "id": "def-common.entitySchema", + "id": "def-common.entityHistorySchema", "type": "Object", "tags": [], - "label": "entitySchema", + "label": "entityHistorySchema", "description": [], "signature": [ - "Zod.ZodIntersection; identityFields: Zod.ZodArray; metric: Zod.ZodRecord; spaceId: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { id: string; spaceId: string; indexPatterns: string[]; metric: Record; identityFields: string[]; }, { id: string; spaceId: string; indexPatterns: string[]; metric: Record; identityFields: string[]; }>; }, \"strip\", Zod.ZodTypeAny, { entity: { id: string; spaceId: string; indexPatterns: string[]; metric: Record; identityFields: string[]; }; }, { entity: { id: string; spaceId: string; indexPatterns: string[]; metric: Record; identityFields: string[]; }; }>, Zod.ZodRecord>>" + "Zod.ZodIntersection; displayName: Zod.ZodString; spaceId: Zod.ZodString; metrics: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }, { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }>; \"@timestamp\": Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { \"@timestamp\": string; entity: { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }; }, { \"@timestamp\": string; entity: { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }; }>, Zod.ZodRecord>>" + ], + "path": "x-pack/packages/kbn-entities-schema/src/schema/entity.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/entities-schema", + "id": "def-common.entitySummarySchema", + "type": "Object", + "tags": [], + "label": "entitySummarySchema", + "description": [], + "signature": [ + "Zod.ZodIntersection; displayName: Zod.ZodString; spaceId: Zod.ZodString; metrics: Zod.ZodRecord; }, \"strip\", Zod.ZodTypeAny, { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }, { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }>; lastSeenTimestamp: Zod.ZodString; firstSeenTimestamp: Zod.ZodString; }, \"strip\", Zod.ZodTypeAny, { entity: { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }; lastSeenTimestamp: string; firstSeenTimestamp: string; }, { entity: { id: string; spaceId: string; metrics: Record; displayName: string; identityFields: string[]; }; lastSeenTimestamp: string; firstSeenTimestamp: string; }>, Zod.ZodRecord>>" ], "path": "x-pack/packages/kbn-entities-schema/src/schema/entity.ts", "deprecated": false, diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 59901650a5878b..65849ce02d96a9 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 19 | 0 | 19 | 0 | +| 20 | 0 | 20 | 0 | ## Common diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index bb433a7bc37b93..6cf2d42d7f9dd7 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2024-06-05 +date: 2024-06-09 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 908f873291e795..d3f932b88e6832 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2024-06-05 +date: 2024-06-09 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 5331d3263d2ca8..48db028ed0f7c3 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2024-06-05 +date: 2024-06-09 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 a2e06984276b5b..49d09d97a36f8d 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.devdocs.json b/api_docs/kbn_es_types.devdocs.json index 1caa6b1fda21fd..09998ea2bf973c 100644 --- a/api_docs/kbn_es_types.devdocs.json +++ b/api_docs/kbn_es_types.devdocs.json @@ -125,10 +125,10 @@ }, { "parentPluginId": "@kbn/es-types", - "id": "def-common.ESQLSearchReponse", + "id": "def-common.ESQLSearchResponse", "type": "Interface", "tags": [], - "label": "ESQLSearchReponse", + "label": "ESQLSearchResponse", "description": [], "path": "packages/kbn-es-types/src/search.ts", "deprecated": false, @@ -136,7 +136,7 @@ "children": [ { "parentPluginId": "@kbn/es-types", - "id": "def-common.ESQLSearchReponse.columns", + "id": "def-common.ESQLSearchResponse.columns", "type": "Array", "tags": [], "label": "columns", @@ -157,7 +157,7 @@ }, { "parentPluginId": "@kbn/es-types", - "id": "def-common.ESQLSearchReponse.all_columns", + "id": "def-common.ESQLSearchResponse.all_columns", "type": "Array", "tags": [], "label": "all_columns", @@ -178,7 +178,7 @@ }, { "parentPluginId": "@kbn/es-types", - "id": "def-common.ESQLSearchReponse.values", + "id": "def-common.ESQLSearchResponse.values", "type": "Array", "tags": [], "label": "values", diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 5b2281df541feb..d5e0c449a7613d 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2024-06-05 +date: 2024-06-09 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 f6298db9fe5024..a672881632dfc4 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 091df034e0671c..55cf7501bc816b 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.devdocs.json b/api_docs/kbn_esql_utils.devdocs.json index 9619ecf0372969..ea0d6d6a8f6db6 100644 --- a/api_docs/kbn_esql_utils.devdocs.json +++ b/api_docs/kbn_esql_utils.devdocs.json @@ -599,8 +599,8 @@ "pluginId": "@kbn/es-types", "scope": "common", "docId": "kibKbnEsTypesPluginApi", - "section": "def-common.ESQLSearchReponse", - "text": "ESQLSearchReponse" + "section": "def-common.ESQLSearchResponse", + "text": "ESQLSearchResponse" }, "; params: ", { diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index d86d7368656c2a..3657a91e67b8d9 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index 7f16649c60e956..cf01d0d2e1fade 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index d31fa1761b33aa..14e56cd6646eba 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-06-05 +date: 2024-06-09 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 737e7be8bacb5c..807ab55048e178 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_expandable_flyout.devdocs.json index 8fbc1787e2d686..88d40c2acec004 100644 --- a/api_docs/kbn_expandable_flyout.devdocs.json +++ b/api_docs/kbn_expandable_flyout.devdocs.json @@ -574,6 +574,22 @@ "path": "packages/kbn-expandable-flyout/src/index.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/expandable-flyout", + "id": "def-public.ExpandableFlyoutProps.onClose", + "type": "Function", + "tags": [], + "label": "onClose", + "description": [ + "\nCallback function to let application's code the flyout is closed" + ], + "signature": [ + "((event: MouseEvent | KeyboardEvent | TouchEvent) => void) | undefined" + ], + "path": "packages/kbn-expandable-flyout/src/index.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 1ddc5334f12dbe..1bbea58c498614 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-threat-hunting-investigations](https://github.com/org | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 38 | 0 | 14 | 1 | +| 39 | 0 | 14 | 1 | ## Client diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 2bee7450a19aac..cecc71ce5ab01e 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2024-06-05 +date: 2024-06-09 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 2fa70663accb40..890b780e67784f 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 56156e751deb21..547653aab56a03 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2024-06-05 +date: 2024-06-09 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_formatters.mdx b/api_docs/kbn_formatters.mdx index c3870e4a2f2693..1cb73aae05b5d2 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 6d4e353d7ca175..a2f19f37e480c2 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2024-06-05 +date: 2024-06-09 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 317e7f4ca94cb0..ec6d2ecd04e1d9 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-06-05 +date: 2024-06-09 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 7f61054764b82b..cdd51cdcd2deb9 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2024-06-05 +date: 2024-06-09 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 7250a05ad36e41..f22214e3a63d59 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-06-05 +date: 2024-06-09 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 83d556e764f576..8ae017b0fa3973 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index 7b02b984ce7bb5..f68982ecef66be 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 7a4ab6376669fd..51287160808ed8 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2024-06-05 +date: 2024-06-09 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 05a5c4d7305410..154da1ed5bb010 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2024-06-05 +date: 2024-06-09 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 714f3d23f90f64..5ac2802ca82954 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 3c860342b21be8..79b01a04ca2973 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2024-06-05 +date: 2024-06-09 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 eb0b9e3d9bb95b..2e2591ff737592 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2024-06-05 +date: 2024-06-09 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 df3a9908ca90e8..7e8b47c3c8edac 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2024-06-05 +date: 2024-06-09 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 cade74c3c2c95a..cd1f569088be32 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2024-06-05 +date: 2024-06-09 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 d582dcfda04d6c..8335309a6afece 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2024-06-05 +date: 2024-06-09 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 dc1262938e1fd1..3d3cca7b58e934 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management.mdx b/api_docs/kbn_index_management.mdx index dc9598fef8099e..daac4dacd15856 100644 --- a/api_docs/kbn_index_management.mdx +++ b/api_docs/kbn_index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management title: "@kbn/index-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management'] --- import kbnIndexManagementObj from './kbn_index_management.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index e3a2ac11857317..805f0b0f61d3b2 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index 495e5f4eceb338..eea83c947c9cf9 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2024-06-05 +date: 2024-06-09 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 f6766401f9a45a..ec0890de4660ba 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.devdocs.json b/api_docs/kbn_io_ts_utils.devdocs.json index a175ad37ceda5e..62c84e6da030d8 100644 --- a/api_docs/kbn_io_ts_utils.devdocs.json +++ b/api_docs/kbn_io_ts_utils.devdocs.json @@ -942,6 +942,22 @@ } ], "objects": [ + { + "parentPluginId": "@kbn/io-ts-utils", + "id": "def-common.arrayToStringRt", + "type": "Object", + "tags": [], + "label": "arrayToStringRt", + "description": [], + "signature": [ + "Type", + "" + ], + "path": "packages/kbn-io-ts-utils/src/array_to_string_rt/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/io-ts-utils", "id": "def-common.DateFromStringOrNumber", diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 826a2e015d92ce..6ac80c6bd90406 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 59 | 0 | 59 | 4 | +| 60 | 0 | 60 | 4 | ## Common diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index 340b97cb50f357..78e6e819c0e026 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 6b9d491326ec20..4c633fe1a72d8e 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2024-06-05 +date: 2024-06-09 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 012183e69c95fc..c8b64ab477efe3 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2024-06-05 +date: 2024-06-09 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 373423e47847f5..28d80c0e5b38c2 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2024-06-05 +date: 2024-06-09 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 dabceb1ea1608f..8c192dbfc8e563 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2024-06-05 +date: 2024-06-09 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 0f87ef6a9369b6..9561b20caae488 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2024-06-05 +date: 2024-06-09 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 9f651485f2b0bb..5f70ba7dc0e8ac 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index 7acc56e64569ff..69fa5235b4227f 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index b4d82c56b89011..51fda0b46b40fc 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2024-06-05 +date: 2024-06-09 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 876167ef55c62b..9c7c70d4d26f70 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index d0ca0747d828ff..8f3a20185c2d9c 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index f043a347ad6e19..30aaf877e419f5 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2024-06-05 +date: 2024-06-09 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 054e8409da644a..b1140aa266ebfc 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-06-05 +date: 2024-06-09 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 b3193118a2ad3e..ff62deda2e57b3 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-06-05 +date: 2024-06-09 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 6d09e5b6460001..f850d37d63d5f4 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-06-05 +date: 2024-06-09 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 25462b5124f725..eebb0d72011e69 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-06-05 +date: 2024-06-09 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 0ad429d7a47c47..f1199708450a9c 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-06-05 +date: 2024-06-09 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 eb9f6388599906..9f8cd607a9bbb0 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-06-05 +date: 2024-06-09 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 e794f3034430b4..0b51e35fe0354b 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-06-05 +date: 2024-06-09 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 d61d0589569296..2b9f2112606ddc 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-06-05 +date: 2024-06-09 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 f44ea4a9921d82..c086e01a8202dc 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-06-05 +date: 2024-06-09 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 344fe3a3403963..fc9336ec7e739e 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-06-05 +date: 2024-06-09 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 c2eea4430459a4..dfeeaedff9b7bc 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-06-05 +date: 2024-06-09 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 f1aad633aaf199..1a39f1d58bd576 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-06-05 +date: 2024-06-09 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 d504314d55d07e..6b3df133538426 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2024-06-05 +date: 2024-06-09 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 15d76b62ed5810..a27d1545eebcb7 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 3554304c217d98..9d54ed5457a786 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 5865cb24bf3b01..1dbcd221430930 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2024-06-05 +date: 2024-06-09 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_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index d673303b475f18..c50639f2c9bce6 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index b6203d8e0f155f..de4f2adbcb863c 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-06-05 +date: 2024-06-09 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 a6e57e27df44eb..c30e62fafc1d4e 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-06-05 +date: 2024-06-09 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 c0a8a560dc152b..b6d63a0256b496 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 efa311c6e9b007..84836597d1f81a 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-06-05 +date: 2024-06-09 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 40a88f0dd0d365..b5db47fdc2a52f 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2024-06-05 +date: 2024-06-09 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 4c799a558a7e85..7664aef6055c10 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 f16123340b054d..f4f989eeb7e237 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 d8a77b898ba13b..3734c37678a0ba 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-06-05 +date: 2024-06-09 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 f1a36981b22028..bb0c4952f38515 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2024-06-05 +date: 2024-06-09 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 7715a0687b19a1..d9d6112152f30c 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2024-06-05 +date: 2024-06-09 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 4a3e9a2105b751..639e505a2e2c1b 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-06-05 +date: 2024-06-09 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 6e0ad19a7906ea..23df077beca873 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2024-06-05 +date: 2024-06-09 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 27245cd57556e7..898af863d5ec3c 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2024-06-05 +date: 2024-06-09 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 14a809867bea5d..4dd48e4b54d8f6 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 b20e6fda44fcbb..d88bf88006d844 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 c0c83f836050d7..be6cff7cd50138 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 dffa3a3fa4c023..672da742c32b14 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 09fe9abea94224..18f24190f80875 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 ca597a6a268ce5..58f4e2867c4716 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2024-06-05 +date: 2024-06-09 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_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index 353abe9a689817..ecf49714e744b1 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 8828855ac2d518..5a8765164742ad 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 1e2375b0370d15..d231507c8cb4f5 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-06-05 +date: 2024-06-09 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 b27fa8f78b94b0..b784d97933b2f9 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index c07f760c663503..8e8c16fba8fdbd 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 8c24449f2deb5e..96bad058199ae6 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2024-06-05 +date: 2024-06-09 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 c7ecfeb10d49b0..dc77e04e55d5c2 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2024-06-05 +date: 2024-06-09 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 a78aad408ddfa1..f03280a83dffa8 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2024-06-05 +date: 2024-06-09 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 c373a90b0895e8..d0178017a98bf9 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-06-05 +date: 2024-06-09 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 ee106ede7c1e5b..675c5d065e03e8 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_openapi_bundler.devdocs.json index 08edc2847eb069..1c2e10dea8bdf7 100644 --- a/api_docs/kbn_openapi_bundler.devdocs.json +++ b/api_docs/kbn_openapi_bundler.devdocs.json @@ -27,7 +27,7 @@ "label": "bundle", "description": [], "signature": [ - "({ sourceGlob, outputFilePath, specInfo, }: ", + "({ sourceGlob, outputFilePath, options, }: ", { "pluginId": "@kbn/openapi-bundler", "scope": "common", @@ -46,7 +46,7 @@ "id": "def-common.bundle.$1", "type": "Object", "tags": [], - "label": "{\n sourceGlob,\n outputFilePath = 'bundled-{version}.schema.yaml',\n specInfo,\n}", + "label": "{\n sourceGlob,\n outputFilePath = 'bundled-{version}.schema.yaml',\n options,\n}", "description": [], "signature": [ { @@ -103,15 +103,13 @@ }, { "parentPluginId": "@kbn/openapi-bundler", - "id": "def-common.BundlerConfig.specInfo", + "id": "def-common.BundlerConfig.options", "type": "Object", "tags": [], - "label": "specInfo", + "label": "options", "description": [], "signature": [ - "Omit, \"version\"> | undefined" + "BundleOptions | undefined" ], "path": "packages/kbn-openapi-bundler/src/openapi_bundler.ts", "deprecated": false, diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 442ca3c5e69d0b..171a9cea8ee5ef 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-06-05 +date: 2024-06-09 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 307018c9ce66f7..7da63a4fb6e1f8 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-06-05 +date: 2024-06-09 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 a4c78d1bc7f872..f02f5a2d138cf0 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2024-06-05 +date: 2024-06-09 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 52a2889f369368..222bdeee326c16 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2024-06-05 +date: 2024-06-09 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 7bc7a428cbf8a7..e32ee53e4c08d9 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2024-06-05 +date: 2024-06-09 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 e40d5be6ab9b63..858e4dadad2fcb 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-06-05 +date: 2024-06-09 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 ee381d12a13a59..abb0ea671632f7 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2024-06-05 +date: 2024-06-09 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_check.mdx b/api_docs/kbn_plugin_check.mdx index 69086d9bfc213c..18ff818c9f7cd1 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 26e31258fdd0bb..393a663f79adbc 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2024-06-05 +date: 2024-06-09 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 d4a18d5bec71a8..c0f821c0db410f 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.devdocs.json b/api_docs/kbn_presentation_containers.devdocs.json index 1568d0f5561030..716fbb0bf73cd5 100644 --- a/api_docs/kbn_presentation_containers.devdocs.json +++ b/api_docs/kbn_presentation_containers.devdocs.json @@ -384,6 +384,101 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis", + "type": "Function", + "tags": [], + "label": "combineCompatibleChildrenApis", + "description": [], + "signature": [ + "(api: unknown, observableKey: keyof ApiType, isCompatible: (api: unknown) => api is ApiType, emptyState: PublishingSubjectType, flattenMethod?: ((array: PublishingSubjectType[]) => PublishingSubjectType) | undefined) => ", + "Observable", + "" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis.$1", + "type": "Unknown", + "tags": [], + "label": "api", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis.$2", + "type": "Uncategorized", + "tags": [], + "label": "observableKey", + "description": [], + "signature": [ + "keyof ApiType" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis.$3", + "type": "Function", + "tags": [], + "label": "isCompatible", + "description": [], + "signature": [ + "(api: unknown) => api is ApiType" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis.$4", + "type": "Uncategorized", + "tags": [], + "label": "emptyState", + "description": [], + "signature": [ + "PublishingSubjectType" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-containers", + "id": "def-common.combineCompatibleChildrenApis.$5", + "type": "Function", + "tags": [], + "label": "flattenMethod", + "description": [], + "signature": [ + "((array: PublishingSubjectType[]) => PublishingSubjectType) | undefined" + ], + "path": "packages/presentation/presentation_containers/interfaces/presentation_container.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-containers", "id": "def-common.getContainerParentFromAPI", @@ -1177,17 +1272,7 @@ "section": "def-common.PresentationContainer", "text": "PresentationContainer" }, - " extends Partial<", - { - "pluginId": "@kbn/presentation-publishing", - "scope": "common", - "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishesViewMode", - "text": "PublishesViewMode" - }, - " & ", - "PublishesSettings", - ">,", + " extends ", { "pluginId": "@kbn/presentation-containers", "scope": "common", diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 66e71b3bff34cc..cc00369519039a 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 76 | 0 | 65 | 1 | +| 82 | 0 | 71 | 0 | ## Common diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 7852cd38d7ad42..a91b622e344505 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -704,6 +704,46 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.apiPublishesFilters", + "type": "Function", + "tags": [], + "label": "apiPublishesFilters", + "description": [], + "signature": [ + "(unknownApi: unknown) => unknownApi is ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" + } + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.apiPublishesFilters.$1", + "type": "Unknown", + "tags": [], + "label": "unknownApi", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.apiPublishesPanelDescription", @@ -4275,6 +4315,384 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.PublishesFilters", + "type": "Interface", + "tags": [], + "label": "PublishesFilters", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.PublishesFilters.filters$", + "type": "Object", + "tags": [], + "label": "filters$", + "description": [], + "signature": [ + "{ source: ", + "Observable", + " | undefined; readonly value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined; error: (err: any) => void; forEach: { (next: (value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined) => void): Promise; (next: (value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined) => void, promiseCtor: PromiseConstructorLike): Promise; }; complete: () => void; getValue: () => ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined; pipe: { (): ", + "Observable", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + "): ", + "Observable", + "; (op1: ", + "OperatorFunction", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, A>, op2: ", + "OperatorFunction", + ", op3: ", + "OperatorFunction", + ", op4: ", + "OperatorFunction", + ", op5: ", + "OperatorFunction", + ", op6: ", + "OperatorFunction", + ", op7: ", + "OperatorFunction", + ", op8: ", + "OperatorFunction", + ", op9: ", + "OperatorFunction", + ", ...operations: ", + "OperatorFunction", + "[]): ", + "Observable", + "; }; closed: boolean; observers: ", + "Observer", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>[]; isStopped: boolean; hasError: boolean; thrownError: any; lift: (operator: ", + "Operator", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined, R>) => ", + "Observable", + "; unsubscribe: () => void; readonly observed: boolean; asObservable: () => ", + "Observable", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; operator: ", + "Operator", + " | undefined; subscribe: { (observerOrNext?: Partial<", + "Observer", + "<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>> | ((value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined) => void) | undefined): ", + "Subscription", + "; (next?: ((value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined) => void) | null | undefined, error?: ((error: any) => void) | null | undefined, complete?: (() => void) | null | undefined): ", + "Subscription", + "; }; toPromise: { (): Promise<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; (PromiseCtor: PromiseConstructor): Promise<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; (PromiseCtor: PromiseConstructorLike): Promise<", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined>; }; }" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.PublishesPanelDescription", @@ -5402,6 +5820,23 @@ "tags": [], "label": "PublishesTimeRange", "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishesTimeRange", + "text": "PublishesTimeRange" + }, + " extends ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishesTimeslice", + "text": "PublishesTimeslice" + } + ], "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, @@ -5790,10 +6225,24 @@ "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false - }, + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.PublishesTimeslice", + "type": "Interface", + "tags": [], + "label": "PublishesTimeslice", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "@kbn/presentation-publishing", - "id": "def-common.PublishesTimeRange.timeslice$", + "id": "def-common.PublishesTimeslice.timeslice$", "type": "Object", "tags": [], "label": "timeslice$", @@ -6712,23 +7161,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -6818,23 +7259,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -7119,7 +7552,7 @@ "label": "ViewMode", "description": [], "signature": [ - "\"edit\" | \"view\" | \"print\" | \"preview\"" + "\"edit\" | \"view\" | \"preview\" | \"print\"" ], "path": "packages/presentation/presentation_publishing/interfaces/publishes_view_mode.ts", "deprecated": false, diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index 103701c42a2978..16987f97b8388d 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 204 | 0 | 169 | 5 | +| 209 | 0 | 174 | 5 | ## Common diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index f4a95cc47e2cb2..160063bc4ae91e 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 6e148fe04ec5e9..33278b2d6bb091 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2024-06-05 +date: 2024-06-09 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 6c14bdb52f93df..767eb6103df92b 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index ae03c6634ae738..0bfa9101027c1f 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 6555bc962eacdf..4dd6986146738c 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-06-05 +date: 2024-06-09 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 f5cd026d1ccf64..242b9ad3d79d4d 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-06-05 +date: 2024-06-09 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 eca3a14649ae00..fe51c4231652b6 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-06-05 +date: 2024-06-09 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 e887d3700a0a10..5308e8ce42f122 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-06-05 +date: 2024-06-09 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 1f6aa871def9e1..1a035643158db3 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-06-05 +date: 2024-06-09 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 517bac5214506b..c76d807ee7a4bb 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-06-05 +date: 2024-06-09 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 1f6ff143dda3c2..b0295aacad8368 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2024-06-05 +date: 2024-06-09 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 75518319fda314..5901396803f284 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2024-06-05 +date: 2024-06-09 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 dbfe238ebea39d..85afee07d77617 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2024-06-05 +date: 2024-06-09 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 cc51cfca0b103e..f01d85b151b121 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2024-06-05 +date: 2024-06-09 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 3f522dea4337b9..cecc970d219577 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index 67e877a9367061..75ea91ac3b25c4 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 2dae98875726cb..2898c5c610c116 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-06-05 +date: 2024-06-09 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 63c433c3afc7b4..033822c35ddfbe 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-06-05 +date: 2024-06-09 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 31cf1a9407b616..6c268ffd9cc38f 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-06-05 +date: 2024-06-09 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 80da7f8bb2e855..698d0afc0c2c09 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-06-05 +date: 2024-06-09 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 4ef75c51e8c88a..4163dd5045e608 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-06-05 +date: 2024-06-09 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 010968f87653dc..7ffb7be86294e8 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-06-05 +date: 2024-06-09 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 2ae2cb325add64..e4b115270c0f6f 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-06-05 +date: 2024-06-09 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 b833e963ca6a5e..d0db21f1076a7f 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-06-05 +date: 2024-06-09 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 6e587f33910afc..741b0b683355b4 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-06-05 +date: 2024-06-09 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 6fa13a08cdb41c..efc192aece7843 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-06-05 +date: 2024-06-09 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 c4837bf0ac084a..1c3f04b33c44ac 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index 5350f7213d7d53..076942c3963dc6 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index ab34dc5ce6af55..b60f12ef93c83f 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 1f90b2a663d263..e33963887e6ab9 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-06-05 +date: 2024-06-09 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 f6cf002bf43fad..d6914939fce429 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 955be246d9bbd6..46bfb49123a40e 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2024-06-05 +date: 2024-06-09 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 7b1f8c78f5a3f1..2ba0656357cc7c 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_search_connectors.devdocs.json index 1e94d2d2d2d874..6e88d1a9bde29d 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -279,7 +279,7 @@ "section": "def-common.IngestPipelineParams", "text": "IngestPipelineParams" }, - " | undefined; serviceType?: string | null | undefined; instant_response?: boolean | undefined; }) => Promise<", + " | undefined; serviceType?: string | null | undefined; }) => Promise<", { "pluginId": "@kbn/search-connectors", "scope": "common", @@ -454,20 +454,6 @@ "path": "packages/kbn-search-connectors/lib/create_connector.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "@kbn/search-connectors", - "id": "def-common.createConnector.$2.instant_response", - "type": "CompoundType", - "tags": [], - "label": "instant_response", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "packages/kbn-search-connectors/lib/create_connector.ts", - "deprecated": false, - "trackAdoption": false } ] } diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 895ac71e0cf77c..36618bad5d8ece 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-ki | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3688 | 0 | 3688 | 0 | +| 3687 | 0 | 3687 | 0 | ## Common diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index b2bd33803034cb..62d77f0abbadff 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-06-05 +date: 2024-06-09 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 3e18a26df04a91..8d5d51a6b6fa3d 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-06-05 +date: 2024-06-09 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 d70a659e737840..18d91c75d278a3 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index 59d4b3fdead401..b327d7861ad785 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index c15d54f4973cfc..32b639ea0130c0 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 097964a3d6192a..74889e3c89cd70 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_security_plugin_types_public.devdocs.json index b09fb5fe59ed42..6c39e672663189 100644 --- a/api_docs/kbn_security_plugin_types_public.devdocs.json +++ b/api_docs/kbn_security_plugin_types_public.devdocs.json @@ -90,6 +90,28 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.AuthorizationServiceSetup.roles", + "type": "Object", + "tags": [], + "label": "roles", + "description": [ + "\nA set of methods to work with Kibana user roles." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.RolesAPIClient", + "text": "RolesAPIClient" + } + ], + "path": "x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -165,6 +187,210 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolePutPayload", + "type": "Interface", + "tags": [], + "label": "RolePutPayload", + "description": [], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolePutPayload.role", + "type": "Object", + "tags": [], + "label": "role", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.Role", + "text": "Role" + } + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolePutPayload.createOnly", + "type": "CompoundType", + "tags": [], + "label": "createOnly", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient", + "type": "Interface", + "tags": [], + "label": "RolesAPIClient", + "description": [], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.getRoles", + "type": "Function", + "tags": [], + "label": "getRoles", + "description": [], + "signature": [ + "() => Promise<", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.Role", + "text": "Role" + }, + "[]>" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.getRole", + "type": "Function", + "tags": [], + "label": "getRole", + "description": [], + "signature": [ + "(roleName: string) => Promise<", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.Role", + "text": "Role" + }, + ">" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.getRole.$1", + "type": "string", + "tags": [], + "label": "roleName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.deleteRole", + "type": "Function", + "tags": [], + "label": "deleteRole", + "description": [], + "signature": [ + "(roleName: string) => Promise" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.deleteRole.$1", + "type": "string", + "tags": [], + "label": "roleName", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.saveRole", + "type": "Function", + "tags": [], + "label": "saveRole", + "description": [], + "signature": [ + "(payload: ", + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.RolePutPayload", + "text": "RolePutPayload" + }, + ") => Promise" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.saveRole.$1", + "type": "Object", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.RolePutPayload", + "text": "RolePutPayload" + } + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-public", "id": "def-public.SecurityNavControlServiceStart", @@ -271,10 +497,12 @@ "parentPluginId": "@kbn/security-plugin-types-public", "id": "def-public.SecurityPluginSetup.authc", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authc", "description": [ - "\nExposes authentication information about the currently logged in user." + "\nExposes authentication information about the currently logged in user.\n" ], "signature": [ { @@ -286,8 +514,22 @@ } ], "path": "x-pack/packages/security/plugin_types_public/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "security", + "path": "x-pack/plugins/security/public/plugin.tsx" + }, + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx" + }, + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts" + } + ] }, { "parentPluginId": "@kbn/security-plugin-types-public", @@ -373,10 +615,12 @@ "parentPluginId": "@kbn/security-plugin-types-public", "id": "def-public.SecurityPluginStart.authc", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authc", "description": [ - "\nExposes authentication information about the currently logged in user." + "\nExposes authentication information about the currently logged in user.\n" ], "signature": [ { @@ -388,8 +632,78 @@ } ], "path": "x-pack/packages/security/plugin_types_public/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "dataViews", + "path": "src/plugins/data_views/public/plugin.ts" + }, + { + "plugin": "security", + "path": "x-pack/plugins/security/public/plugin.tsx" + }, + { + "plugin": "maps", + "path": "x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx" + }, + { + "plugin": "imageEmbeddable", + "path": "src/plugins/image_embeddable/public/components/image_editor/open_image_editor.tsx" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/index.tsx" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/roles_empty_prompt.tsx" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/roles_empty_prompt.tsx" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/management/links.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/public/plugin.ts" + }, + { + "plugin": "cloudLinks", + "path": "x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/maybe_add_cloud_links.ts" + }, + { + "plugin": "observabilityAIAssistantApp", + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_current_user.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/common/lib/kibana/hooks.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/public/hooks/use_current_user.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/public/hooks/use_current_user.ts" + } + ] }, { "parentPluginId": "@kbn/security-plugin-types-public", @@ -417,10 +731,12 @@ "parentPluginId": "@kbn/security-plugin-types-public", "id": "def-public.SecurityPluginStart.userProfiles", "type": "CompoundType", - "tags": [], + "tags": [ + "deprecated" + ], "label": "userProfiles", "description": [ - "\nA set of methods to work with Kibana user profiles." + "\nA set of methods to work with Kibana user profiles.\n" ], "signature": [ "Omit<", @@ -458,8 +774,54 @@ "; }" ], "path": "x-pack/packages/security/plugin_types_public/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "security", + "path": "x-pack/plugins/security/public/plugin.tsx" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.ts" + }, + { + "plugin": "searchPlayground", + "path": "x-pack/plugins/search_playground/public/hooks/use_user_profile.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/user_profiles/use_bulk_get_user_profiles.tsx" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/components/user_profiles/use_get_current_user_profile.tsx" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/assistant/overlay.tsx" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.test.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.test.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.test.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/public/containers/user_profiles/api.test.ts" + } + ] } ], "initialIsOpen": false diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 76bfaf45d129cc..d1ec7a804248c6 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 39 | 0 | 14 | 0 | +| 51 | 0 | 25 | 0 | ## Client diff --git a/api_docs/kbn_security_plugin_types_server.devdocs.json b/api_docs/kbn_security_plugin_types_server.devdocs.json index 834476b9400b54..3702b948941962 100644 --- a/api_docs/kbn_security_plugin_types_server.devdocs.json +++ b/api_docs/kbn_security_plugin_types_server.devdocs.json @@ -3003,10 +3003,12 @@ "parentPluginId": "@kbn/security-plugin-types-server", "id": "def-server.SecurityPluginSetup.audit", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "audit", "description": [ - "\nExposes services for audit logging." + "\nExposes services for audit logging.\n" ], "signature": [ { @@ -3018,8 +3020,62 @@ } ], "path": "x-pack/packages/security/plugin_types_server/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "security", + "path": "x-pack/plugins/security/server/plugin.ts" + }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/plugin.ts" + }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/plugin.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "files", + "path": "src/plugins/files/server/file_service/file_service_factory.ts" + }, + { + "plugin": "files", + "path": "src/plugins/files/server/file_service/file_service_factory.ts" + }, + { + "plugin": "ruleRegistry", + "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client_factory.ts" + }, + { + "plugin": "ruleRegistry", + "path": "x-pack/plugins/rule_registry/server/search_strategy/search_strategy.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/factory.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/audit_logging.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/audit_logging.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/request_context_factory.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/plugin.ts" + } + ] }, { "parentPluginId": "@kbn/security-plugin-types-server", @@ -3063,10 +3119,12 @@ "parentPluginId": "@kbn/security-plugin-types-server", "id": "def-server.SecurityPluginStart.authc", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authc", "description": [ - "\nAuthentication services to confirm the user is who they say they are." + "\nAuthentication services to confirm the user is who they say they are.\n" ], "signature": [ { @@ -3078,8 +3136,330 @@ } ], "path": "x-pack/packages/security/plugin_types_server/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "security", + "path": "x-pack/plugins/security/server/plugin.ts" + }, + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/lib/action_executor.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_settings_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/maintenance_window_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/plugin.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/plugin.ts" + }, + { + "plugin": "files", + "path": "src/plugins/files/server/routes/file_kind/create.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/factory.ts" + }, + { + "plugin": "observabilityAIAssistant", + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/security.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/api_keys/security.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/setup/fleet_server_policies_enrollment_keys.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "cloudDefend", + "path": "x-pack/plugins/cloud_defend/server/routes/setup_routes.ts" + }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/lib/indices/create_api_key.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" + }, + { + "plugin": "lists", + "path": "x-pack/plugins/lists/server/get_user.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/routes/common/get_user.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/indices_routes.ts" + }, + { + "plugin": "transform", + "path": "x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/routes/agent_keys/get_agent_keys_privileges.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts" + } + ] }, { "parentPluginId": "@kbn/security-plugin-types-server", @@ -3107,10 +3487,12 @@ "parentPluginId": "@kbn/security-plugin-types-server", "id": "def-server.SecurityPluginStart.userProfiles", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "userProfiles", "description": [ - "\nUser profiles services to retrieve user profiles." + "\nUser profiles services to retrieve user profiles.\n" ], "signature": [ { @@ -3122,8 +3504,34 @@ } ], "path": "x-pack/packages/security/plugin_types_server/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "security", + "path": "x-pack/plugins/security/server/plugin.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/services/notifications/email_notification_service.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/factory.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/cases/utils.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/services/user_profiles/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts" + } + ] } ], "initialIsOpen": false diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 9137974b89ddbf..8a777d80e95222 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_security_solution_features.devdocs.json index a90a3ec2306232..83b547011e1134 100644 --- a/api_docs/kbn_security_solution_features.devdocs.json +++ b/api_docs/kbn_security_solution_features.devdocs.json @@ -49,7 +49,7 @@ "label": "baseKibanaFeature", "description": [], "signature": [ - "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; category: ", + "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; hidden?: boolean | undefined; category: ", { "pluginId": "@kbn/core-application-common", "scope": "common", @@ -154,7 +154,7 @@ "label": "BaseKibanaFeatureConfig", "description": [], "signature": [ - "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; category: ", + "{ id: string; order?: number | undefined; name: string; alerting?: readonly string[] | undefined; cases?: readonly string[] | undefined; hidden?: boolean | undefined; category: ", { "pluginId": "@kbn/core-application-common", "scope": "common", diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index afae0e1eda8c25..48e162e847a987 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-06-05 +date: 2024-06-09 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 b5fb278a0bf9f3..4e9473e4e1a8be 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-06-05 +date: 2024-06-09 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 db32a3f767b390..c532ddbb91cb5c 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2024-06-05 +date: 2024-06-09 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 885c1be6a569c1..413137dccfe822 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2024-06-05 +date: 2024-06-09 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 93a8035154584b..54310d8a417cf4 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2024-06-05 +date: 2024-06-09 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 108912e6e961a4..94f5b5d54cffbd 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2024-06-05 +date: 2024-06-09 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 fc3005bbbcbf7b..5ccfa35e6392a6 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2024-06-05 +date: 2024-06-09 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 0ec2575ddd3e62..ffbf102638cf5d 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json index 5382edc3d95e38..40dc8909e03ed7 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.devdocs.json +++ b/api_docs/kbn_securitysolution_exception_list_components.devdocs.json @@ -851,7 +851,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -865,7 +865,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/meta/index.tsx", "deprecated": false, @@ -1004,7 +1004,7 @@ "label": "securityLinkAnchorComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1018,7 +1018,7 @@ "label": "formattedDateComponent", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, @@ -1144,7 +1144,7 @@ "label": "showValueListModal", "description": [], "signature": [ - "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"view\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\"" + "\"symbol\" | \"object\" | \"source\" | \"meta\" | \"desc\" | \"filter\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"data\" | \"pattern\" | \"summary\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"canvas\" | \"svg\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"select\" | \"output\" | \"script\" | \"time\" | \"mask\" | \"input\" | \"table\" | \"a\" | \"abbr\" | \"address\" | \"area\" | \"aside\" | \"audio\" | \"b\" | \"bdi\" | \"bdo\" | \"blockquote\" | \"br\" | \"button\" | \"caption\" | \"cite\" | \"code\" | \"col\" | \"colgroup\" | \"datalist\" | \"dd\" | \"del\" | \"details\" | \"dfn\" | \"dialog\" | \"div\" | \"dl\" | \"dt\" | \"em\" | \"embed\" | \"fieldset\" | \"figcaption\" | \"figure\" | \"footer\" | \"header\" | \"hgroup\" | \"hr\" | \"html\" | \"i\" | \"iframe\" | \"img\" | \"ins\" | \"kbd\" | \"keygen\" | \"li\" | \"mark\" | \"menuitem\" | \"meter\" | \"nav\" | \"noindex\" | \"noscript\" | \"ol\" | \"optgroup\" | \"option\" | \"param\" | \"picture\" | \"pre\" | \"rp\" | \"rt\" | \"ruby\" | \"samp\" | \"section\" | \"strong\" | \"tbody\" | \"td\" | \"textarea\" | \"tfoot\" | \"th\" | \"thead\" | \"tr\" | \"track\" | \"u\" | \"ul\" | \"var\" | \"video\" | \"wbr\" | \"webview\" | \"animate\" | \"animateMotion\" | \"animateTransform\" | \"circle\" | \"clipPath\" | \"defs\" | \"ellipse\" | \"feBlend\" | \"feColorMatrix\" | \"feComponentTransfer\" | \"feComposite\" | \"feConvolveMatrix\" | \"feDiffuseLighting\" | \"feDisplacementMap\" | \"feDistantLight\" | \"feDropShadow\" | \"feFlood\" | \"feFuncA\" | \"feFuncB\" | \"feFuncG\" | \"feFuncR\" | \"feGaussianBlur\" | \"feImage\" | \"feMerge\" | \"feMergeNode\" | \"feMorphology\" | \"feOffset\" | \"fePointLight\" | \"feSpecularLighting\" | \"feSpotLight\" | \"feTile\" | \"feTurbulence\" | \"foreignObject\" | \"g\" | \"line\" | \"linearGradient\" | \"marker\" | \"metadata\" | \"mpath\" | \"polygon\" | \"polyline\" | \"radialGradient\" | \"rect\" | \"switch\" | \"textPath\" | \"tspan\" | \"use\" | \"view\"" ], "path": "packages/kbn-securitysolution-exception-list-components/src/exception_item_card/exception_item_card.tsx", "deprecated": false, diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 90d1d58eec3526..868d45f433dedb 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 9c9be7a01c75af..825f4d20d1f98b 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 06066689352d26..1527fdd603c8ba 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2024-06-05 +date: 2024-06-09 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 d9f5af2b265f49..d51374c79d376c 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2024-06-05 +date: 2024-06-09 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 54fb8ee085ccbd..f208176cf72440 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2024-06-05 +date: 2024-06-09 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 87e873eb9fb30f..9fd7ed6bb28c42 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 f515c2f59d23f8..c3e5f480371f5e 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2024-06-05 +date: 2024-06-09 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 616b7ecc1a89eb..176a38b4e37ba6 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2024-06-05 +date: 2024-06-09 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 b3123547a5c671..125a4009e3bdac 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2024-06-05 +date: 2024-06-09 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 fc176e18e47fc6..022ce24a7b5ba1 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 caf6cc20bf20e7..924ce919480e9b 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2024-06-05 +date: 2024-06-09 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 ec0c337f02828b..6d579446ec6e68 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2024-06-05 +date: 2024-06-09 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 f3ef3c91cb14b2..1378a817542e6e 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 255b14e6a37ad5..c0f50282ece8c4 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2024-06-05 +date: 2024-06-09 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 7774cfbe1dfc44..c44c5dd30b45fb 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2024-06-05 +date: 2024-06-09 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 cf5ebbec332507..84c7017bb1b6ca 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-06-05 +date: 2024-06-09 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 25b3c44d1f9642..7d040cd4ba2cb7 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-06-05 +date: 2024-06-09 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 1fc20de3227a6a..fe9e7660184b2d 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2024-06-05 +date: 2024-06-09 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 4077f22bb4f75b..5bac8ceaa2fde2 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-06-05 +date: 2024-06-09 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 11a1bb7f34cc8d..4753a67a838025 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-06-05 +date: 2024-06-09 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 9cc22fe4b68308..ac01642633e9aa 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2024-06-05 +date: 2024-06-09 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 bdcf770f40f55e..fcb06dde62cfcd 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2024-06-05 +date: 2024-06-09 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 f733a79703eb78..94115494536869 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2024-06-05 +date: 2024-06-09 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 69d197a0ed1bb7..d3b654ff239c47 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2024-06-05 +date: 2024-06-09 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 87a18a0190921f..5bab2b0048b2ec 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2024-06-05 +date: 2024-06-09 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 df32d8386246eb..d1a0ccc43b2dab 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2024-06-05 +date: 2024-06-09 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 7185b09f85b413..6b2ae1aeffb5cb 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 6354f6d5c5f919..5f7c18a5265389 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2024-06-05 +date: 2024-06-09 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 d52daa3c8ef494..4a0cdc80f76aea 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-06-05 +date: 2024-06-09 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 e8eb77be1bb749..aa4decf7d8160c 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2024-06-05 +date: 2024-06-09 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 846862d1d8812e..8766510c3a75a8 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2024-06-05 +date: 2024-06-09 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 aa1cd2df917bb0..fb302506901f94 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 5d4eb4fae51571..bb27c42efeec85 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 f8e8c1dfb6c387..acb8bc91c808bc 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2024-06-05 +date: 2024-06-09 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 57b5c53721a1ce..aee6793f9b8e66 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2024-06-05 +date: 2024-06-09 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 10db7013af9b05..070b44bf18ab83 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2024-06-05 +date: 2024-06-09 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 a3896a6fa6a2f4..799fa49c7aa2f3 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2024-06-05 +date: 2024-06-09 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 69fab0852d5918..846ea0ca442339 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2024-06-05 +date: 2024-06-09 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 f9bcda515c979b..a2549c08b00338 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 d66947a0b97149..ed69b7c608103f 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2024-06-05 +date: 2024-06-09 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 caa80e083bb77f..61145a8e7d7ad6 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 034d01ebca23c7..b802acedcbc34a 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2024-06-05 +date: 2024-06-09 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 3d5d599ee6ced0..499f654537d9dd 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 b6f9058f3b778f..355937e0c5784f 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2024-06-05 +date: 2024-06-09 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 ed2c97e8da4f9a..e2d11e36595d28 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 58f8c54f328ba4..354d1137b7e85d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2024-06-05 +date: 2024-06-09 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 2caab7a2a12d0b..94c8b13399a397 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 c6d49e80e54612..dc05bafd2a75ab 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2024-06-05 +date: 2024-06-09 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 823944a57275be..46b5f7d2fbef57 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2024-06-05 +date: 2024-06-09 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 4f506ab58e258b..970eb3f8d699c3 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 7d982fbf2bb8df..e99b9859f5a5d4 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 104580929b8f72..378c9612f81126 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2024-06-05 +date: 2024-06-09 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 383cc11bbd81d0..1b45ab3affd87f 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2024-06-05 +date: 2024-06-09 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 debc17d38d10d5..0a2cd5856a5cf8 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 ee9ed111e3c572..6e3cc2175bbb6c 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2024-06-05 +date: 2024-06-09 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 469d9ff815d8d9..bb89e85c1c97f8 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2024-06-05 +date: 2024-06-09 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 8e290a90cf07a3..a15be4cb3e5159 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2024-06-05 +date: 2024-06-09 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 1143741ced19b2..5fecbdf9efd66c 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2024-06-05 +date: 2024-06-09 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 4155596c2b2a3a..aac7d24c11caf8 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2024-06-05 +date: 2024-06-09 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_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index 776ac92a9b8ff3..5003334feed593 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index a414385d506b60..48e13583124ef9 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_slo_schema.devdocs.json index b5cfbdf54a733d..8acc3fb8c8aaca 100644 --- a/api_docs/kbn_slo_schema.devdocs.json +++ b/api_docs/kbn_slo_schema.devdocs.json @@ -561,7 +561,7 @@ "label": "APMTransactionDurationIndicator", "description": [], "signature": [ - "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -576,7 +576,7 @@ "label": "APMTransactionErrorRateIndicator", "description": [], "signature": [ - "{ type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -606,7 +606,7 @@ "label": "CreateSLOInput", "description": [], "signature": [ - "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; } & { id?: string | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; preventInitialBackfill?: boolean | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | string[] | undefined; revision?: number | undefined; }" + "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; } & { id?: string | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; preventInitialBackfill?: boolean | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | string[] | undefined; revision?: number | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/create.ts", "deprecated": false, @@ -621,7 +621,7 @@ "label": "CreateSLOParams", "description": [], "signature": [ - "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: ", + "{ name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -805,7 +805,7 @@ "label": "FiltersSchema", "description": [], "signature": [ - "{ meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]" + "{ meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -835,7 +835,7 @@ "label": "FindSLODefinitionsResponse", "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }[]; }" + "{ page: number; perPage: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/find_definition.ts", "deprecated": false, @@ -895,7 +895,7 @@ "label": "FindSLOResponse", "description": [], "signature": [ - "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; })[]; }" + "{ page: number; perPage: number; total: number; results: ({ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; })[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/find.ts", "deprecated": false, @@ -910,7 +910,7 @@ "label": "GetPreviewDataParams", "description": [], "signature": [ - "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; range: { from: Date; to: Date; }; } & { objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: ", + "{ indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; range: { from: Date; to: Date; }; } & { objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -993,7 +993,7 @@ "label": "GetSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/get.ts", "deprecated": false, @@ -1068,7 +1068,7 @@ "label": "HistogramIndicator", "description": [], "signature": [ - "{ type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1098,7 +1098,7 @@ "label": "Indicator", "description": [], "signature": [ - "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1128,7 +1128,7 @@ "label": "KQLCustomIndicator", "description": [], "signature": [ - "{ type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1143,7 +1143,7 @@ "label": "KqlWithFiltersSchema", "description": [], "signature": [ - "{ kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }" + "{ kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1173,7 +1173,7 @@ "label": "MetricCustomIndicator", "description": [], "signature": [ - "{ type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1233,7 +1233,7 @@ "label": "QuerySchema", "description": [], "signature": [ - "string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }" + "string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1263,7 +1263,7 @@ "label": "ResetSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/reset.ts", "deprecated": false, @@ -1278,7 +1278,7 @@ "label": "SLODefinitionResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -1293,7 +1293,7 @@ "label": "SLOWithSummaryResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; } & { summary: { status: \"HEALTHY\" | \"NO_DATA\" | \"DEGRADING\" | \"VIOLATED\"; sliValue: number; errorBudget: { initial: number; consumed: number; remaining: number; isEstimated: boolean; }; } & { summaryUpdatedAt?: string | null | undefined; }; groupings: { [x: string]: string | number; }; } & { instanceId?: string | undefined; meta?: { synthetics?: { monitorId: string; locationId: string; configId: string; } | undefined; } | undefined; remote?: { remoteName: string; kibanaUrl: string; } | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/slo.ts", "deprecated": false, @@ -1308,7 +1308,7 @@ "label": "SyntheticsAvailabilityIndicator", "description": [], "signature": [ - "{ type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1323,7 +1323,7 @@ "label": "TimesclieMetricPercentileMetric", "description": [], "signature": [ - "{ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" + "{ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1338,7 +1338,7 @@ "label": "TimesliceMetricBasicMetricWithField", "description": [], "signature": [ - "{ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" + "{ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1353,7 +1353,7 @@ "label": "TimesliceMetricDocCountMetric", "description": [], "signature": [ - "{ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" + "{ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1368,7 +1368,7 @@ "label": "TimesliceMetricIndicator", "description": [], "signature": [ - "{ type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }" + "{ type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/indicators.ts", "deprecated": false, @@ -1398,7 +1398,7 @@ "label": "UpdateSLOInput", "description": [], "signature": [ - "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | undefined; timeWindow?: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; } | undefined; budgetingMethod?: \"occurrences\" | \"timeslices\" | undefined; objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }) | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; preventInitialBackfill?: boolean | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | string[] | undefined; }" + "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | undefined; timeWindow?: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; } | undefined; budgetingMethod?: \"occurrences\" | \"timeslices\" | undefined; objective?: ({ target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }) | undefined; settings?: { syncDelay?: string | undefined; frequency?: string | undefined; preventInitialBackfill?: boolean | undefined; } | undefined; tags?: string[] | undefined; groupBy?: string | string[] | undefined; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/update.ts", "deprecated": false, @@ -1413,7 +1413,7 @@ "label": "UpdateSLOParams", "description": [], "signature": [ - "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | undefined; timeWindow?: { duration: ", + "{ name?: string | undefined; description?: string | undefined; indicator?: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | undefined; timeWindow?: { duration: ", { "pluginId": "@kbn/slo-schema", "scope": "common", @@ -1468,7 +1468,7 @@ "label": "UpdateSLOResponse", "description": [], "signature": [ - "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" + "{ id: string; name: string; description: string; indicator: { type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }; timeWindow: { duration: string; type: \"rolling\"; } | { duration: string; type: \"calendarAligned\"; }; budgetingMethod: \"occurrences\" | \"timeslices\"; objective: { target: number; } & { timesliceTarget?: number | undefined; timesliceWindow?: string | undefined; }; settings: { syncDelay: string; frequency: string; preventInitialBackfill: boolean; }; revision: number; enabled: boolean; tags: string[]; createdAt: string; updatedAt: string; groupBy: string | string[]; version: number; }" ], "path": "x-pack/packages/kbn-slo-schema/src/rest_specs/routes/update.ts", "deprecated": false, @@ -1606,19 +1606,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -1720,19 +1722,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -1912,19 +1916,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -1996,19 +2002,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -2104,19 +2112,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -2162,12 +2172,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2210,12 +2220,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2262,19 +2272,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -2338,12 +2350,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2396,12 +2408,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2464,12 +2476,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2522,12 +2534,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2576,19 +2588,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -2652,12 +2666,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2710,12 +2724,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2772,12 +2786,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2830,19 +2844,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -2902,12 +2918,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -2964,12 +2980,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -3024,12 +3040,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -3086,12 +3102,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -3136,19 +3152,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -3714,12 +3732,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -3860,19 +3878,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -3944,19 +3964,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -4052,19 +4074,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -4110,12 +4134,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4158,12 +4182,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4210,19 +4234,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -4286,12 +4312,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4344,12 +4370,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4412,12 +4438,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4470,12 +4496,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4524,19 +4550,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -4600,12 +4628,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4658,12 +4686,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4720,12 +4748,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4778,19 +4806,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -4850,12 +4880,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4912,12 +4942,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -4972,12 +5002,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -5034,12 +5064,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -5084,19 +5114,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -5470,19 +5502,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -5554,19 +5588,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -5662,19 +5698,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -5720,12 +5758,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -5768,12 +5806,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -5820,19 +5858,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -5896,12 +5936,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -5954,12 +5994,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6022,12 +6062,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6080,12 +6120,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6134,19 +6174,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -6210,12 +6252,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6268,12 +6310,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6330,12 +6372,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6388,19 +6430,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -6460,12 +6504,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6522,12 +6566,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6582,12 +6626,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6644,12 +6688,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -6694,19 +6738,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -6980,19 +7026,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7064,19 +7112,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7172,19 +7222,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7230,12 +7282,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7278,12 +7330,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7330,19 +7382,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7406,12 +7460,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7464,12 +7518,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7532,12 +7586,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7590,12 +7644,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7644,19 +7698,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7720,12 +7776,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7778,12 +7834,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7840,12 +7896,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -7898,19 +7954,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -7970,12 +8028,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8032,12 +8090,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8092,12 +8150,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8154,12 +8212,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8204,19 +8262,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; range: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; range: ", "TypeC", "<{ from: ", "Type", @@ -8552,19 +8612,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -8636,19 +8698,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -8744,19 +8808,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -8802,12 +8868,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8850,12 +8916,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -8902,19 +8968,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -8978,12 +9046,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9036,12 +9104,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9104,12 +9172,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9162,12 +9230,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9216,19 +9284,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -9292,12 +9362,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9350,12 +9420,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9412,12 +9482,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9470,19 +9540,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -9542,12 +9614,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9604,12 +9676,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9664,12 +9736,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9726,12 +9798,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -9776,19 +9848,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -10178,12 +10252,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10240,12 +10314,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10300,12 +10374,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10362,12 +10436,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10412,19 +10486,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -10584,19 +10660,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -10668,19 +10746,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -10776,19 +10856,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -10834,12 +10916,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10882,12 +10964,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -10934,19 +11016,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -11010,12 +11094,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11068,12 +11152,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11136,12 +11220,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11194,12 +11278,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11248,19 +11332,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -11324,12 +11410,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11382,12 +11468,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11444,12 +11530,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11502,19 +11588,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -11574,12 +11662,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11636,12 +11724,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11696,12 +11784,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11758,12 +11846,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11808,19 +11896,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -11926,12 +12016,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -11974,12 +12064,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12026,19 +12116,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -12115,12 +12207,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12233,12 +12325,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12305,12 +12397,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12395,12 +12487,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12453,12 +12545,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12521,12 +12613,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12579,12 +12671,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -12633,19 +12725,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -12869,12 +12963,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13019,19 +13113,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -13103,19 +13199,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -13211,19 +13309,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -13269,12 +13369,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13317,12 +13417,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13369,19 +13469,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -13445,12 +13547,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13503,12 +13605,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13571,12 +13673,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13629,12 +13731,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13683,19 +13785,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -13759,12 +13863,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13817,12 +13921,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13879,12 +13983,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -13937,19 +14041,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -14009,12 +14115,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14071,12 +14177,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14131,12 +14237,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14193,12 +14299,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14243,19 +14349,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -14543,19 +14651,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -14627,19 +14737,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -14735,19 +14847,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -14793,12 +14907,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14841,12 +14955,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -14893,19 +15007,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -14969,12 +15085,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15027,12 +15143,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15095,12 +15211,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15153,12 +15269,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15207,19 +15323,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -15283,12 +15401,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15341,12 +15459,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15403,12 +15521,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15461,19 +15579,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -15533,12 +15653,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15595,12 +15715,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15655,12 +15775,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15717,12 +15837,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -15767,19 +15887,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -16100,19 +16222,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -16184,19 +16308,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -16292,19 +16418,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -16350,12 +16478,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16398,12 +16526,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16450,19 +16578,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -16526,12 +16656,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16584,12 +16714,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16652,12 +16782,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16710,12 +16840,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16764,19 +16894,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -16840,12 +16972,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16898,12 +17030,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -16960,12 +17092,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17018,19 +17150,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -17090,12 +17224,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17152,12 +17286,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17212,12 +17346,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17274,12 +17408,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17324,19 +17458,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -17720,19 +17856,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -17846,12 +17984,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -17976,12 +18114,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18066,12 +18204,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18124,12 +18262,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18186,12 +18324,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18244,19 +18382,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>" + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>" ], "path": "x-pack/packages/kbn-slo-schema/src/schema/indicators.ts", "deprecated": false, @@ -18336,12 +18476,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18394,12 +18534,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18456,12 +18596,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18532,12 +18672,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -18726,19 +18866,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -18810,19 +18952,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -18918,19 +19062,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -18976,12 +19122,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19024,12 +19170,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19076,19 +19222,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -19152,12 +19300,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19210,12 +19358,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19278,12 +19426,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19336,12 +19484,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19390,19 +19538,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -19466,12 +19616,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19524,12 +19674,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19586,12 +19736,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19644,19 +19794,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -19716,12 +19868,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19778,12 +19930,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19838,12 +19990,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19900,12 +20052,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -19950,19 +20102,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", @@ -20158,19 +20312,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -20242,19 +20398,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -20350,19 +20508,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -20408,12 +20568,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20456,12 +20616,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20508,19 +20668,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -20584,12 +20746,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20642,12 +20804,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20710,12 +20872,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20768,12 +20930,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20822,19 +20984,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -20898,12 +21062,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -20956,12 +21120,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21018,12 +21182,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21076,19 +21240,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>, ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>, ", "TypeC", "<{ type: ", "LiteralC", @@ -21148,12 +21314,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21210,12 +21376,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21270,12 +21436,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21332,12 +21498,12 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", @@ -21382,19 +21548,21 @@ "StringC", "; key: ", "StringC", + "; field: ", + "StringC", "; params: ", "AnyC", "; value: ", "StringC", - "; field: ", - "StringC", "; }>; query: ", "RecordC", "<", "StringC", ", ", "AnyC", - ">; }>>; }>]>; }>]>; }>]>; timeWindow: ", + ">; }>>; }>]>; dataViewId: ", + "StringC", + "; }>]>; }>]>; timeWindow: ", "UnionC", "<[", "TypeC", diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index d57c34be2a147e..4989c90f47b5c1 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2024-06-05 +date: 2024-06-09 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 ad2322745e9c8b..5d868f58cb36ad 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 0f38e027bb8977..d73ac608b8b3c7 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 16d19e57dbb1aa..d4cf02feca81d4 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2024-06-05 +date: 2024-06-09 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 3569af80b4b14b..ce51ec03b59fc6 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2024-06-05 +date: 2024-06-09 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 7bbb7daa277a06..0faa44953f3448 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2024-06-05 +date: 2024-06-09 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 dc3a9759b2e01d..ab85ae91f61d27 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2024-06-05 +date: 2024-06-09 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 b3f503c6c36c8d..62208aad8cf535 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index ce641812011385..6ee82dd2fed2d4 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 6294212c6d421f..da0c88bc1d8e32 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2024-06-05 +date: 2024-06-09 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 6ee33bab280646..12836097a0e037 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_text_based_editor.devdocs.json index 4e17b35d2cfb82..c0e207109fedb8 100644 --- a/api_docs/kbn_text_based_editor.devdocs.json +++ b/api_docs/kbn_text_based_editor.devdocs.json @@ -627,6 +627,22 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/text-based-editor", + "id": "def-public.TextBasedLanguagesEditorProps.hideHeaderWhenExpanded", + "type": "CompoundType", + "tags": [], + "label": "hideHeaderWhenExpanded", + "description": [ + "hide header buttons when editor is expanded" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index f70e18da66fcab..66a2b5a767cfe6 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 32 | 0 | 13 | 0 | +| 33 | 0 | 13 | 0 | ## Client diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index c2c7c55244ff64..94e69e29c81df5 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 7d4530dac42aeb..12b853a389c720 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2024-06-05 +date: 2024-06-09 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 f526e33aa93166..293d7f5bac09d6 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-06-05 +date: 2024-06-09 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_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index db0387fdcd34b2..617ea9fc422dd4 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 47a903b0ef8bd3..5898463e823835 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2024-06-05 +date: 2024-06-09 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 3b19c857dfbd7d..497dc74eb13d33 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2024-06-05 +date: 2024-06-09 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 d33c0f4be566d7..896233cbf8af7b 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2024-06-05 +date: 2024-06-09 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 e68c4845142057..cca9774e29df3e 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2024-06-05 +date: 2024-06-09 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 d3f9f5c958c3c7..82e45151f56945 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2024-06-05 +date: 2024-06-09 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.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index 951029c44915f0..56275124e99d88 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -1453,7 +1453,13 @@ "\nCurrent sort setting" ], "signature": [ - "SortOrder", + { + "pluginId": "@kbn/unified-data-table", + "scope": "common", + "docId": "kibKbnUnifiedDataTablePluginApi", + "section": "def-common.SortOrder", + "text": "SortOrder" + }, "[]" ], "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", @@ -1768,7 +1774,7 @@ "section": "def-common.IUiSettingsClient", "text": "IUiSettingsClient" }, - "; dataViewFieldEditor: ", + "; dataViewFieldEditor?: ", { "pluginId": "dataViewFieldEditor", "scope": "public", @@ -1776,7 +1782,7 @@ "section": "def-public.PluginStart", "text": "PluginStart" }, - "; toastNotifications: ", + " | undefined; toastNotifications: ", { "pluginId": "@kbn/core-notifications-browser", "scope": "common", @@ -2707,6 +2713,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-common.SortOrder", + "type": "Type", + "tags": [], + "label": "SortOrder", + "description": [], + "signature": [ + "[string, string]" + ], + "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/unified-data-table", "id": "def-common.UnifiedDataTableRenderCustomToolbar", diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 02def6fdbb5769..08da68a3f421f9 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 152 | 0 | 80 | 2 | +| 153 | 0 | 81 | 1 | ## Common diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 6262ca7f66f897..b6ce194ec179f9 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-06-05 +date: 2024-06-09 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 649b219f409a76..bac9df3aaa7272 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-06-05 +date: 2024-06-09 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 75d27212791d8d..b7dfa2421aa974 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.devdocs.json b/api_docs/kbn_unsaved_changes_prompt.devdocs.json new file mode 100644 index 00000000000000..97e3715543f879 --- /dev/null +++ b/api_docs/kbn_unsaved_changes_prompt.devdocs.json @@ -0,0 +1,61 @@ +{ + "id": "@kbn/unsaved-changes-prompt", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/unsaved-changes-prompt", + "id": "def-common.useUnsavedChangesPrompt", + "type": "Function", + "tags": [], + "label": "useUnsavedChangesPrompt", + "description": [], + "signature": [ + "({ hasUnsavedChanges, openConfirm, history, http, navigateToUrl, messageText, titleText, confirmButtonText, cancelButtonText, }: Props) => void" + ], + "path": "packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/unsaved-changes-prompt", + "id": "def-common.useUnsavedChangesPrompt.$1", + "type": "Object", + "tags": [], + "label": "{\n hasUnsavedChanges,\n openConfirm,\n history,\n http,\n navigateToUrl,\n // Provide overrides for confirm dialog\n messageText = DEFAULT_BODY_TEXT,\n titleText = DEFAULT_TITLE_TEXT,\n confirmButtonText = DEFAULT_CONFIRM_BUTTON,\n cancelButtonText = DEFAULT_CANCEL_BUTTON,\n}", + "description": [], + "signature": [ + "Props" + ], + "path": "packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx new file mode 100644 index 00000000000000..a1eb4dc9f3561c --- /dev/null +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -0,0 +1,30 @@ +--- +#### +#### 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: kibKbnUnsavedChangesPromptPluginApi +slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt +title: "@kbn/unsaved-changes-prompt" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/unsaved-changes-prompt plugin +date: 2024-06-09 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] +--- +import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; + + + +Contact [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 2 | 0 | 2 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index bfcb80d09fb71e..a126387fd87494 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-06-05 +date: 2024-06-09 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 be9fc53c1affe4..1843da313855f5 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2024-06-05 +date: 2024-06-09 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 7cf4a636e2c78d..f5dee4dc2fa7aa 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2024-06-05 +date: 2024-06-09 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 3511c9091e8e67..bb9bc173c84fa7 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2024-06-05 +date: 2024-06-09 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 7e61b2f257d6b2..5ec756f823f9de 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2024-06-05 +date: 2024-06-09 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 dcd6b37837f122..dda0945c022aa0 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-06-05 +date: 2024-06-09 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 3ee7b96ae99409..445b4633b1f98c 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 49e7b8a7b2c007..8d11b145c7f5e4 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-06-05 +date: 2024-06-09 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 c0ea25baf65c05..1c474ac3ecb877 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2024-06-05 +date: 2024-06-09 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 8c320f8c20ca86..0e020c95e3be17 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-06-05 +date: 2024-06-09 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 e293e63a6c3b6a..7339a90e6467ec 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2024-06-05 +date: 2024-06-09 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 4991fdc62d5e94..adcc27a3298e29 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 492e6198051e64..b53f4e2c10f465 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 7bee2d2cc03a87..20b7f41596111d 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index be40ea5d7e2e74..2e502ecd39bad3 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -11058,23 +11058,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index fea55f92c382a4..5da18d0146c79b 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2024-06-05 +date: 2024-06-09 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 f32cdd93d56f6d..6eec40d0d23910 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2024-06-05 +date: 2024-06-09 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 4bfd5d971c5c94..6cd2c5bacc2c82 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2024-06-05 +date: 2024-06-09 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 22355597f3209c..171c7110cd14b9 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2024-06-05 +date: 2024-06-09 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 00b908faf787ce..cf47dfef1953a3 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-06-05 +date: 2024-06-09 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 7dc292a3ceec02..6cd4d8d0cebb58 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 1949457c881147..35a52c995fd7b7 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index e9116222e2aa32..dd9f02bdcc1c4b 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.devdocs.json b/api_docs/logs_shared.devdocs.json index a2cd970283979b..c5092240bfaea1 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -508,31 +508,30 @@ "label": "LogEntryFlyout", "description": [], "signature": [ - "({ logEntryId, onCloseFlyout, onSetFieldFilter, logViewReference, }: ", + "React.ForwardRefExoticComponent<", "LogEntryFlyoutProps", - ") => JSX.Element" + " & React.RefAttributes<{}>>" ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx", + "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, "trackAdoption": false, + "returnComment": [], "children": [ { "parentPluginId": "logsShared", "id": "def-public.LogEntryFlyout.$1", - "type": "Object", + "type": "Uncategorized", "tags": [], - "label": "{\n logEntryId,\n onCloseFlyout,\n onSetFieldFilter,\n logViewReference,\n}", + "label": "props", "description": [], "signature": [ - "LogEntryFlyoutProps" + "P" ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, - "trackAdoption": false, - "isRequired": true + "trackAdoption": false } ], - "returnComment": [], "initialIsOpen": false }, { @@ -1281,39 +1280,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "logsShared", - "id": "def-public.useLogEntryFlyout", - "type": "Function", - "tags": [], - "label": "useLogEntryFlyout", - "description": [], - "signature": [ - "(logViewReference: { logViewId: string; type: \"log-view-reference\"; } | { type: \"log-view-inline\"; id: string; attributes: { name: string; description: string; logIndices: { type: \"data_view\"; dataViewId: string; } | { type: \"index_name\"; indexName: string; }; logColumns: ({ timestampColumn: { id: string; }; } | { messageColumn: { id: string; }; } | { fieldColumn: { id: string; } & { field: string; }; })[]; }; }) => { openLogEntryFlyout: (logEntryId: any) => void; closeLogEntryFlyout: () => void; }" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "logsShared", - "id": "def-public.useLogEntryFlyout.$1", - "type": "CompoundType", - "tags": [], - "label": "logViewReference", - "description": [], - "signature": [ - "{ logViewId: string; type: \"log-view-reference\"; } | { type: \"log-view-inline\"; id: string; attributes: { name: string; description: string; logIndices: { type: \"data_view\"; dataViewId: string; } | { type: \"index_name\"; indexName: string; }; logColumns: ({ timestampColumn: { id: string; }; } | { messageColumn: { id: string; }; } | { fieldColumn: { id: string; } & { field: string; }; })[]; }; }" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "logsShared", "id": "def-public.useLogHighlightsStateContext", @@ -1474,84 +1440,6 @@ "children": [], "initialIsOpen": false }, - { - "parentPluginId": "logsShared", - "id": "def-public.useLogSummary", - "type": "Function", - "tags": [], - "label": "useLogSummary", - "description": [], - "signature": [ - "(logViewReference: { logViewId: string; type: \"log-view-reference\"; } | { type: \"log-view-inline\"; id: string; attributes: { name: string; description: string; logIndices: { type: \"data_view\"; dataViewId: string; } | { type: \"index_name\"; indexName: string; }; logColumns: ({ timestampColumn: { id: string; }; } | { messageColumn: { id: string; }; } | { fieldColumn: { id: string; } & { field: string; }; })[]; }; }, startTimestamp: number | null, endTimestamp: number | null, filterQuery: string | null) => { buckets: { start: number; end: number; entriesCount: number; }[]; start: number | null; end: number | null; }" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/log_summary.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "logsShared", - "id": "def-public.useLogSummary.$1", - "type": "CompoundType", - "tags": [], - "label": "logViewReference", - "description": [], - "signature": [ - "{ logViewId: string; type: \"log-view-reference\"; } | { type: \"log-view-inline\"; id: string; attributes: { name: string; description: string; logIndices: { type: \"data_view\"; dataViewId: string; } | { type: \"index_name\"; indexName: string; }; logColumns: ({ timestampColumn: { id: string; }; } | { messageColumn: { id: string; }; } | { fieldColumn: { id: string; } & { field: string; }; })[]; }; }" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/log_summary.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "logsShared", - "id": "def-public.useLogSummary.$2", - "type": "CompoundType", - "tags": [], - "label": "startTimestamp", - "description": [], - "signature": [ - "number | null" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/log_summary.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - }, - { - "parentPluginId": "logsShared", - "id": "def-public.useLogSummary.$3", - "type": "CompoundType", - "tags": [], - "label": "endTimestamp", - "description": [], - "signature": [ - "number | null" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/log_summary.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - }, - { - "parentPluginId": "logsShared", - "id": "def-public.useLogSummary.$4", - "type": "CompoundType", - "tags": [], - "label": "filterQuery", - "description": [], - "signature": [ - "string | null" - ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/log_summary.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "logsShared", "id": "def-public.useLogView", @@ -2628,7 +2516,7 @@ "label": "WithSummary", "description": [], "signature": [ - "({ serializedParsedQuery, children }: ", + "React.ForwardRefExoticComponent<", { "pluginId": "logsShared", "scope": "public", @@ -2636,36 +2524,28 @@ "section": "def-public.WithSummaryProps", "text": "WithSummaryProps" }, - ") => ", - "RendererResult" + " & React.RefAttributes<{}>>" ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts", + "path": "x-pack/plugins/observability_solution/logs_shared/public/index.ts", "deprecated": false, "trackAdoption": false, + "returnComment": [], "children": [ { "parentPluginId": "logsShared", "id": "def-public.WithSummary.$1", - "type": "Object", + "type": "Uncategorized", "tags": [], - "label": "{ serializedParsedQuery, children }", + "label": "props", "description": [], "signature": [ - { - "pluginId": "logsShared", - "scope": "public", - "docId": "kibLogsSharedPluginApi", - "section": "def-public.WithSummaryProps", - "text": "WithSummaryProps" - } + "P" ], - "path": "x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts", + "path": "node_modules/@types/react/index.d.ts", "deprecated": false, - "trackAdoption": false, - "isRequired": true + "trackAdoption": false } ], - "returnComment": [], "initialIsOpen": false } ], diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 3d1aed2478b5fb..8693ff1716fddf 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 303 | 0 | 277 | 32 | +| 296 | 0 | 268 | 32 | ## Client diff --git a/api_docs/management.mdx b/api_docs/management.mdx index b6810c1d8f1683..da3bfaf833853e 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 5dea201e259610..7fa01d6407bf27 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -4366,23 +4366,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 53fdb915b53d61..22dac662e1b499 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2024-06-05 +date: 2024-06-09 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 b2fcdc5f14cf7e..2013003e5325b4 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.devdocs.json b/api_docs/metrics_data_access.devdocs.json index a744b95998f512..13625c031de7f9 100644 --- a/api_docs/metrics_data_access.devdocs.json +++ b/api_docs/metrics_data_access.devdocs.json @@ -1309,6 +1309,14 @@ "LensBaseLayer", "; readonly dockerContainerMemoryUsage: ", "LensBaseLayer", + "; readonly dockerContainerNetworkRx: ", + "LensBaseLayer", + "; readonly dockerContainerNetworkTx: ", + "LensBaseLayer", + "; readonly dockerContainerDiskIORead: ", + "LensBaseLayer", + "; readonly dockerContainerDiskIOWrite: ", + "LensBaseLayer", "; readonly k8sContainerCpuUsage: ", "LensBaseLayer", "; readonly k8sContainerMemoryUsage: ", @@ -1401,7 +1409,43 @@ "LensDataset", " | undefined; label?: string | undefined; filter?: string | undefined; format?: \"string\" | \"number\" | \"duration\" | \"percent\" | \"currency\" | \"bytes\" | \"bits\" | undefined; decimals?: number | undefined; normalizeByUnit?: \"m\" | \"d\" | \"h\" | \"s\" | undefined; compactValues?: boolean | undefined; randomSampling?: number | undefined; useGlobalFilter?: boolean | undefined; seriesColor?: string | undefined; value: string; chartType: \"metric\"; querySecondaryMetric?: string | undefined; queryMaxValue?: string | undefined; breakdown?: ", "LensBreakdownConfig", - " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; }>>)[]" + " | undefined; trendLine?: boolean | undefined; subtitle?: string | undefined; } & { id: string; }; }; }; readonly network: { xy: { dockerContainerRxTx: { title: string; dataset?: ", + "LensDataset", + " | undefined; chartType: \"xy\"; layers: ({ dataset?: ", + "LensDataset", + " | undefined; yAxis: ", + "LensBaseLayer", + "[]; type: \"series\"; breakdown?: ", + "LensBreakdownConfig", + " | undefined; xAxis: ", + "LensBreakdownConfig", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", + "LensDataset", + " | undefined; yAxis: ", + "LensBaseLayer", + "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", + "LensReferenceLineLayer", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"left\" | \"top\" | \"bottom\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + "LensYBoundsConfig", + " | undefined; } & { id: string; }; }; }; readonly diskIO: { xy: { dockerContainerDiskIOReadWrite: { title: string; dataset?: ", + "LensDataset", + " | undefined; chartType: \"xy\"; layers: ({ dataset?: ", + "LensDataset", + " | undefined; yAxis: ", + "LensBaseLayer", + "[]; type: \"series\"; breakdown?: ", + "LensBreakdownConfig", + " | undefined; xAxis: ", + "LensBreakdownConfig", + "; seriesType: \"area\" | \"line\" | \"bar\"; } | { dataset?: ", + "LensDataset", + " | undefined; yAxis: ", + "LensBaseLayer", + "[]; type: \"annotation\"; events: ({ name: string; color?: string | undefined; icon?: string | undefined; datetime: string; } | { name: string; color?: string | undefined; icon?: string | undefined; field: string; filter: string; })[]; } | ", + "LensReferenceLineLayer", + ")[]; legend?: { show?: boolean | undefined; position?: \"right\" | \"left\" | \"top\" | \"bottom\" | undefined; } | undefined; axisTitleVisibility?: { showXAxisTitle?: boolean | undefined; showYAxisTitle?: boolean | undefined; } | undefined; emphasizeFitting?: boolean | undefined; fittingFunction?: \"None\" | \"Average\" | \"Zero\" | \"Nearest\" | \"Linear\" | \"Carry\" | \"Lookahead\" | undefined; yBounds?: ", + "LensYBoundsConfig", + " | undefined; } & { id: string; }; }; }; }>>)[]" ], "path": "x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/index.ts", "deprecated": false, diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 3131d2446e0449..a8f0e112a00914 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index 1d2c5b4093da31..7bb947c63a348f 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -1007,23 +1007,15 @@ "section": "def-common.PublishesTimeRange", "text": "PublishesTimeRange" }, - " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; filters$: ", + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", "docId": "kibKbnPresentationPublishingPluginApi", - "section": "def-common.PublishingSubject", - "text": "PublishingSubject" - }, - "<", - { - "pluginId": "@kbn/es-query", - "scope": "common", - "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.Filter", - "text": "Filter" + "section": "def-common.PublishesFilters", + "text": "PublishesFilters" }, - "[] | undefined>; query$: ", + " & { isCompatibleWithUnifiedSearch?: (() => boolean) | undefined; query$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 50c831ae038160..043f89e4beb7c5 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2024-06-05 +date: 2024-06-09 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 3e96e8cfd14cd5..5e83cbfcececef 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-06-05 +date: 2024-06-09 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 0472b0d4965fb8..3741ca934fe6a8 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2024-06-05 +date: 2024-06-09 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 681a181a440b08..c565cc07d66d20 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2024-06-05 +date: 2024-06-09 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 1dff1f3b065bf2..edaa2c0df34356 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2024-06-05 +date: 2024-06-09 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 93f3061807fe7c..b66343d0e76d29 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2024-06-05 +date: 2024-06-09 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 c7c7bfd43ddad0..fe7ceb9ef827ef 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-06-05 +date: 2024-06-09 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 662ed6fc183397..3ebdee2b850c4d 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 39edffbdcd7e09..e6b73cbac5031a 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -799,7 +799,7 @@ "label": "getElasticsearchQueryOrThrow", "description": [], "signature": [ - "(kuery: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }) => never[] | ", + "(kuery: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }) => never[] | ", "QueryDslQueryContainer", " | { bool: ", { @@ -823,7 +823,7 @@ "label": "kuery", "description": [], "signature": [ - "string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }" + "string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }" ], "path": "x-pack/plugins/observability_solution/observability/common/utils/parse_kuery.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index dc6778b98dc74f..d2d0dcca8888e9 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2024-06-05 +date: 2024-06-09 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 40be1e4b5dbb60..6dba439cb25b2b 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -1928,18 +1928,16 @@ "<{ queries: ", "ArrayC", "<", - "BrandC", - "<", + "IntersectionC", + "<[", + "TypeC", + "<{ text: ", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">>; }>, ", + "; }>, ", + "PartialC", + "<{ boost: ", + "NumberC", + "; }>]>>; }>, ", "PartialC", "<{ categories: ", "ArrayC", @@ -1947,17 +1945,7 @@ "StringC", ">; }>]>; }> | undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - " & { params: { body: { queries: ", - "Branded", - "[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", + " & { params: { body: { queries: ({ text: string; } & { boost?: number | undefined; })[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", "RecalledEntry", "[]; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -2556,18 +2544,16 @@ "<{ queries: ", "ArrayC", "<", - "BrandC", - "<", + "IntersectionC", + "<[", + "TypeC", + "<{ text: ", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">>; }>, ", + "; }>, ", + "PartialC", + "<{ boost: ", + "NumberC", + "; }>]>>; }>, ", "PartialC", "<{ categories: ", "ArrayC", @@ -2575,17 +2561,7 @@ "StringC", ">; }>]>; }> | undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - " & { params: { body: { queries: ", - "Branded", - "[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", + " & { params: { body: { queries: ({ text: string; } & { boost?: number | undefined; })[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", "RecalledEntry", "[]; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -3787,18 +3763,16 @@ "<{ queries: ", "ArrayC", "<", - "BrandC", - "<", + "IntersectionC", + "<[", + "TypeC", + "<{ text: ", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">>; }>, ", + "; }>, ", + "PartialC", + "<{ boost: ", + "NumberC", + "; }>]>>; }>, ", "PartialC", "<{ categories: ", "ArrayC", @@ -3806,17 +3780,7 @@ "StringC", ">; }>]>; }> | undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - " & { params: { body: { queries: ", - "Branded", - "[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", + " & { params: { body: { queries: ({ text: string; } & { boost?: number | undefined; })[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", "RecalledEntry", "[]; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -4292,6 +4256,41 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.CompatibleJSONSchema", + "type": "Type", + "tags": [], + "label": "CompatibleJSONSchema", + "description": [], + "signature": [ + "{ type?: ", + "JSONSchema7TypeName", + " | undefined; enum?: JSONSchemaOrPrimitive[] | readonly JSONSchemaOrPrimitive[] | undefined; const?: JSONSchemaOrPrimitive | undefined; minLength?: number | undefined; maxLength?: number | undefined; items?: ", + "CompatibleJSONSchema", + " | ", + "CompatibleJSONSchema", + "[] | undefined; required?: string[] | readonly string[] | undefined; properties?: Record | undefined; allOf?: ", + "CompatibleJSONSchema", + "[] | readonly ", + "CompatibleJSONSchema", + "[] | undefined; anyOf?: ", + "CompatibleJSONSchema", + "[] | readonly ", + "CompatibleJSONSchema", + "[] | undefined; oneOf?: ", + "CompatibleJSONSchema", + "[] | readonly ", + "CompatibleJSONSchema", + "[] | undefined; description?: string | undefined; }" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-public.Feedback", @@ -4535,18 +4534,16 @@ "<{ queries: ", "ArrayC", "<", - "BrandC", - "<", + "IntersectionC", + "<[", + "TypeC", + "<{ text: ", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">>; }>, ", + "; }>, ", + "PartialC", + "<{ boost: ", + "NumberC", + "; }>]>>; }>, ", "PartialC", "<{ categories: ", "ArrayC", @@ -4554,17 +4551,7 @@ "StringC", ">; }>]>; }> | undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - " & { params: { body: { queries: ", - "Branded", - "[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", + " & { params: { body: { queries: ({ text: string; } & { boost?: number | undefined; })[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", "RecalledEntry", "[]; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", @@ -5965,18 +5952,16 @@ "<{ queries: ", "ArrayC", "<", - "BrandC", - "<", + "IntersectionC", + "<[", + "TypeC", + "<{ text: ", "StringC", - ", ", - { - "pluginId": "@kbn/io-ts-utils", - "scope": "common", - "docId": "kibKbnIoTsUtilsPluginApi", - "section": "def-common.NonEmptyStringBrand", - "text": "NonEmptyStringBrand" - }, - ">>; }>, ", + "; }>, ", + "PartialC", + "<{ boost: ", + "NumberC", + "; }>]>>; }>, ", "PartialC", "<{ categories: ", "ArrayC", @@ -5984,17 +5969,7 @@ "StringC", ">; }>]>; }> | undefined; handler: ({}: ", "ObservabilityAIAssistantRouteHandlerResources", - " & { params: { body: { queries: ", - "Branded", - "[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", + " & { params: { body: { queries: ({ text: string; } & { boost?: number | undefined; })[]; } & { categories?: string[] | undefined; }; }; }) => Promise<{ entries: ", "RecalledEntry", "[]; }>; } & ", "ObservabilityAIAssistantRouteCreateOptions", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index a43fe3ac9a1c77..840401afb8f63a 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 260 | 1 | 258 | 26 | +| 261 | 1 | 259 | 27 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.devdocs.json b/api_docs/observability_a_i_assistant_app.devdocs.json index b03a7f23f96d6d..b20b594df3987e 100644 --- a/api_docs/observability_a_i_assistant_app.devdocs.json +++ b/api_docs/observability_a_i_assistant_app.devdocs.json @@ -13,7 +13,38 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-server.CHANGES_FUNCTION_NAME", + "type": "string", + "tags": [], + "label": "CHANGES_FUNCTION_NAME", + "description": [], + "signature": [ + "\"changes\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "observabilityAIAssistantApp", + "id": "def-server.QUERY_FUNCTION_NAME", + "type": "string", + "tags": [], + "label": "QUERY_FUNCTION_NAME", + "description": [], + "signature": [ + "\"query\"" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "start": { "parentPluginId": "observabilityAIAssistantApp", diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 7ef35ead46e3e3..b718830336d1ed 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 2 | 0 | 2 | 0 | +| 4 | 0 | 4 | 0 | ## Server @@ -31,3 +31,6 @@ Contact [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai ### Start +### Consts, variables and types + + diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index c88b6dab9b0190..54b9abf54d3003 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index 629f46660d6cbd..959b153ae8a97b 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 330f07cd79ae7d..82452eb0f24293 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2024-06-05 +date: 2024-06-09 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 0474530148e914..69b4e2367c0f3d 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2024-06-05 +date: 2024-06-09 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 32142fa41bcdd4..1a60902a54b73c 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2024-06-05 +date: 2024-06-09 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 eadc32d1e24ef3..a7b4154fe60bb2 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-06-05 +date: 2024-06-09 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 6063c56fb8a416..38a1053f7a9d80 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2024-06-05 +date: 2024-06-09 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 | |--------------|----------|------------------------| -| 799 | 685 | 42 | +| 803 | 689 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 48698 | 239 | 37188 | 1871 | +| 48911 | 239 | 37380 | 1881 | ## Plugin Directory @@ -41,7 +41,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 115 | 0 | 95 | 28 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 268 | 2 | 253 | 10 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 74 | 0 | 17 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 78 | 0 | 19 | 0 | | cloudChat | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Chat available on Elastic Cloud deployments for quicker assistance. | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | Static migration page where self-managed users can see text/copy about migrating to Elastic Cloud | 8 | 0 | 8 | 1 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | Defend for containers (D4C) | 52 | 0 | 43 | 2 | @@ -51,13 +51,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 14 | 0 | 2 | 2 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 38 | 0 | 30 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 149 | 0 | 125 | 6 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 340 | 0 | 332 | 20 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 351 | 0 | 343 | 18 | | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 120 | 0 | 116 | 13 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 129 | 0 | 123 | 12 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3194 | 31 | 2585 | 24 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3199 | 31 | 2590 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | @@ -71,11 +71,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | A stateful layer to register shared features and provide an access point to discover without a direct dependency | 16 | 0 | 15 | 2 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | Server APIs for the Elastic AI Assistant | 46 | 0 | 32 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 556 | 1 | 446 | 8 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 557 | 1 | 447 | 9 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 19 | 0 | 19 | 2 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 53 | 0 | 46 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 99 | 3 | 97 | 3 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 201 | 0 | 201 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The listing page for event annotations. | 15 | 0 | 15 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 112 | 0 | 112 | 11 | @@ -94,12 +95,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Tagcloud plugin adds a `tagcloud` renderer and function to the expression plugin. The renderer will display the `Wordcloud` chart. | 6 | 0 | 6 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression XY plugin adds a `xy` renderer and function to the expression plugin. The renderer will display the `xy` chart. | 177 | 0 | 166 | 13 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds expression runtime to Kibana | 2233 | 17 | 1763 | 6 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 235 | 0 | 99 | 2 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 247 | 0 | 102 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 292 | 5 | 253 | 3 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes services for async usage and search of fields metadata. | 39 | 0 | 39 | 7 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 84 | 0 | 84 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 240 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 0 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1329 | 5 | 1208 | 69 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1335 | 5 | 1214 | 71 | | ftrApis | [@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) | - | 72 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -116,6 +118,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 127 | 2 | 100 | 4 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides UI and APIs for the interactive setup mode. | 28 | 0 | 18 | 0 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 95 | 0 | 95 | 4 | | | [@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) | - | 153 | 0 | 121 | 3 | | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -129,7 +132,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 226 | 0 | 97 | 52 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 7 | 0 | 7 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin provides a LogsExplorer component using the Discover customization framework, offering several affordances specifically designed for log consumption. | 117 | 4 | 117 | 22 | -| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 303 | 0 | 277 | 32 | +| | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 296 | 0 | 268 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 44 | 0 | 44 | 7 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 286 | 0 | 281 | 31 | @@ -144,8 +147,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 698 | 2 | 689 | 15 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 260 | 1 | 258 | 26 | -| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 261 | 1 | 259 | 27 | +| | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 19 | 0 | 19 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 16 | 0 | 16 | 0 | @@ -173,7 +176,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 6 | 0 | 6 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 18 | 0 | 10 | 1 | | searchprofiler | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 0 | 0 | 0 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 413 | 0 | 205 | 3 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 414 | 0 | 205 | 3 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 191 | 0 | 121 | 37 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | ESS customizations for Security Solution. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 7 | 0 | 7 | 0 | @@ -181,8 +184,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | Serverless customizations for search. | 6 | 0 | 6 | 0 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 134 | 0 | 134 | 8 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 120 | 0 | 59 | 12 | -| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 64 | 0 | 64 | 1 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 121 | 0 | 60 | 12 | +| | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 65 | 0 | 65 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 260 | 0 | 66 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | @@ -193,7 +196,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 31 | 0 | 26 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 0 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 28 | 0 | 10 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 10 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | Elastic threat intelligence helps you see if you are open to or have been subject to current or historical known threats | 30 | 0 | 14 | 4 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 242 | 1 | 198 | 17 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | @@ -251,7 +254,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 18 | 0 | 18 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 4 | 0 | 4 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 49 | 0 | 49 | 8 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 193 | 0 | 193 | 30 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 191 | 0 | 191 | 30 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 4 | 0 | 1 | 0 | @@ -299,7 +302,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 20 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 206 | 0 | 99 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 207 | 0 | 100 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 3 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 0 | @@ -347,7 +350,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 7 | 54 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 13 | 0 | 13 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 486 | 2 | 193 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 487 | 2 | 193 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 92 | 0 | 79 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 44 | 0 | 43 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | @@ -486,7 +489,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 35 | 0 | 34 | 0 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 165 | 0 | 138 | 9 | | | [@elastic/security-generative-ai](https://github.com/orgs/elastic/teams/security-generative-ai) | - | 295 | 0 | 276 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 19 | 0 | 19 | 0 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 20 | 0 | 20 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 37 | 7 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 32 | 0 | 19 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 3 | 0 | @@ -498,7 +501,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 194 | 0 | 184 | 10 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 39 | 0 | 39 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 52 | 1 | -| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 38 | 0 | 14 | 1 | +| | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 39 | 0 | 14 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 18 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 54 | 0 | 45 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 0 | 0 | @@ -522,7 +525,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 7 | 1 | 7 | 1 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 12 | 43 | 0 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 59 | 0 | 59 | 4 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 60 | 0 | 60 | 4 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 44 | 0 | 44 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 13 | 0 | 13 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 86 | 0 | 78 | 6 | @@ -591,8 +594,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 0 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 76 | 0 | 65 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 204 | 0 | 169 | 5 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 82 | 0 | 71 | 0 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 209 | 0 | 174 | 5 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 168 | 0 | 55 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 13 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 22 | 0 | 9 | 0 | @@ -626,14 +629,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-detections-response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 125 | 0 | 122 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 76 | 0 | 76 | 0 | -| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 3688 | 0 | 3688 | 0 | +| | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 3687 | 0 | 3687 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 1 | 17 | 1 | | | [@elastic/search-kibana](https://github.com/orgs/elastic/teams/search-kibana) | - | 25 | 0 | 25 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 20 | 0 | 18 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 50 | 0 | 25 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 88 | 0 | 40 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 39 | 0 | 14 | 0 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 51 | 0 | 25 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 207 | 0 | 114 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 14 | 0 | 14 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 54 | 0 | 49 | 0 | @@ -715,7 +718,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 25 | 0 | 13 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 131 | 3 | 98 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 32 | 0 | 13 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 33 | 0 | 13 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 72 | 0 | 55 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 11 | 0 | 11 | 0 | @@ -725,10 +728,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 42 | 0 | 28 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 56 | 0 | 47 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 9 | 0 | 8 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 152 | 0 | 80 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 153 | 0 | 81 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 18 | 0 | 17 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 313 | 0 | 284 | 8 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 0 | +| | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 3 | 0 | 2 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 81 | 1 | 21 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index e99b5a6cf8533c..0a9da0e29fce27 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 2d91a73058e8a3..dce3971f03c212 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -666,7 +666,7 @@ "label": "FloatingActions", "description": [], "signature": [ - "({ children, viewMode, isEnabled, embeddable, className, disabledActions, }: React.PropsWithChildren<", + "({ children, viewMode, isEnabled, api, className, disabledActions, }: React.PropsWithChildren<", "FloatingActionsProps", ">) => JSX.Element" ], @@ -679,7 +679,7 @@ "id": "def-public.FloatingActions.$1", "type": "CompoundType", "tags": [], - "label": "{\n children,\n viewMode,\n isEnabled,\n embeddable,\n className = '',\n disabledActions,\n}", + "label": "{\n children,\n viewMode,\n isEnabled,\n api,\n className = '',\n disabledActions,\n}", "description": [], "signature": [ "React.PropsWithChildren<", diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index c590b2e2a1a8fd..008e2a95c74795 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2024-06-05 +date: 2024-06-09 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 91e23a57ca5d5e..6b9b9c5de04ec9 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2024-06-05 +date: 2024-06-09 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 421289b4436be7..33b67254bf2d8a 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-06-05 +date: 2024-06-09 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 2caf7df103dd15..4c5f2773f9463b 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2024-06-05 +date: 2024-06-09 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 a021a596097695..a47819a05a9143 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2024-06-05 +date: 2024-06-09 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 4991ece3f61403..b7e4bd038d4e50 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2024-06-05 +date: 2024-06-09 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 1b17933d6d3497..193ca749045969 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2024-06-05 +date: 2024-06-09 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 61f6a51553861c..6ce3d8241b6852 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2024-06-05 +date: 2024-06-09 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 098577b3aea4c1..7bcd7c38971974 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2024-06-05 +date: 2024-06-09 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 814fa0fe405721..a7b8ef5f9c8278 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2024-06-05 +date: 2024-06-09 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 ed76398f81e519..984ad05b39985d 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2024-06-05 +date: 2024-06-09 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 c867b80c5ee03d..f9e4094b569b67 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2024-06-05 +date: 2024-06-09 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 1741a9c76ef817..c068a9c6c346ee 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2024-06-05 +date: 2024-06-09 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 3c34d8b864a771..22b78f2ba90ce6 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2024-06-05 +date: 2024-06-09 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 6b8ed2f1ed3870..c969d8d82ba4cc 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2024-06-05 +date: 2024-06-09 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 f8eeb86b80c7e0..faae08ed3454ad 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index bb28a8a9deb1fd..01a3dc55800d52 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index c6faebf09cb5c8..33bcc83b93b5cd 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index c115a95736e13c..02e263877a79b0 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.devdocs.json b/api_docs/security.devdocs.json index 86960e5d096f82..99dea9ea6157f2 100644 --- a/api_docs/security.devdocs.json +++ b/api_docs/security.devdocs.json @@ -231,6 +231,28 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "security", + "id": "def-public.AuthorizationServiceSetup.roles", + "type": "Object", + "tags": [], + "label": "roles", + "description": [ + "\nA set of methods to work with Kibana user roles." + ], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.RolesAPIClient", + "text": "RolesAPIClient" + } + ], + "path": "x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1214,10 +1236,12 @@ "parentPluginId": "security", "id": "def-public.SecurityPluginSetup.authc", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authc", "description": [ - "\nExposes authentication information about the currently logged in user." + "\nExposes authentication information about the currently logged in user.\n" ], "signature": [ { @@ -1229,8 +1253,18 @@ } ], "path": "x-pack/packages/security/plugin_types_public/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/common/components/filebeat_config_flyout/filebeat_config_flyout.tsx" + }, + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts" + } + ] }, { "parentPluginId": "security", @@ -5393,10 +5427,12 @@ "parentPluginId": "security", "id": "def-server.SecurityPluginStart.authc", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "authc", "description": [ - "\nAuthentication services to confirm the user is who they say they are." + "\nAuthentication services to confirm the user is who they say they are.\n" ], "signature": [ { @@ -5408,8 +5444,326 @@ } ], "path": "x-pack/packages/security/plugin_types_server/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "actions", + "path": "x-pack/plugins/actions/server/lib/action_executor.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/rules_settings_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/maintenance_window_client_factory.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/plugin.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/plugin.ts" + }, + { + "plugin": "files", + "path": "src/plugins/files/server/routes/file_kind/create.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/factory.ts" + }, + { + "plugin": "observabilityAIAssistant", + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/server/service/index.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/security/security.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/api_keys/transform_api_keys.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/api_keys/security.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/package_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/epm/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/services/setup/fleet_server_policies_enrollment_keys.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/settings/index.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/agent_policy/handlers.ts" + }, + { + "plugin": "cloudDefend", + "path": "x-pack/plugins/cloud_defend/server/routes/setup_routes.ts" + }, + { + "plugin": "cloudSecurityPosture", + "path": "x-pack/plugins/cloud_security_posture/server/routes/setup_routes.ts" + }, + { + "plugin": "elasticAssistant", + "path": "x-pack/plugins/elastic_assistant/server/routes/request_context_factory.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/lib/indices/create_api_key.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" + }, + { + "plugin": "enterpriseSearch", + "path": "x-pack/plugins/enterprise_search/server/routes/enterprise_search/api_keys.ts" + }, + { + "plugin": "lists", + "path": "x-pack/plugins/lists/server/get_user.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/live_query/create_live_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/saved_query/create_saved_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/saved_query/update_saved_query_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/pack/create_pack_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/pack/update_pack_route.ts" + }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/routes/asset/update_assets_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_info_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/file_download_handler.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts" + }, + { + "plugin": "reporting", + "path": "x-pack/plugins/reporting/server/routes/common/get_user.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" + }, + { + "plugin": "serverlessSearch", + "path": "x-pack/plugins/serverless_search/server/routes/indices_routes.ts" + }, + { + "plugin": "transform", + "path": "x-pack/plugins/transform/server/routes/api/reauthorize_transforms/route_handler_factory.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "upgradeAssistant", + "path": "x-pack/plugins/upgrade_assistant/server/lib/reindexing/credential_store.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/routes/agent_keys/get_agent_keys_privileges.ts" + }, + { + "plugin": "apm", + "path": "x-pack/plugins/observability_solution/apm/server/routes/fleet/is_superuser.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/synthetics_service/get_api_key.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/observability_solution/synthetics/server/routes/synthetics_service/enablement.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "fleet", + "path": "x-pack/plugins/fleet/server/routes/setup/handlers.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/list.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/actions/state.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/endpoint/routes/suggestions/index.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/base_validator.test.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts" + } + ] }, { "parentPluginId": "security", @@ -5437,10 +5791,12 @@ "parentPluginId": "security", "id": "def-server.SecurityPluginStart.userProfiles", "type": "Object", - "tags": [], + "tags": [ + "deprecated" + ], "label": "userProfiles", "description": [ - "\nUser profiles services to retrieve user profiles." + "\nUser profiles services to retrieve user profiles.\n" ], "signature": [ { @@ -5452,8 +5808,30 @@ } ], "path": "x-pack/packages/security/plugin_types_server/src/plugin.ts", - "deprecated": false, - "trackAdoption": false + "deprecated": true, + "trackAdoption": false, + "references": [ + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/services/notifications/email_notification_service.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/factory.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/client/cases/utils.ts" + }, + { + "plugin": "cases", + "path": "x-pack/plugins/cases/server/services/user_profiles/index.ts" + }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/server/lib/detection_engine/routes/users/suggest_user_profiles_route.ts" + } + ] } ], "lifecycle": "start", diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 9ddb43e306d931..d3fd2b74d03e95 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 413 | 0 | 205 | 3 | +| 414 | 0 | 205 | 3 | ## Client diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 97639944c45151..5a245e3e9a6a78 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2024-06-05 +date: 2024-06-09 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 259354a48343bb..41afe2cdb0b90b 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-06-05 +date: 2024-06-09 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 470ba9d520dc8b..b3a05192f2021d 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-06-05 +date: 2024-06-09 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 9493f6ff6eab28..fe9adee2be44e0 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2024-06-05 +date: 2024-06-09 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 580aaf78fdfbd6..b72994040a5b0d 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2024-06-05 +date: 2024-06-09 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 6f7d93d0a85cf3..a8bfd71e318021 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2024-06-05 +date: 2024-06-09 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 32d004842f302b..c81a3ac6aa8fcf 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.devdocs.json b/api_docs/share.devdocs.json index 90e97c034bb126..5c1a049a9553b0 100644 --- a/api_docs/share.devdocs.json +++ b/api_docs/share.devdocs.json @@ -1310,6 +1310,20 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "share", + "id": "def-public.ShowShareMenuOptions.publicAPIEnabled", + "type": "CompoundType", + "tags": [], + "label": "publicAPIEnabled", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/share/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 9ef7b2b5f2be25..30b38f1e212f81 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 120 | 0 | 59 | 12 | +| 121 | 0 | 60 | 12 | ## Client diff --git a/api_docs/slo.devdocs.json b/api_docs/slo.devdocs.json index 24f688d1fc486e..af855a896ee0dc 100644 --- a/api_docs/slo.devdocs.json +++ b/api_docs/slo.devdocs.json @@ -1262,7 +1262,7 @@ }, "<", "CreateSLOForm", - "<{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; params?: any; value?: string | undefined; field?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }; }>> | undefined; }) => JSX.Element; }" + "<{ type: \"sli.apm.transactionDuration\"; params: { environment: string; service: string; transactionType: string; transactionName: string; threshold: number; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.apm.transactionErrorRate\"; params: { environment: string; service: string; transactionType: string; transactionName: string; index: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.synthetics.availability\"; params: { monitorIds: { value: string; label: string; }[]; index: string; } & { tags?: { value: string; label: string; }[] | undefined; projects?: { value: string; label: string; }[] | undefined; filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; good: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; total: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.custom\"; params: { index: string; good: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; total: { metrics: (({ name: string; aggregation: \"sum\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.metric.timeslice\"; params: { index: string; metric: { metrics: (({ name: string; aggregation: \"min\" | \"max\" | \"sum\" | \"avg\" | \"last_value\" | \"cardinality\" | \"std_deviation\"; field: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"doc_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ name: string; aggregation: \"percentile\"; field: string; percentile: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }))[]; equation: string; threshold: number; comparator: \"GT\" | \"GTE\" | \"LT\" | \"LTE\"; }; timestampField: string; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; } | { type: \"sli.histogram.custom\"; params: { index: string; timestampField: string; good: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); total: ({ field: string; aggregation: \"value_count\"; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }) | ({ field: string; aggregation: \"range\"; from: number; to: number; } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; }); } & { filter?: string | { kqlQuery: string; filters: { meta: { alias?: string | null | undefined; disabled?: boolean | undefined; negate?: boolean | undefined; controlledBy?: string | undefined; group?: string | undefined; index?: string | undefined; isMultiIndex?: boolean | undefined; type?: string | undefined; key?: string | undefined; field?: string | undefined; params?: any; value?: string | undefined; }; query: { [x: string]: any; }; }[]; } | undefined; dataViewId?: string | undefined; }; }>> | undefined; }) => JSX.Element; }" ], "path": "x-pack/plugins/observability_solution/slo/public/types.ts", "deprecated": false, @@ -1541,6 +1541,26 @@ "path": "x-pack/plugins/observability_solution/slo/server/plugin.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "slo", + "id": "def-server.PluginStart.dataViews", + "type": "Object", + "tags": [], + "label": "dataViews", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "server", + "docId": "kibDataViewsPluginApi", + "section": "def-server.DataViewsServerPluginStart", + "text": "DataViewsServerPluginStart" + } + ], + "path": "x-pack/plugins/observability_solution/slo/server/plugin.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index fa326f9e3fe77b..5ea952f9031f0b 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 64 | 0 | 64 | 1 | +| 65 | 0 | 65 | 1 | ## Client diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index f0b8f83b4e5fd9..f3164b454e7f89 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2024-06-05 +date: 2024-06-09 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 8692e1a2ce5c18..ceb3861f5d559c 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2024-06-05 +date: 2024-06-09 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 4d001f66c67e0a..1397892a812824 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2024-06-05 +date: 2024-06-09 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 6afe061d59814a..4d3b89e38792b4 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2024-06-05 +date: 2024-06-09 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 6f81c550781329..5ebf761e41b054 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2024-06-05 +date: 2024-06-09 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 3e52100abf6699..7d071ffa0630a5 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2024-06-05 +date: 2024-06-09 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 32a736453b5954..3a53e7f4d43b91 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2024-06-05 +date: 2024-06-09 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 6dd304982263f1..a678c86073d703 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2024-06-05 +date: 2024-06-09 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 29501507ccf1ef..596a50a44a22b2 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.devdocs.json b/api_docs/text_based_languages.devdocs.json index 1be2693fa3a2da..3718cadcdf195d 100644 --- a/api_docs/text_based_languages.devdocs.json +++ b/api_docs/text_based_languages.devdocs.json @@ -459,6 +459,22 @@ "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "textBasedLanguages", + "id": "def-public.TextBasedLanguagesEditorProps.hideHeaderWhenExpanded", + "type": "CompoundType", + "tags": [], + "label": "hideHeaderWhenExpanded", + "description": [ + "hide header buttons when editor is expanded" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-text-based-editor/src/text_based_languages_editor.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index f4a5c553f1d967..78e1ae0448be5f 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 28 | 0 | 10 | 0 | +| 29 | 0 | 10 | 0 | ## Client diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index a9a1d696e7db67..7112110df1e365 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2024-06-05 +date: 2024-06-09 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 fadd402e39b225..d55c20d2c13835 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2024-06-05 +date: 2024-06-09 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 c2d4e0630be28c..d26fe085260c88 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index 5d620f4757d8a7..d546fabae08c83 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -8056,7 +8056,7 @@ "EuiDataGridCellPopoverElementProps", " & { alert: ", "EcsFieldsResponse", - "; }) => React.ReactNode | JSX.Element) | undefined; } & Omit React.ReactNode | JSX.Element) | undefined; emptyStateHeight?: \"short\" | \"tall\" | undefined; } & Omit, \"renderCellPopover\"> & ", "LazyLoadProps", @@ -8114,7 +8114,7 @@ "EuiDataGridCellPopoverElementProps", " & { alert: ", "EcsFieldsResponse", - "; }) => React.ReactNode | JSX.Element) | undefined; } & Omit React.ReactNode | JSX.Element) | undefined; emptyStateHeight?: \"short\" | \"tall\" | undefined; } & Omit, \"renderCellPopover\"> & ", "LazyLoadProps" diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 63fd71211ef369..14fe30ece8a3f8 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2024-06-05 +date: 2024-06-09 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 d7f47a4c5f7589..deccdca0331914 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2024-06-05 +date: 2024-06-09 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 85b26a0d127828..24c24ce2ab5ada 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2024-06-05 +date: 2024-06-09 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 1bac1f4aa3d0e3..217c697cfb4cd7 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-06-05 +date: 2024-06-09 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 9cfa9da3d0b96e..dc763173c3eaf5 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2024-06-05 +date: 2024-06-09 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 9d91eb5d792b70..4f6795d5b56078 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2024-06-05 +date: 2024-06-09 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 7a5fef5e9cda49..11c412489d6217 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2024-06-05 +date: 2024-06-09 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 bbca679582ce24..6351049b9f3b2d 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-06-05 +date: 2024-06-09 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 7b550c54a118c5..e3434a5610e9ff 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2024-06-05 +date: 2024-06-09 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 d1dff752504b5d..51bc8a3b72cb5f 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2024-06-05 +date: 2024-06-09 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 b665527257e47c..0c2be268b971bc 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2024-06-05 +date: 2024-06-09 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 b96cc6f0908d4b..bf6c3b83ce2237 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2024-06-05 +date: 2024-06-09 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 3bb1016e612fe0..59bd2962640ad3 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2024-06-05 +date: 2024-06-09 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 6ccb0cf1166df8..38ae14f3fe1d9f 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2024-06-05 +date: 2024-06-09 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 0038c2988eee9f..566a5cb230f197 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2024-06-05 +date: 2024-06-09 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 8ba2473615f86b..e686c164cc2c87 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2024-06-05 +date: 2024-06-09 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 deae079852c3ba..b1112c91d1ced8 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2024-06-05 +date: 2024-06-09 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 fc9be06a2d8201..8abb00e34e12b5 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2024-06-05 +date: 2024-06-09 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 6905810c1c5d0c..007810b94ade14 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2024-06-05 +date: 2024-06-09 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 1a2d9a75c4cdf7..6616351c9793a7 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2024-06-05 +date: 2024-06-09 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 7a21b41f684fac..7c21777a2c8185 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2024-06-05 +date: 2024-06-09 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 d72780746a17b2..50191da233b398 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2024-06-05 +date: 2024-06-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.es.yml b/config/serverless.es.yml index ed71ce0d7819ce..0a609b0d40b2cc 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -12,6 +12,22 @@ xpack.serverless.observability.enabled: false enterpriseSearch.enabled: false xpack.fleet.enabled: false xpack.observabilityAIAssistant.enabled: false +xpack.osquery.enabled: false + +## Fine-tune the search solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides. +xpack.features.overrides: + ### Dashboards feature is moved from Analytics category to the Search one. + dashboard.category: "enterpriseSearch" + ### Dev Tools feature is moved from Analytics category to the Search one. + dev_tools.category: "enterpriseSearch" + ### Discover feature is moved from Analytics category to the Search one. + discover.category: "enterpriseSearch" + ### Machine Learning feature is moved from Analytics category to the Management one. + ml.category: "management" + ### Stack Alerts feature is moved from Analytics category to the Search one renamed to simply `Alerts`. + stackAlerts: + name: "Alerts" + category: "enterpriseSearch" ## Cloud settings xpack.cloud.serverless.project_type: search diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index 0d1add8e63f95b..3cee8b352756ea 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -8,6 +8,104 @@ xpack.uptime.enabled: true xpack.securitySolution.enabled: false xpack.search.notebooks.enabled: false +## Fine-tune the observability solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides. +xpack.features.overrides: + ### Applications feature privileges are fine-tuned to grant access to Logs, and Observability apps. + apm: + ### By default, this feature named as `APM and User Experience`, but should be renamed to `Applications`. + name: "Applications" + privileges: + # Infrastructure's `All` feature privilege should implicitly grant `All` access to Logs and Observability apps. + all.composedOf: + - feature: "logs" + privileges: [ "all" ] + - feature: "observability" + privileges: [ "all" ] + # Infrastructure's `Read` feature privilege should implicitly grant `Read` access to Logs and Observability apps. + read.composedOf: + - feature: "logs" + privileges: [ "read" ] + - feature: "observability" + privileges: [ "read" ] + ### Dashboards feature should be moved from Analytics category to the Observability one. + dashboard.category: "observability" + ### Discover feature should be moved from Analytics category to the Observability one and its privileges are + ### fine-tuned to grant access to Observability app. + discover: + category: "observability" + privileges: + # Discover `All` feature privilege should implicitly grant `All` access to Observability app. + all.composedOf: + - feature: "observability" + privileges: [ "all" ] + # Discover `Read` feature privilege should implicitly grant `Read` access to Observability app. + read.composedOf: + - feature: "observability" + privileges: [ "read" ] + ### Fleet feature privileges are fine-tuned to grant access to Logs app. + fleetv2: + privileges: + # Fleet `All` feature privilege should implicitly grant `All` access to Logs app. + all.composedOf: + - feature: "logs" + privileges: [ "all" ] + # Fleet `Read` feature privilege should implicitly grant `Read` access to Logs app. + read.composedOf: + - feature: "logs" + privileges: [ "read" ] + ### Infrastructure feature privileges are fine-tuned to grant access to Logs, and Observability apps. + infrastructure: + ### By default, this feature named as `Metrics`, but should be renamed to `Infrastructure`. + name: "Infrastructure" + privileges: + # Infrastructure's `All` feature privilege should implicitly grant `All` access to Logs and Observability apps. + all.composedOf: + - feature: "logs" + privileges: [ "all" ] + - feature: "observability" + privileges: [ "all" ] + # Infrastructure's `Read` feature privilege should implicitly grant `Read` access to Logs and Observability apps. + read.composedOf: + - feature: "logs" + privileges: [ "read" ] + - feature: "observability" + privileges: [ "read" ] + ### Logs feature is hidden in Role management since it's automatically granted by either Infrastructure, or Applications features. + logs.hidden: true + ### Machine Learning feature should be moved from Analytics category to the Observability one and renamed to `AI Ops`. + ml: + category: "observability" + order: 1200 + ### Observability feature is hidden in Role management since it's automatically granted by either Discover, + ### Infrastructure, Applications, Synthetics, or SLOs features. + observability.hidden: true + ### SLOs feature privileges are fine-tuned to grant access to Observability app. + slo: + privileges: + # SLOs `All` feature privilege should implicitly grant `All` access to Observability app. + all.composedOf: + - feature: "observability" + privileges: [ "all" ] + # SLOs `Read` feature privilege should implicitly grant `Read` access to Observability app. + read.composedOf: + - feature: "observability" + privileges: [ "read" ] + ### Stack alerts is hidden in Role management since it's not needed. + stackAlerts.hidden: true + ### Synthetics feature privileges are fine-tuned to grant access to Observability app. + uptime: + ### By default, this feature named as `Synthetics and Uptime`, but should be renamed to `Synthetics` since `Uptime` is not available. + name: "Synthetics" + privileges: + # Synthetics `All` feature privilege should implicitly grant `All` access to Observability app. + all.composedOf: + - feature: "observability" + privileges: [ "all" ] + # Synthetics `Read` feature privilege should implicitly grant `Read` access to Observability app. + read.composedOf: + - feature: "observability" + privileges: [ "read" ] + ## Enable the slo plugin xpack.slo.enabled: true diff --git a/config/serverless.security.yml b/config/serverless.security.yml index 88770178a34934..6f39182d1e2e69 100644 --- a/config/serverless.security.yml +++ b/config/serverless.security.yml @@ -9,6 +9,43 @@ xpack.observability.enabled: false xpack.observabilityAIAssistant.enabled: false xpack.search.notebooks.enabled: false +## Fine-tune the security solution feature privileges. Also, refer to `serverless.yml` for the project-agnostic overrides. +xpack.features.overrides: + ### Dashboard feature is hidden in Role management since it's automatically granted by SIEM feature. + dashboard.hidden: true + ### Discover feature is hidden in Role management since it's automatically granted by SIEM feature. + discover.hidden: true + ### Machine Learning feature is moved from Analytics category to the Security one as the last item. + ml: + category: "security" + order: 1101 + ### Security's feature privileges are fine-tuned to grant access to Discover, Dashboard, Maps, and Visualize apps. + siem: + privileges: + ### Security's `All` feature privilege should implicitly grant `All` access to Discover, Dashboard, Maps, and + ### Visualize features. + all.composedOf: + - feature: "discover" + privileges: [ "all" ] + - feature: "dashboard" + privileges: [ "all" ] + - feature: "visualize" + privileges: [ "all" ] + - feature: "maps" + privileges: [ "all" ] + # Security's `Read` feature privilege should implicitly grant `Read` access to Discover, Dashboard, Maps, and + # Visualize features. Additionally, it should implicitly grant privilege to create short URLs in Discover, + ### Dashboard, and Visualize apps. + read.composedOf: + - feature: "discover" + privileges: [ "read" ] + - feature: "dashboard" + privileges: [ "read" ] + - feature: "visualize" + privileges: [ "read" ] + - feature: "maps" + privileges: [ "read" ] + ## Cloud settings xpack.cloud.serverless.project_type: security diff --git a/config/serverless.yml b/config/serverless.yml index 43ac498e0901d1..cb4bbac7c92faf 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -8,6 +8,59 @@ xpack.fleet.internal.activeAgentsSoftLimit: 25000 xpack.fleet.internal.onlyAllowAgentUpgradeToKnownVersions: true xpack.fleet.internal.retrySetupOnBoot: true +## Fine-tune the feature privileges. +xpack.features.overrides: + dashboard: + privileges: + ### Dashboard's `All` feature privilege should implicitly grant `All` access to Maps and Visualize features. + all.composedOf: + - feature: "maps" + privileges: [ "all" ] + - feature: "visualize" + privileges: [ "all" ] + ### Dashboard's `Read` feature privilege should implicitly grant `Read` access to Maps and Visualize features. + ### Additionally, it should implicitly grant privilege to create short URLs in Visualize app. + read.composedOf: + - feature: "maps" + privileges: [ "read" ] + - feature: "visualize" + privileges: [ "read" ] + ### All Dashboard sub-feature privileges should be hidden: reporting capabilities will be granted via dedicated + ### Reporting feature and short URL sub-feature privilege should be granted for both `All` and `Read`. + subFeatures.privileges: + download_csv_report.disabled: true + generate_report.disabled: true + store_search_session.disabled: true + url_create: + disabled: true + includeIn: "read" + discover: + ### All Discover sub-feature privileges should be hidden: reporting capabilities will be granted via dedicated + ### Reporting feature and short URL sub-feature privilege should be granted for both `All` and `Read`. + subFeatures.privileges: + generate_report.disabled: true + store_search_session.disabled: true + url_create: + disabled: true + includeIn: "read" + ### Shared images feature is hidden in Role management since it's not needed. + filesSharedImage.hidden: true + ### Maps feature is hidden in Role management since it's automatically granted by Dashboard feature. + maps.hidden: true + ### Reporting feature is supposed to give access to reporting capabilities across different features. + reporting: + privileges: + all.composedOf: + - feature: "dashboard" + privileges: [ "download_csv_report" ] + - feature: "discover" + privileges: [ "generate_report" ] + ### Visualize feature is hidden in Role management since it's automatically granted by Dashboard feature. + visualize: + hidden: true + ### The short URL sub-feature privilege should be always granted. + subFeatures.privileges.url_create.includeIn: "read" + # Cloud links xpack.cloud.base_url: 'https://cloud.elastic.co' @@ -104,9 +157,6 @@ elasticsearch.ignoreVersionMismatch: true # Limit maxSockets to 800 as we do in ESS, which improves reliability under high loads. elasticsearch.maxSockets: 800 -# Enable dynamic config to be updated via the internal HTTP requests -coreApp.allowDynamicConfigOverrides: true - # Visualizations editors readonly settings vis_type_gauge.readOnly: true vis_type_heatmap.readOnly: true diff --git a/dev_docs/key_concepts/encrypted_saved_objects.mdx b/dev_docs/key_concepts/encrypted_saved_objects.mdx new file mode 100644 index 00000000000000..9e737306a63afb --- /dev/null +++ b/dev_docs/key_concepts/encrypted_saved_objects.mdx @@ -0,0 +1,405 @@ +--- +id: kibDevDocsEncryptedSavedObjectsIntro +slug: /kibana-dev-docs/key-concepts/encrypted-saved-objects-intro +title: Encrypted Saved Objects +description: Configure your saved object types to secure sensitive data. +date: 2024-05-21 +tags: ['kibana', 'dev', 'contributor', 'api docs'] +--- + +## Overview + +"Encrypted Saved Objects" (ESO) are that have been registered with the Encrypted Saved Objects +Service (ESO Service) to specify which attributes should be protected (encrypted attributes) and which attributes, if any, should be present and unchanged +in order to decrypt the protected attributes ("Additional Authenticated Data", or AAD). + +The ESO Service encrypts ESOs with the Encrypted Saved Object encryption key, a Kibana configuration setting. This setting must have a valid value for the ESO Service +to function. For more details see [Secure saved objects](https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html). When running in a +development environment, Kibana is always automatically configured with a static ESO encryption key of "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa". +As the ESO encryption key is an optional setting, developers should rely on the `canEncrypt` function exposed by the ESO Plugin to decide whether they should +gracefully degrade any functionality dependent on ESOs, or reject functioning entirely. + +Developers create and manage their Encrypted Saved Object types programmatically. This document will cover the basics. + +## Registering an Encrypted Saved Object Type + +### Should your Saved Object be an Encrypted Saved Object? + +Most Saved Object types do not need to be registered as an encrypted type. Only register a Saved Object type with the ESO service if it contains sensitive +information. What sort of information is considered sensitive? Here is a non-inclusive list to help you make a determination: + +- Credentials: usernames, passwords, API keys, access keys +- Personally identifiable information (PII): social security numbers or equivalent, back routing numbers, credit card numbers +- Other sensitive information: private endpoints, secrets, etc. + +When in doubt, consult with the Kibana Security team (Application Experience/Platform Services/Security). + +### Registration + +To register a Saved Object type, the type must first be registered with the Saved Objects Repository. This can be achieved by calling the Saved Object Service's +`registerType` function. More information can be found in the tutorial. Once the +Saved Object type is registered, use the ESO Plugin's `registerType` function, and provide an `EncryptedSavedObjectTypeRegistration` object that defines how the +object should be encrypted. + +```ts + export interface EncryptedSavedObjectTypeRegistration { + readonly type: string; // The name of the Saved Object type. This must match the name used to register the type with Core's Saved Object Service. + readonly attributesToEncrypt: ReadonlySet; // The attributes to protect (anything considered sensitive data) + readonly attributesToIncludeInAAD?: ReadonlySet; // The attributes to include in AAD (more on this below) + } +``` + +`attributesToEncrypt` can be defined by either a string matching the name of the attribute, or an `AttributeToEncrypt` object, which enables you to specify when +an attribute's value should be allowed to be "dangerously exposed". There are generally three use cases to consider regarding the accessing of encrypted values: + +1. By default, when ESOs are retrieved with any "standard" Saved Object Client APIs (e.g. get, find), decryption does not occur, and instead all encrypted +attributes are removed from the returned Saved Objects. +2. As a plugin developer, if you want to access decrypted attributes of ESOs, you should use the dedicated APIs exposed via the Encrypted Saved Objects Client (e.g. +`getDecryptedAsInternalUser`, `createPointInTimeFinderDecryptedAsInternalUser`). When using these functions, it is assumed that you will only consume decrypted +attributes internally and will not expose them to end users unless it is absolutely necessary. In this case, these APIs can serve as a way to conditionally expose +certain decrypted secrets in a controlled manner. +3. If decrypted attributes should be exposed to anyone who has access to the Saved Object itself, these ESO attributes should be registered with +`dangerouslyExposeValue: true`. This way, all "standard" Saved Object Client APIs will decrypt these corresponding encrypted attributes and return them to the +consumer. As the `dangerouslyExposeValue` name implies, the decision to expose decrypted attributes should be thoroughly evaluated and documented. + +### AAD + +AAD, or Additional Authenticated Data, is part of an "Authenticated Encryption" schema. AAD is an unencrypted string that is used during encryption and decryption +operations in addition to the supplied encryption key, to protect access to encrypted values. If AAD is used during encryption, it must be provided during decryption, +and must be an exact match to the AAD value used during encryption, otherwise decryption will fail. In this way, AAD is bound to any encrypted data. Typically, AAD +comprises data that could only be accessed by an authenticated user and either never changes, or only potentially changes when encrypted data changes. + +For ESOs, AAD is constructed of key-value pairs composed of the Saved Object Descriptor and any attributes included in `attributesToIncludeInAAD` when the ESO is +registered. The Saved Object Descriptor consists of the object type, ID, and, if applicable, namespace (or space ID). The descriptor for space-agnostic types +(`namespaceType: 'agnostic'`), and multi-namespace types (`namespaceType: 'multiple-isolated'` and `namespaceType: 'multiple'`), will not include a namespace. Thus, +the Saved Object Descriptor for a Saved Object never changes. + +```ts + export interface SavedObjectDescriptor { + readonly id: string; + readonly type: string; + readonly namespace?: string; + } +``` + +Any time an ESO's AAD changes (when any attribute that is included in AAD changes), all encrypted attributes of that ESO must be re-encrypted to account for the new AAD. +This is one reason why it is important to carefully consider whether an attribute should be included in AAD. More on this below in + + +#### Nested attributes + +When an attribute is included in AAD, all of its properties, or subfields, are inherently included in AAD. When AAD is constructed as key-value pairs, the nested properties +of an attribute are all included in its value. In this way, AAD inclusion is hierarchical. If restructuring the attributes of an object to account for AAD hierarchical +inclusion is not possible or desireable, you can make use of more granular keys, e.g. `firstLevelAttribute.nestedFieldToInclude`. + +#### What attributes should be included in AAD + +Determining which attributes to include in AAD is not an exact science, however there are some basic guidelines. + +Good candidates for attributes to INCLUDE in AAD are attributes that... +- have some association or relationship with an encrypted attribute (e.g. a configuration element of an ESO that reflects the shape of the encrypted data, the token type of a connector, the URL or TLS certificate for a monitor) +- have a value that will never change once an object is created (e.g the created date or created by user, the type of action or connector) + +Good candidates for attributes to EXCLUDE from AAD are attributes that... + +- the value can be changed by an end user, and is meant to be updated separately from encrypted data, and has no association to any of the encrypted or AAD attributes (e.g. the name or UI properties of an object, the email title for an action or alert) +- may not be present or populated, or populated algorithmically (e.g. any optional attributes, or calculated attributes like statistics or last updated time) +- may be removed from the object or refactored in the future (e.g. deprecated or soon-to-be deprecated attributes, experimental attributes) +- contain a large amount of data that can significantly slow down encryption and decryption, especially during bulk operations (e.g. large geo shape, arbitrary HTML document or image data) + +There are additional considerations to make due to how version upgrades work in Serverless. These are covered in more detail in the + section, but the basics are: + +- An attribute cannot be removed from AAD once it is included, unless it can be altogether removed from the object type, or refactored with a new name. +- An existing attribute cannot be added to AAD if it was not included in AAD when it was first defined and has already been populated. + +When making the decision of which attributes to include in AAD, it is best to be conservative and only include attributes that the owning team is 100% confident +should be included. + +## Caveats + +### Partial Updates + +Partial updates on ESOs are only possible if the changes are limited to unencrypted and non-AAD attributes. Any changes to an ESO's encrypted values or AAD- +included values requires re-encryption, which means the entire object must be provided when updating to avoid corrupting the object. If an ESO is corrupted by +a partial update, it will be effectively undecryptable. Currently, there is nothing preventing or limiting partial updates of ESOs (see open GitHub issue +[50256](https://github.com/elastic/kibana/issues/50256)), so this requires consistent diligence from developers utilizing ESOs. + +### Migrations, Backward compatibility, and Serverless + +With time you may need to change your ESO types. Model Versions allow developers to make versioned changes to Saved Object types, but an ESO type requires special +handling if there are changes to its encrypted attributes or attributes that are included in AAD - in both cases an object must be re-encrypted. For this case the +ESO Service exposes a Model Version wrapper function API `createModelVersion`. Similar in utility to its predecessor (`createMigration` - used with non-Model Version +Saved Object legacy migrations), `createModelVersion` provides a way to wrap a Model Version definition such that decryption and encryption occur automatically +during migration of any applicable ESOs. + +In addition to a Model Version definition, `createModelVersion` also requires both an "input type" and "output type" `EncryptedSavedObjectTypeRegistration` +input parameters. + +```ts +export interface CreateEsoModelVersionFnOpts { + modelVersion: SavedObjectsModelVersion; + shouldTransformIfDecryptionFails?: boolean; + inputType: EncryptedSavedObjectTypeRegistration; + outputType: EncryptedSavedObjectTypeRegistration; +} +``` + +The `inputType` parameter provides the necessary ESO registration definition for decrypting an ESO of the preceding Model Version prior to performing any transforms +defined by the Model Version. The `outputType` parameter provides the necessary ESO registration definition for encrypting an ESO once the transforms defined in the +Model Version have been completed. All of the Model Version transform functions ('unsafe_transform', 'data_backfill', 'data_removal'), are merged into a single +transform function for efficiency. This way, each ESO only needs to be decrypted and re-encrypted once to incorporate all of the changes defined in a Model Version. +The optional `shouldTransformIfDecryptionFails` parameter defines whether an ESO type should proceed with the Model Version changes even if decryption fails. + +Some examples of `createModelVersion` can be found in the ESO Model Version example plugin ( +[examples/eso_model_version_example/server/plugin.ts](https://github.com/elastic/kibana/blob/06fc22a0f15e692857ba689a7b0ddec91ed2dac2/examples/eso_model_version_example/server/plugin.ts)) + +For more information see our developer documentation for . + +#### Serverless Considerations + +Changes to ESOs must be carefully considered due to how upgrades occur for Serverless projects. In Serverless, there is a "Zero Downtime" (ZDT) upgrade algorithm. This +means that both the latest and previous versions of Kibana may be running simultaneously. In regard to ESOs, this means that the previous version of Kibana may attempt +to access ESOs that have been migrated by the latest version of Kibana, and in order to do so, must be able to decrypt them successfully without having any knowledge of +the new Model Version definition or changes to the ESO's `EncryptedSavedObjectTypeRegistration`. Thus, if an ESO's AAD has changed due to the migration, the previous +version will not be able to decrypt it. It is critical that when changes are made to an ESO, that they either do not affect its AAD or are staged carefully in +subsequent Model Versions. + +It is worth noting here that if a ESO's Model Version `forwardCompatibility` schema is set to drop unknown fields (when the `unknowns` option is set to `ignore`), +ESOs of this type will first be decrypted before the unknown fields are dropped. This more easily supports the hierarchical aspect of AAD-included attributes - when +subfields of an attribute are added or removed, the previous version of Kibana will still be able to successfully construct AAD and decrypt the object. + +The table below offers some general guidance on how various changes could be supported (or not). Keep in mind that any time you are adding or removing attributes from +a Saved Object type, all related business logic for that type must be capable of gracefully and appropriately handling an object with or without the attribute in both +the current and previous version of Kibana. Some of the advice here is applicable to any Saved Object type migration. + +| Change to ESO | Encrypted? | In AAD? | General Guidance | +| -------------------------------------------- | ---------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Add a new attribute | No | No | Implement a Model Version as needed. There is no need to wrap the Model Version with `createModelVersion` because AAD is unaffected. Implement a `forwardCompatibility` schema and ignore unknowns if the previous version of Kibana will not be able to tolerate the additional attribute. | +| Add a new attribute | No | Yes | This will require 2 Serverless release stages. `Release 1`: Add the attribute to the ESO's `attributesToIncludeInAAD`. Do not yet populate or use the new attribute. `Release 2`: Implement a Model Version and wrap it in a call to `createModelVersion`, providing the former `EncryptedSavedObjectTypeRegistration` as the input type, and the new `EncryptedSavedObjectTypeRegistration` as the output type. Implement a Model Version `backfill` change as needed. The attribute can safely be populated in this release. | +| Add a new attribute | Yes | N/A | Implement a Model Version and wrap it in a call to `createModelVersion`. Implement Model Version changes as needed. Implement a `forwardCompatibility` schema and ignore unknowns if the previous version of Kibana will not be able to tolerate additions to the attribute. | +| Add an existing attribute to AAD | No | No->Yes | This is not currently supported. Existing attributes that are in use and populated with data cannot be added to AAD. The previous version of Kibana will never be able to successfully perform decryption in this case. | +| Remove an existing attribute | No | No | Implement a Model Version as needed. There is no need to wrap the Model Version with `createModelVersion` because AAD is unaffected. If the previous version of Kibana will not be able to tolerate the missing attribute, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type without the attribute that will be removed. `Release 2`: implement a Model Version as described. | +| Remove an existing attribute | No | Yes | Implement a Model Version and wrap it in a call to `createModelVersion`, providing the former `EncryptedSavedObjectTypeRegistration` as the input type, and the new `EncryptedSavedObjectTypeRegistration` as the output type. The previous version of Kibana will be able to decrypt objects without this attribute, as attributes that are not present are never included when constructing AAD. If the previous version of Kibana will not be able to tolerate the missing attribute, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type without the attribute that will be removed. `Release 2`: implement a Model Version as described. | +| Remove an existing attribute | Yes | N/A | Implement a Model Version as needed. There is no need to wrap the Model Version with `createModelVersion` because AAD is unaffected. The previous version of Kibana will not throw an error if there is a missing encrypted attribute, but will add a debug-level log. If the previous version of Kibana will not be able to tolerate the missing attribute, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type without the attribute that will be removed. `Release 2`: implement a Model Version as described. | +| Modify an attribute (add or remove subfield) | No | No | Implement a Model Version as needed. There is no need to wrap the Model Version with `createModelVersion` because AAD is unaffected. If the previous version of Kibana will not be able to tolerate the changes, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type with the modified attribute. `Release 2`: implement a Model Version as described. | +| Modify an attribute (add or remove subfield) | No | Yes | Implement a Model Version and wrap it in a call to `createModelVersion`, providing the former `EncryptedSavedObjectTypeRegistration` as the input type, and the new `EncryptedSavedObjectTypeRegistration` as the output type. The previous version of Kibana will be able to decrypt objects with the changed attribute, as all subfields are inherent in the value of AAD-included attributes when constructing AAD. If the previous version of Kibana will not be able to tolerate the attribute changes, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type with the modified attribute. `Release 2`: implement a Model Version as described. | +| Modify an attribute (add or remove subfield) | Yes | N/A | Implement a Model Version and wrap it in a call to `createModelVersion`. Implement Model Version changes as needed. Even though AAD is unaffected, the objects will require decryption and re-encryption to be modified. If the previous version of Kibana will not be able to tolerate the attribute changes, this will require 2 Serverless release stages. `Release 1`: update all business logic to handle this type with the modified attribute. `Release 2`: implement a Model Version as described. | +| Change an existing attribute to be encrypted | No->Yes | No/Yes | This is not currently supported. The previous version of Kibana will not decrypt this attribute, and any business logic that utilizes the attribute will fail. | +| Remove an attribute from the encrypted list | Yes->No | No | This is not currently supported. The previous version of Kibana will always attempt to decrypt the attribute. | +| Remove an attribute from AAD inclusion | No | Yes->No | This is not currently supported. The previous version of Kibana will always use the attribute to construct AAD. | + +## A real world example + +Let's examine one of the latest ESO types as of writing this document, the 'ad_hoc_run_params' type. We're using this type as an example, because it is one of the first +new ESO types to use a Model Version, and it is a fairly simple type (compared to other Model Version ESOs). + +### Registering the Saved Object type + +Below is the call to register the type. + +```ts + savedObjects.registerType({ + name: AD_HOC_RUN_SAVED_OBJECT_TYPE, // 'ad_hoc_run_params' + indexPattern: ALERTING_CASES_SAVED_OBJECT_INDEX, + hidden: true, + namespaceType: 'multiple-isolated', + mappings: { + dynamic: false, + properties: { + apiKeyId: { + type: 'keyword', + }, + createdAt: { + type: 'date', + }, + end: { + type: 'date', + }, + rule: { + properties: { + alertTypeId: { + type: 'keyword', + }, + consumer: { + type: 'keyword', + }, + }, + }, + start: { + type: 'date', + }, + }, + }, + management: { + importableAndExportable: false, + }, + modelVersions: adHocRunParamsModelVersions, + }); +``` +And here is what the Model Version and schemas look like: + +```ts + const adHocRunParamsModelVersions: CustomSavedObjectsModelVersionMap = { + '1': { + changes: [], + schemas: { + forwardCompatibility: rawAdHocRunParamsSchemaV1.extends({}, { unknowns: 'ignore' }), + create: rawAdHocRunParamsSchemaV1, + }, + isCompatibleWithPreviousVersion: () => true, + }, + }; + + const rawAdHocRunParamsSchema = schema.object({ + apiKeyId: schema.string(), + apiKeyToUse: schema.string(), + createdAt: schema.string(), + duration: schema.string(), + enabled: schema.boolean(), + end: schema.maybe(schema.string()), + rule: rawAdHocRunParamsRuleSchema, + spaceId: schema.string(), + start: schema.string(), + status: rawAdHocRunStatus, + schedule: schema.arrayOf(rawAdHocRunSchedule), + }); + + const rawAdHocRunParamsRuleSchema = schema.object({ + name: schema.string(), + tags: schema.arrayOf(schema.string()), + alertTypeId: schema.string(), + params: schema.recordOf(schema.string(), schema.maybe(schema.any())), + apiKeyOwner: schema.nullable(schema.string()), + apiKeyCreatedByUser: schema.maybe(schema.nullable(schema.boolean())), + consumer: schema.string(), + enabled: schema.boolean(), + schedule: schema.object({ + interval: schema.string(), + }), + createdBy: schema.nullable(schema.string()), + updatedBy: schema.nullable(schema.string()), + updatedAt: schema.string(), + createdAt: schema.string(), + revision: schema.number(), + }); + + const rawAdHocRunStatus = schema.oneOf([ + schema.literal('complete'), + schema.literal('pending'), + schema.literal('running'), + schema.literal('error'), + schema.literal('timeout'), + ]); + + const rawAdHocRunSchedule = schema.object({ + interval: schema.string(), + status: rawAdHocRunStatus, + runAt: schema.string(), + }); +``` + +### Registering the type as an Encrypted Saved Object + +```ts + encryptedSavedObjects.registerType({ + type: AD_HOC_RUN_SAVED_OBJECT_TYPE, // 'ad_hoc_run_params' - the type name must match + attributesToEncrypt: new Set(['apiKeyToUse']), + attributesToIncludeInAAD: new Set(['rule', 'spaceId']), + }); +``` + +There is only one encrypted attribute, `apiKeyToUse`, which contains the API key that needs to be protected. The attributes to include in AAD consist of the `spaceId`, +and the `rule` definition. Since the object's namespace type is `'multiple-isolated'`, the space ID (or namespace) will not automatically be part of AAD by way of the +Saved Object Descriptor (see ). In theory, the space id will never change for a +`'multiple-isolated'`, which makes it a reasonable candidate for an AAD field. + +The `rule` attribute contains values related to the encrypted attribute `apiKeyToUse`, or that will never change: + +```ts + apiKeyOwner: schema.nullable(schema.string()), + apiKeyCreatedByUser: schema.maybe(schema.nullable(schema.boolean())), + createdBy: schema.nullable(schema.string()), + createdAt: schema.string(), +``` + +The above are prime examples of the type of attributes that should comprise AAD. The `rule` attribute also contains some attributes that may change independently of the +encrypted attribute `apiKeyToUse`: + +```ts + enabled: schema.boolean(), + schedule: schema.object({ + interval: schema.string(), + }), + updatedBy: schema.nullable(schema.string()), + updatedAt: schema.string(), + revision: schema.number(), +``` + +This is not a problem, but it is important to consider that a change to any of these attributes will require re-encryption of an object. It is worth considering the nature +of AAD hierarchical inclusion when structuring attributes for your saved objects. You can also utilize more granular keys when specifying which attributes to include in AAD, +e.g. `rule.apiKeyOwner`. For more information, see the section of +this document. + +Additionally, the owning team implemented a type to help manage partial updates. This is a great addition to ensure changes to the ESOs do not render them undecryptable. + +```ts +export type AdHocRunAttributesNotPartiallyUpdatable = 'rule' | 'spaceId' | 'apiKeyToUse'; +``` + +Usage: +```ts +export type PartiallyUpdateableAdHocRunAttributes = Partial< + Omit +>; + +interface PartiallyUpdateAdHocRunSavedObjectOptions { + refresh?: SavedObjectsUpdateOptions['refresh']; + version?: string; + ignore404?: boolean; + namespace?: string; // only should be used with ISavedObjectsRepository +} + +// typed this way so we can send a SavedObjectClient or SavedObjectRepository +type SavedObjectClientForUpdate = Pick; + +export async function partiallyUpdateAdHocRun( + savedObjectsClient: SavedObjectClientForUpdate, + id: string, + attributes: PartiallyUpdateableAdHocRunAttributes, + options: PartiallyUpdateAdHocRunSavedObjectOptions = {} +): Promise { + // ensure we only have the valid attributes that are not encrypted and are excluded from AAD + const attributeUpdates = omit(attributes, [ + ...AdHocRunAttributesToEncrypt, + ...AdHocRunAttributesIncludedInAAD, + ]); + const updateOptions: SavedObjectsUpdateOptions = pick( + options, + 'namespace', + 'version', + 'refresh' + ); + + try { + await savedObjectsClient.update( + AD_HOC_RUN_SAVED_OBJECT_TYPE, + id, + attributeUpdates, + updateOptions + ); + } catch (err) { + if (options?.ignore404 && SavedObjectsErrorHelpers.isNotFoundError(err)) { + return; + } + throw err; + } +} +``` + +## Making Changes + +If you will be making changes to your ESOs, or creating new ESOs, the AppEx Platform Services Security team is available for consultation and assistance. Please reach +out to us on Slack (#kibana-security) with any questions or queries. + +We also ask that you please tag us (@elastic/kibana-security) for review on any PRs related to ESOs. \ No newline at end of file diff --git a/docs/api/synthetics/private-locations/create-private-location.asciidoc b/docs/api/synthetics/private-locations/create-private-location.asciidoc index ae00c8a1f21330..61a71de535b9ac 100644 --- a/docs/api/synthetics/private-locations/create-private-location.asciidoc +++ b/docs/api/synthetics/private-locations/create-private-location.asciidoc @@ -61,7 +61,7 @@ The API returns the created private location as follows: [source,json] -------------------------------------------------- { - "id": "unique-location-id", + "id": "abcd1234", "label": "Private Location 1", "agentPolicyId": "abcd1234", "tags": ["private", "testing"], diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index d861a4e72c572f..451d978c048285 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -102,6 +102,10 @@ This API doesn't support angular, for registering angular dev tools, bootstrap a |Embeddables are React components that manage their own state, can be serialized and deserialized, and return an API that can be used to interact with them imperatively. +|{kib-repo}blob/{branch}/src/plugins/esql_datagrid/README.md[esqlDataGrid] +|Contains a Discover-like table specifically for ES|QL queries: + + |{kib-repo}blob/{branch}/src/plugins/es_ui_shared/README.md[esUiShared] |This plugin contains reusable code in the form of self-contained modules (or libraries). Each of these modules exports a set of functionality relevant to the domain of the module. @@ -634,6 +638,10 @@ the infrastructure monitoring use-case within Kibana. |The ingest_pipelines plugin provides Kibana support for Elasticsearch's ingest pipelines. +|{kib-repo}blob/{branch}/x-pack/plugins/observability_solution/investigate/README.md[investigate] +|undefined + + |{kib-repo}blob/{branch}/x-pack/plugins/kubernetes_security/README.md[kubernetesSecurity] |This plugin provides interactive visualizations of your Kubernetes workload and session data. diff --git a/docs/management/action-types.asciidoc b/docs/management/action-types.asciidoc index 0d8f43925a1fc3..d1dc68045110b2 100644 --- a/docs/management/action-types.asciidoc +++ b/docs/management/action-types.asciidoc @@ -20,6 +20,10 @@ a| <> | Send a request to D3 Security. +a| <> + +| Send a request to {gemini}. + a| <> | Send email from your server. diff --git a/docs/management/connectors/action-types/gemini.asciidoc b/docs/management/connectors/action-types/gemini.asciidoc new file mode 100644 index 00000000000000..d1693f0b5ec28b --- /dev/null +++ b/docs/management/connectors/action-types/gemini.asciidoc @@ -0,0 +1,74 @@ +[[gemini-action-type]] +== {gemini} connector and action +++++ +{gemini} +++++ +:frontmatter-description: Add a connector that can send requests to {gemini}. +:frontmatter-tags-products: [kibana] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [configure] + + +The {gemini} connector uses https://github.com/axios/axios[axios] to send a POST request to {gemini}. The connector uses the <> to send the request. + +[float] +[[define-gemini-ui]] +=== Create connectors in {kib} + +You can create connectors in *{stack-manage-app} > {connectors-ui}*. For example: + +[role="screenshot"] +image::management/connectors/images/gemini-connector.png[{gemini} connector] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[float] +[[gemini-connector-configuration]] +==== Connector configuration + +{gemini} connectors have the following configuration properties: + +Name:: The name of the connector. +API URL:: The {gemini} request URL. +PROJECT ID:: The project which has Vertex AI endpoint enabled. +Region:: The GCP region where the Vertex AI endpoint enabled. +Default model:: The GAI model for {gemini} to use. Current support is for the Google Gemini models, defaulting to gemini-1.5-pro-preview-0409. The model can be set on a per request basis by including a "model" parameter alongside the request body. +Credentials JSON:: The GCP service account JSON file for authentication. + +[float] +[[gemini-action-configuration]] +=== Test connectors + +You can test connectors with the <> or +as you're creating or editing the connector in {kib}. For example: + +[role="screenshot"] +image::management/connectors/images/gemini-params.png[{gemini} params test] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +The {gemini} actions have the following configuration properties. + +Body:: A stringified JSON payload sent to the {gemini} Invoke Model API URL. For example: ++ +[source,text] +-- + +{ + body: JSON.stringify({ + contents: [{ + role: user, + parts: [{ text: 'Write the first line of a story about a magic backpack.' }] + }], + generation_config: { + temperature: 0, + maxOutputTokens: 8192 + } + }) +} +-- +Model:: An optional string that will overwrite the connector's default model. For + +[float] +[[gemini-connector-networking-configuration]] +=== Connector networking configuration + +Use the <> to customize connector networking configurations, such as proxies, certificates, or TLS settings. You can set configurations that apply to all your connectors or use `xpack.actions.customHostSettings` to set per-host configurations. diff --git a/docs/management/connectors/images/gemini-connector.png b/docs/management/connectors/images/gemini-connector.png new file mode 100644 index 00000000000000..fdb3bb8144d6f3 Binary files /dev/null and b/docs/management/connectors/images/gemini-connector.png differ diff --git a/docs/management/connectors/images/gemini-params.png b/docs/management/connectors/images/gemini-params.png new file mode 100644 index 00000000000000..b08456f5bf3f03 Binary files /dev/null and b/docs/management/connectors/images/gemini-params.png differ diff --git a/docs/management/connectors/index.asciidoc b/docs/management/connectors/index.asciidoc index 2439de69f364e3..a5f0c7fbd55036 100644 --- a/docs/management/connectors/index.asciidoc +++ b/docs/management/connectors/index.asciidoc @@ -2,6 +2,7 @@ include::action-types/bedrock.asciidoc[leveloffset=+1] include::action-types/cases-action-type.asciidoc[leveloffset=+1] include::action-types/d3security.asciidoc[leveloffset=+1] include::action-types/email.asciidoc[leveloffset=+1] +include::action-types/gemini.asciidoc[leveloffset=+1] include::action-types/resilient.asciidoc[leveloffset=+1] include::action-types/index.asciidoc[leveloffset=+1] include::action-types/jira.asciidoc[leveloffset=+1] diff --git a/docs/settings/alert-action-settings.asciidoc b/docs/settings/alert-action-settings.asciidoc index 7bd1a09396d013..6528e1a60b7bc3 100644 --- a/docs/settings/alert-action-settings.asciidoc +++ b/docs/settings/alert-action-settings.asciidoc @@ -138,7 +138,7 @@ WARNING: This feature is available in {kib} 7.17.4 and 8.3.0 onwards but is not A boolean value indicating that a footer with a relevant link should be added to emails sent as alerting actions. Default: true. `xpack.actions.enabledActionTypes` {ess-icon}:: -A list of action types that are enabled. It defaults to `["*"]`, enabling all types. The names for built-in {kib} action types are prefixed with a `.` and include: `.email`, `.index`, `.jira`, `.opsgenie`, `.pagerduty`, `.resilient`, `.server-log`, `.servicenow`, .`servicenow-itom`, `.servicenow-sir`, `.slack`, `.swimlane`, `.teams`, `.tines`, `.torq`, `.xmatters`, `.gen-ai`, `.bedrock`, `.d3security`, and `.webhook`. An empty list `[]` will disable all action types. +A list of action types that are enabled. It defaults to `["*"]`, enabling all types. The names for built-in {kib} action types are prefixed with a `.` and include: `.email`, `.index`, `.jira`, `.opsgenie`, `.pagerduty`, `.resilient`, `.server-log`, `.servicenow`, .`servicenow-itom`, `.servicenow-sir`, `.slack`, `.swimlane`, `.teams`, `.tines`, `.torq`, `.xmatters`, `.gen-ai`, `.bedrock`, `.gemini`, `.d3security`, and `.webhook`. An empty list `[]` will disable all action types. + Disabled action types will not appear as an option when creating new connectors, but existing connectors and actions of that type will remain in {kib} and will not function. @@ -277,6 +277,7 @@ A configuration URL that varies by connector: + -- * For an <>, specifies the {bedrock} request URL. +* For an <>, specifies the {gemini} request URL. * For a <>, specifies the OpenAI request URL. * For a <>, specifies the {ibm-r} instance URL. * For a <>, specifies the Jira instance URL. @@ -341,6 +342,7 @@ The default model to use for requests, which varies by connector: + -- * For an <>, current support is for the Anthropic Claude models. Defaults to `anthropic.claude-3-sonnet-20240229-v1:0`. +* For a <>, current support is for the Gemini models. Defaults to `gemini-1.5-pro-preview-0409`. * For a <>, it is optional and applicable only when `xpack.actions.preconfigured..config.apiProvider` is `OpenAI`. -- @@ -483,6 +485,9 @@ For an <>, specifies the AWS access key `xpack.actions.preconfigured..secrets.apikey`:: An API key secret that varies by connector: + +`xpack.actions.preconfigured..secrets.credentialsJSON`:: +For an <>, specifies the GCP service account credentials JSON file for authentication. + -- * For a <>, specifies the OpenAI or Azure OpenAI API key for authentication. diff --git a/docs/user/alerting/alerting-setup.asciidoc b/docs/user/alerting/alerting-setup.asciidoc index 82e64557b55dd4..cf1f84c9cc0326 100644 --- a/docs/user/alerting/alerting-setup.asciidoc +++ b/docs/user/alerting/alerting-setup.asciidoc @@ -48,18 +48,60 @@ For more information on the scalability of {alert-features}, go to [[alerting-security]] === Security -If you want to use the {alert-features} in a {kib} app, you must have the appropriate feature privileges. -For example, to create rules in *Discover* or *{stack-manage-app} > {rules-ui}*, you must have `all` privileges for the *Management > {stack-rules-feature}* feature. -To add rule actions and test connectors, you must also have `read` privileges for the *{connectors-feature}* feature. -To change rule settings, you must have `all` privileges for the *Rules Settings* privilege or `all` privileges for the appropriate sub-feature such as flapping detection. -For more information on configuring roles that provide access to features, go to <>. +To use {alert-features} in a {kib} app, you must have the appropriate feature privileges: + +[options="header"] +|=== + +| Action | {kib} privileges +| Give full access to manage alerts, connectors, and rules in *{stack-manage-app}* or *Discover* +a| +* `All` for the *Management > {stack-rules-feature}* feature. +* `All` for the *Management > Rules Settings* feature. +* `All` for the *Management > {connectors-feature}* feature. +* `Read` index privileges for the `.alerts-*` system indices + +[NOTE] +==== +The *{connectors-feature}* feature privilege is required to manage connectors. +To add rule actions and test connectors, you require only `Read` privileges. + +By default, `All` privileges for the *Rules Settings* feature include authority to edit flapping detection settings unless you customize the sub-feature privileges. preview:[] To create a rule that uses the <>, you must also have `all` privileges for the *Cases* feature. -Each rule also has a rule visibility value (or `consumer` in the APIs), which affects the {kib} feature privileges that are required to access it. -To view or edit a rule that has a `Stack Rules` rule visibility, for example, you must have the appropriate *Management > {stack-rules-feature}* feature privileges. +The rule type also affects the privileges that are required. +For example, to create or edit {ml} rules, you must have `all` privileges for the *Analytics > {ml-app}* feature. +For {stack-monitor-app} rules, you must have the `monitoring_user` role. +For {observability} rules, you must have `all` privileges for the appropriate {observability} features. +For Security rules, refer to {security-guide}/detections-permissions-section.html[Detections prerequisites and requirements]. +==== + +| Give view-only access to alerts, connectors, and rules in *{stack-manage-app}* or *Discover* +a| +* `Read` for the *Management > {stack-rules-feature}* feature. +* `Read` for the *Management > Rules Settings* feature. +* `Read` for the *Management > {connectors-feature}* feature. +* `Read` index privileges for the `.alerts-*` system indices + +[NOTE] +==== +The rule type also affects the privileges that are required. +For example, to view {ml} rules, you must have `read` privileges for the *Analytics > {ml-app}* feature. +For {stack-monitor-app} rules, you must have the `monitoring_user` role. +For {observability} rules, you must have `read` privileges for the appropriate {observability} features. +For Security rules, refer to {security-guide}/detections-permissions-section.html[Detections prerequisites and requirements]. +==== + +| Revoke all access to alerts, connectors, and rules in *{stack-manage-app}* or *Discover* +a| +* `None` for the *Management > {stack-rules-feature}* feature. +* `None` for the *Management > Rules Settings* feature. +* `None` for the *Management > {connectors-feature}* feature. + +|=== -For details about the prerequisites required to run each API, refer to <>. +For more information on configuring roles that provide access to features, go to <>. [float] [[alerting-authorization]] diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index 5e108b963b18a9..5a17a583fb387a 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -170,19 +170,7 @@ image::images/rule-details-alerts-active.png[Rule details page with multiple ale // NOTE: This is an autogenerated screenshot. Do not edit it directly. In this example, the rule detects when a site serves more than a threshold number of bytes in a 24 hour period. Four sites are above the threshold. These are called alerts - occurrences of the condition being detected - and the alert name, status, time of detection, and duration of the condition are shown in this view. Alerts come and go from the list depending on whether the rule conditions are met. - -When an alert is created, it generates actions. If the conditions that caused the alert persist, the actions run again according to the rule notification settings. There are four common alert statuses: - -`active`:: The conditions for the rule are met and actions should be generated according to the notification settings. -`flapping`:: The alert is switching repeatedly between active and recovered states. -`recovered`:: The conditions for the rule are no longer met and recovery actions should be generated. -`untracked`:: Actions are no longer generated. For example, you can choose to move active alerts to this state when you disable or delete rules. - -NOTE: The `flapping` state is possible only if you have enabled alert flapping detection in *{stack-manage-app}* > *{rules-ui}* > *Settings*. For each space, you can choose a look back window and threshold that are used to determine whether alerts are flapping. For example, you can specify that the alert must change status at least 6 times in the last 10 runs. If the rule has actions that run when the alert status changes, those actions are suppressed while the alert is flapping. - -You can mute an alert to temporarily suppress future actions. -Open the action menu (…) for the appropriate alert in the table and select *Mute*. -To permanently suppress actions for an alert, open the actions menu and select *Mark as untracked*. +For more information about alerts, go to <>. If there are rule actions that failed to run successfully, you can see the details on the *History* tab. In the *Message* column, click the warning or expand icon image:images/expand-icon-2.png[double arrow icon to open a flyout with the document details] or click the number in the *Errored actions* column to open the *Errored Actions* panel. @@ -192,9 +180,6 @@ In this example, the action failed because the <>. - [float] [[importing-and-exporting-rules]] === Import and export rules diff --git a/docs/user/alerting/images/stack-management-alerts-page.png b/docs/user/alerting/images/stack-management-alerts-page.png new file mode 100644 index 00000000000000..4e985c3d6e6771 Binary files /dev/null and b/docs/user/alerting/images/stack-management-alerts-page.png differ diff --git a/docs/user/alerting/images/stack-management-alerts-query-menu.png b/docs/user/alerting/images/stack-management-alerts-query-menu.png new file mode 100644 index 00000000000000..b5d87e8be13137 Binary files /dev/null and b/docs/user/alerting/images/stack-management-alerts-query-menu.png differ diff --git a/docs/user/alerting/index.asciidoc b/docs/user/alerting/index.asciidoc index b2b2082ce71f79..b86a9296c57ed9 100644 --- a/docs/user/alerting/index.asciidoc +++ b/docs/user/alerting/index.asciidoc @@ -1,6 +1,7 @@ include::alerting-getting-started.asciidoc[] include::alerting-setup.asciidoc[] include::create-and-manage-rules.asciidoc[] +include::view-alerts.asciidoc[] include::rule-types.asciidoc[] include::action-variables.asciidoc[] include::alerting-troubleshooting.asciidoc[] diff --git a/docs/user/alerting/view-alerts.asciidoc b/docs/user/alerting/view-alerts.asciidoc new file mode 100644 index 00000000000000..745016f26a0af9 --- /dev/null +++ b/docs/user/alerting/view-alerts.asciidoc @@ -0,0 +1,83 @@ +[[view-alerts]] +== View alerts +:frontmatter-description: View and manage alerts in the {kib} {stack-manage-app} app. +:frontmatter-tags-products: [kibana, alerting] +:frontmatter-tags-content-type: [how-to] +:frontmatter-tags-user-goals: [manage] + +When the conditions of a rule are met, it creates an alert. +If the rule has actions, they run at the defined frequency. +For example, the rule can send email notifications for each alert at a custom interval. +For an introduction to the concepts of rules, alerts, and actions, refer to <>. + +You can manage the alerts for each rule in *{stack-manage-app}* > *{rules-ui}*. +Alternatively, manage all your alerts in *{stack-manage-app}* > *Alerts*. preview:[] + +[role="screenshot"] +image::images/stack-management-alerts-page.png[Alerts page with multiple alerts] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +[NOTE] +==== +You must have the appropriate {kib} {alert-features} and index privileges to view alerts. +Refer to <>. +==== + +[discrete] +[[filter-alerts]] +=== Filter alerts + +preview::[] + +In *{stack-manage-app}* > *Alerts*, you can filter the list (for example, by alert status or rule type) and customize the filter controls. +To search for specific alerts, use the KQL bar to create structured queries using {kibana-ref}/kuery-query.html[{kib} Query Language]. + +By default, the list contains all the alerts that you have authority to view in the selected time period except those associated with Security rules. +To view alerts for Security rules, click the query menu and select *Security rule types*: + +[role="screenshot"] +image::images/stack-management-alerts-query-menu.png[The Alerts page with the query menu open] +// NOTE: This is an autogenerated screenshot. Do not edit it directly. + +Alternatively, view those alerts in the {security-guide}/alerts-ui-manage.html[{security-app}]. + +[discrete] +[[view-alert-details]] +=== View alert details + +To get more information about a specific alert, open its action menu (…) and select *View alert details* in either *{stack-manage-app} > Alerts* or *{rules-ui}*. +There you'll see the current status of the alert, its duration, and when it was last updated. +To help you determine what caused the alert, there is information such as the expected and actual threshold values and a summarized reason for the alert. + +If an alert is affected by a maintenance window, the alert details include its identifier. +For more information about their impact on alert notifications, refer to <>. + +[discrete] +[[alert-status]] +==== Alert statuses + +There are three common alert statuses: + +`active`:: The conditions for the rule are met and actions should be generated according to the notification settings. +`recovered`:: The conditions for the rule are no longer met and recovery actions should be generated. +`untracked`:: Actions are no longer generated. For example, you can choose to move active alerts to this state when you disable or delete rules. + +[NOTE] +==== +An alert can also be in a "flapping" state when it is switching repeatedly between active and recovered states. +This state is possible only if you have enabled alert flapping detection in *{stack-manage-app} > {rules-ui} > Settings*. +For each space, you can choose a look back window and threshold that are used to determine whether alerts are flapping. +For example, you can specify that the alert must change status at least 6 times in the last 10 runs. +If the rule has actions that run when the alert status changes, those actions are suppressed while the alert is flapping. +==== + + +[discrete] +[[mute-alerts]] +=== Mute alerts + +If an alert is active or flapping, you can mute it to temporarily suppress future actions. +In both *{stack-manage-app} > Alerts* and *{rules-ui}*, you can open the action menu (…) for the appropriate alert and select *Mute*. +To permanently suppress actions for an alert, open the actions menu and select *Mark as untracked*. + +To affect the behavior of the rule rather than individual alerts, check out <>. diff --git a/examples/controls_example/kibana.jsonc b/examples/controls_example/kibana.jsonc index 2a6907e130d2e3..2a1dd89aaec3a3 100644 --- a/examples/controls_example/kibana.jsonc +++ b/examples/controls_example/kibana.jsonc @@ -12,7 +12,9 @@ "developerExamples", "embeddable", "navigation", - "presentationUtil" + "presentationUtil", + "uiActions", + "dataViews" ] } } diff --git a/examples/controls_example/public/app.tsx b/examples/controls_example/public/app.tsx deleted file mode 100644 index 55ce24ca5fd349..00000000000000 --- a/examples/controls_example/public/app.tsx +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ - -import React from 'react'; -import ReactDOM from 'react-dom'; -import { EuiSpacer } from '@elastic/eui'; - -import { AppMountParameters } from '@kbn/core/public'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -import { ControlsExampleStartDeps } from './plugin'; -import { BasicReduxExample } from './basic_redux_example'; -import { EditExample } from './edit_example'; -import { SearchExample } from './search_example'; -import { AddButtonExample } from './add_button_example'; - -export const renderApp = async ( - { data, navigation }: ControlsExampleStartDeps, - { element }: AppMountParameters -) => { - const dataViews = await data.dataViews.find('kibana_sample_data_logs'); - const examples = - dataViews.length > 0 ? ( - <> - - - - - - - - - ) : ( -
{'Install web logs sample data to run controls examples.'}
- ); - - ReactDOM.render( - - - {examples} - , - element - ); - return () => ReactDOM.unmountComponentAtNode(element); -}; diff --git a/examples/controls_example/public/app/app.tsx b/examples/controls_example/public/app/app.tsx new file mode 100644 index 00000000000000..aad5dc38df167b --- /dev/null +++ b/examples/controls_example/public/app/app.tsx @@ -0,0 +1,90 @@ +/* + * Copyright 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 { + EuiPage, + EuiPageBody, + EuiPageHeader, + EuiPageSection, + EuiPageTemplate, + EuiSpacer, + EuiTab, + EuiTabs, +} from '@elastic/eui'; +import React, { useState } from 'react'; +import ReactDOM from 'react-dom'; + +import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { ControlsExampleStartDeps } from '../plugin'; +import { ControlGroupRendererExamples } from './control_group_renderer_examples'; +import { ReactControlExample } from './react_control_example'; + +const CONTROLS_AS_A_BUILDING_BLOCK = 'controls_as_a_building_block'; +const CONTROLS_REFACTOR_TEST = 'controls_refactor_test'; + +const App = ({ + core, + data, + navigation, +}: { core: CoreStart } & Pick) => { + const [selectedTabId, setSelectedTabId] = useState(CONTROLS_REFACTOR_TEST); // TODO: Make this the first tab + + function onSelectedTabChanged(tabId: string) { + setSelectedTabId(tabId); + } + + function renderTabContent() { + if (selectedTabId === CONTROLS_REFACTOR_TEST) { + return ; + } + + return ; + } + + return ( + + + + + + + + + onSelectedTabChanged(CONTROLS_REFACTOR_TEST)} + isSelected={CONTROLS_REFACTOR_TEST === selectedTabId} + > + Register a new React control + + onSelectedTabChanged(CONTROLS_AS_A_BUILDING_BLOCK)} + isSelected={CONTROLS_AS_A_BUILDING_BLOCK === selectedTabId} + > + Controls as a building block + + + + + + {renderTabContent()} + + + + + ); +}; + +export const renderApp = ( + core: CoreStart, + { data, navigation }: Pick, + { element }: AppMountParameters +) => { + ReactDOM.render(, element); + + return () => ReactDOM.unmountComponentAtNode(element); +}; diff --git a/examples/controls_example/public/app/control_group_renderer_examples.tsx b/examples/controls_example/public/app/control_group_renderer_examples.tsx new file mode 100644 index 00000000000000..f35b713cc3f28d --- /dev/null +++ b/examples/controls_example/public/app/control_group_renderer_examples.tsx @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import useAsync from 'react-use/lib/useAsync'; + +import { EuiLoadingSpinner, EuiSpacer, EuiText } from '@elastic/eui'; +import { SearchExample } from './control_group_renderer_examples/search_example'; +import { EditExample } from './control_group_renderer_examples/edit_example'; +import { BasicReduxExample } from './control_group_renderer_examples/basic_redux_example'; +import { AddButtonExample } from './control_group_renderer_examples/add_button_example'; +import { ControlsExampleStartDeps } from '../plugin'; + +export const ControlGroupRendererExamples = ({ + data, + navigation, +}: Pick) => { + const { + loading, + value: dataViews, + error, + } = useAsync(async () => { + return await data.dataViews.find('kibana_sample_data_logs'); + }, []); + + if (loading) return ; + + return dataViews && dataViews.length > 0 && !error ? ( + <> + + + + + + + + + ) : ( + {'Install web logs sample data to run controls examples.'} + ); +}; diff --git a/examples/controls_example/public/add_button_example.tsx b/examples/controls_example/public/app/control_group_renderer_examples/add_button_example.tsx similarity index 100% rename from examples/controls_example/public/add_button_example.tsx rename to examples/controls_example/public/app/control_group_renderer_examples/add_button_example.tsx diff --git a/examples/controls_example/public/basic_redux_example.tsx b/examples/controls_example/public/app/control_group_renderer_examples/basic_redux_example.tsx similarity index 100% rename from examples/controls_example/public/basic_redux_example.tsx rename to examples/controls_example/public/app/control_group_renderer_examples/basic_redux_example.tsx diff --git a/examples/controls_example/public/edit_example.tsx b/examples/controls_example/public/app/control_group_renderer_examples/edit_example.tsx similarity index 100% rename from examples/controls_example/public/edit_example.tsx rename to examples/controls_example/public/app/control_group_renderer_examples/edit_example.tsx diff --git a/examples/controls_example/public/search_example.tsx b/examples/controls_example/public/app/control_group_renderer_examples/search_example.tsx similarity index 99% rename from examples/controls_example/public/search_example.tsx rename to examples/controls_example/public/app/control_group_renderer_examples/search_example.tsx index 85c37a1e216284..d303e9e2ec973e 100644 --- a/examples/controls_example/public/search_example.tsx +++ b/examples/controls_example/public/app/control_group_renderer_examples/search_example.tsx @@ -23,7 +23,7 @@ import { EuiTitle, } from '@elastic/eui'; import { AwaitingControlGroupAPI, ControlGroupRenderer } from '@kbn/controls-plugin/public'; -import { PLUGIN_ID } from './constants'; +import { PLUGIN_ID } from '../../constants'; interface Props { data: DataPublicPluginStart; diff --git a/examples/controls_example/public/app/react_control_example.tsx b/examples/controls_example/public/app/react_control_example.tsx new file mode 100644 index 00000000000000..859f747be1db22 --- /dev/null +++ b/examples/controls_example/public/app/react_control_example.tsx @@ -0,0 +1,234 @@ +/* + * Copyright 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 { + EuiButton, + EuiButtonGroup, + EuiCodeBlock, + EuiEmptyPrompt, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiSpacer, +} from '@elastic/eui'; +import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; +import { CoreStart } from '@kbn/core/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; +import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; +import { PresentationContainer } from '@kbn/presentation-containers'; +import { + HasUniqueId, + PublishesUnifiedSearch, + PublishesViewMode, + useStateFromPublishingSubject, + ViewMode as ViewModeType, +} from '@kbn/presentation-publishing'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import React, { useEffect, useState } from 'react'; +import useAsync from 'react-use/lib/useAsync'; +import useMount from 'react-use/lib/useMount'; +import { BehaviorSubject } from 'rxjs'; +import { ControlGroupApi } from '../react_controls/control_group/types'; + +const toggleViewButtons = [ + { + id: `viewModeToggle_edit`, + value: ViewMode.EDIT, + label: 'Edit mode', + }, + { + id: `viewModeToggle_view`, + value: ViewMode.VIEW, + label: 'View mode', + }, +]; + +/** + * I am mocking the dashboard API so that the data table embeddble responds to changes to the + * data view publishing subject from the control group + */ +type MockedDashboardApi = PresentationContainer & + PublishesViewMode & + PublishesUnifiedSearch & { + publishFilters: (newFilters: Filter[] | undefined) => void; + setViewMode: (newViewMode: ViewMode) => void; + setChild: (child: HasUniqueId) => void; + }; + +export const ReactControlExample = ({ + core, + dataViews: dataViewsService, +}: { + core: CoreStart; + dataViews: DataViewsPublicPluginStart; +}) => { + const [dashboardApi, setDashboardApi] = useState(undefined); + const [controlGroupApi, setControlGroupApi] = useState(undefined); + const viewModeSelected = useStateFromPublishingSubject(dashboardApi?.viewMode); + + useMount(() => { + const viewMode = new BehaviorSubject(ViewMode.EDIT as ViewModeType); + const filters$ = new BehaviorSubject([]); + const query$ = new BehaviorSubject(undefined); + const timeRange$ = new BehaviorSubject(undefined); + const children$ = new BehaviorSubject<{ [key: string]: unknown }>({}); + + setDashboardApi({ + viewMode, + filters$, + query$, + timeRange$, + children$, + publishFilters: (newFilters) => filters$.next(newFilters), + setViewMode: (newViewMode) => viewMode.next(newViewMode), + setChild: (child) => children$.next({ ...children$.getValue(), [child.uuid]: child }), + removePanel: () => {}, + replacePanel: () => { + return Promise.resolve(''); + }, + getPanelCount: () => { + return 2; + }, + addNewPanel: () => { + return Promise.resolve(undefined); + }, + }); + }); + + // TODO: Maybe remove `useAsync` - see https://github.com/elastic/kibana/pull/182842#discussion_r1624909709 + const { + loading, + value: dataViews, + error, + } = useAsync(async () => { + return await dataViewsService.find('kibana_sample_data_logs'); + }, []); + + useEffect(() => { + if (!controlGroupApi) return; + + const subscription = controlGroupApi.filters$.subscribe((controlGroupFilters) => { + if (dashboardApi) dashboardApi.publishFilters(controlGroupFilters); + }); + + return () => { + subscription.unsubscribe(); + }; + }, [dashboardApi, controlGroupApi]); + + if (error || (!dataViews?.[0]?.id && !loading)) + return ( + There was an error!} + body={

{error ? error.message : 'Please add at least one data view.'}

} + /> + ); + + return loading ? ( + + ) : ( + <> + + + { + controlGroupApi?.onEdit(); + }} + size="s" + > + Control group settings + + + + { + core.overlays.openModal( + toMountPoint( + + {JSON.stringify(controlGroupApi?.serializeState(), null, 2)} + , + { + theme: core.theme, + i18n: core.i18n, + } + ) + ); + }} + size="s" + > + Serialize control group + + + + { + dashboardApi?.setViewMode(value); + }} + /> + + + + { + dashboardApi?.setChild(api); + setControlGroupApi(api as ControlGroupApi); + }} + hidePanelChrome={true} + type={CONTROL_GROUP_TYPE} + getParentApi={() => ({ + ...dashboardApi, + getSerializedStateForChild: () => ({ + rawState: { + controlStyle: 'oneLine', + chainingSystem: 'HIERARCHICAL', + showApplySelections: false, + panelsJSON: + '{"a957862f-beae-4f0c-8a3a-a6ea4c235651":{"type":"searchControl","order":0,"grow":true,"width":"medium","explicitInput":{"id":"a957862f-beae-4f0c-8a3a-a6ea4c235651","fieldName":"message","title":"Message","grow":true,"width":"medium","searchString": "this","enhancements":{}}}}', + ignoreParentSettingsJSON: + '{"ignoreFilters":false,"ignoreQuery":false,"ignoreTimerange":false,"ignoreValidations":false}', + } as object, + references: [ + { + name: 'controlGroup_a957862f-beae-4f0c-8a3a-a6ea4c235651:searchControlDataView', + type: 'index-pattern', + id: dataViews?.[0].id!, + }, + ], + }), + })} + key={`control_group`} + /> + +
+ ({ + ...dashboardApi, + getSerializedStateForChild: () => ({ + rawState: { + timeRange: { from: 'now-60d/d', to: 'now+60d/d' }, + }, + references: [], + }), + })} + hidePanelChrome={false} + onApiAvailable={(api) => { + dashboardApi?.setChild(api); + }} + /> +
+ + ); +}; diff --git a/examples/controls_example/public/plugin.tsx b/examples/controls_example/public/plugin.tsx index 235613afda7449..57fd451cc81a97 100644 --- a/examples/controls_example/public/plugin.tsx +++ b/examples/controls_example/public/plugin.tsx @@ -6,46 +6,85 @@ * Side Public License, v 1. */ +import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; import { AppMountParameters, CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DeveloperExamplesSetup } from '@kbn/developer-examples-plugin/public'; +import { EmbeddableSetup, PANEL_HOVER_TRIGGER } from '@kbn/embeddable-plugin/public'; import type { NavigationPublicPluginStart } from '@kbn/navigation-plugin/public'; -import img from './control_group_image.png'; +import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { PLUGIN_ID } from './constants'; +import img from './control_group_image.png'; +import { EditControlAction } from './react_controls/actions/edit_control_action'; +import { registerControlFactory } from './react_controls/control_factory_registry'; +import { SEARCH_CONTROL_TYPE } from './react_controls/data_controls/search_control/types'; interface SetupDeps { developerExamples: DeveloperExamplesSetup; + embeddable: EmbeddableSetup; } export interface ControlsExampleStartDeps { data: DataPublicPluginStart; navigation: NavigationPublicPluginStart; + uiActions: UiActionsStart; } export class ControlsExamplePlugin implements Plugin { - public setup(core: CoreSetup, { developerExamples }: SetupDeps) { + public setup( + core: CoreSetup, + { developerExamples, embeddable }: SetupDeps + ) { + embeddable.registerReactEmbeddableFactory(CONTROL_GROUP_TYPE, async () => { + const [{ getControlGroupEmbeddableFactory }, [coreStart, depsStart]] = await Promise.all([ + import('./react_controls/control_group/get_control_group_factory'), + core.getStartServices(), + ]); + return getControlGroupEmbeddableFactory({ + core: coreStart, + dataViews: depsStart.data.dataViews, + }); + }); + + registerControlFactory(SEARCH_CONTROL_TYPE, async () => { + const [{ getSearchControlFactory: getSearchEmbeddableFactory }, [coreStart, depsStart]] = + await Promise.all([ + import('./react_controls/data_controls/search_control/get_search_control_factory'), + core.getStartServices(), + ]); + + return getSearchEmbeddableFactory({ + core: coreStart, + dataViewsService: depsStart.data.dataViews, + }); + }); + core.application.register({ id: PLUGIN_ID, title: 'Controls examples', visibleIn: [], async mount(params: AppMountParameters) { - const [, depsStart] = await core.getStartServices(); - const { renderApp } = await import('./app'); - return renderApp(depsStart, params); + const [coreStart, depsStart] = await core.getStartServices(); + const { renderApp } = await import('./app/app'); + return renderApp(coreStart, depsStart, params); }, }); developerExamples.register({ appId: 'controlsExamples', - title: 'Controls as a Building Block', - description: `Showcases different ways to embed a control group into your app`, + title: 'Controls', + description: `Learn how to create new control types and use controls in your application`, image: img, }); } - public start(core: CoreStart) {} + public start(core: CoreStart, deps: ControlsExampleStartDeps) { + const editControlAction = new EditControlAction(); + deps.uiActions.registerAction(editControlAction); + deps.uiActions.attachAction(PANEL_HOVER_TRIGGER, editControlAction.id); + } public stop() {} } diff --git a/examples/controls_example/public/react_controls/actions/edit_control_action.tsx b/examples/controls_example/public/react_controls/actions/edit_control_action.tsx new file mode 100644 index 00000000000000..c8165c2a3642ba --- /dev/null +++ b/examples/controls_example/public/react_controls/actions/edit_control_action.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; + +import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; +import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { apiIsPresentationContainer } from '@kbn/presentation-containers'; +import { + apiCanAccessViewMode, + apiHasParentApi, + apiHasType, + apiHasUniqueId, + apiIsOfType, + EmbeddableApiContext, + getInheritedViewMode, + hasEditCapabilities, +} from '@kbn/presentation-publishing'; +import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; + +import { DataControlApi } from '../data_controls/types'; + +const isApiCompatible = (api: unknown | null): api is DataControlApi => + Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + hasEditCapabilities(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); + +const ACTION_EDIT_CONTROL = 'editDataControl'; + +export class EditControlAction implements Action { + public readonly type = ACTION_EDIT_CONTROL; + public readonly id = ACTION_EDIT_CONTROL; + public order = 2; + + constructor() {} + + public readonly MenuItem = ({ context }: { context: EmbeddableApiContext }) => { + if (!isApiCompatible(context.embeddable)) throw new IncompatibleActionError(); + return ( + + this.execute(context)} + color="text" + /> + + ); + }; + + public getDisplayName({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); + return i18n.translate('controls.controlGroup.floatingActions.editTitle', { + defaultMessage: 'Edit', + }); + } + + public getIconType({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); + return 'pencil'; + } + + public async isCompatible({ embeddable }: EmbeddableApiContext) { + return ( + isApiCompatible(embeddable) && + getInheritedViewMode(embeddable.parentApi) === ViewMode.EDIT && + embeddable.isEditingEnabled() + ); + } + + public async execute({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); + await embeddable.onEdit(); + } +} diff --git a/examples/controls_example/public/react_controls/control_error_component.tsx b/examples/controls_example/public/react_controls/control_error_component.tsx new file mode 100644 index 00000000000000..eea1709db6480c --- /dev/null +++ b/examples/controls_example/public/react_controls/control_error_component.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useState } from 'react'; + +import { EuiButtonEmpty, EuiPopover } from '@elastic/eui'; +import { FormattedMessage, I18nProvider } from '@kbn/i18n-react'; +import { Markdown } from '@kbn/shared-ux-markdown'; + +/** TODO: This file is duplicated from the controls plugin to avoid exporting it */ + +interface ControlErrorProps { + error: Error | string; +} + +export const ControlError = ({ error }: ControlErrorProps) => { + const [isPopoverOpen, setPopoverOpen] = useState(false); + const errorMessage = error instanceof Error ? error.message : error; + + const popoverButton = ( + setPopoverOpen((open) => !open)} + className={'errorEmbeddableCompact__button'} + textProps={{ className: 'errorEmbeddableCompact__text' }} + > + + + ); + + return ( + + setPopoverOpen(false)} + > + + {errorMessage} + + + + ); +}; diff --git a/examples/controls_example/public/react_controls/control_factory_registry.ts b/examples/controls_example/public/react_controls/control_factory_registry.ts new file mode 100644 index 00000000000000..b4dcde2d2253d9 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_factory_registry.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 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 { ControlFactory, DefaultControlApi } from './types'; + +const registry: { [key: string]: ControlFactory } = {}; + +export const registerControlFactory = async < + State extends object = object, + ApiType extends DefaultControlApi = DefaultControlApi +>( + type: string, + getFactory: () => Promise> +) => { + if (registry[type] !== undefined) + throw new Error( + i18n.translate('controlFactoryRegistry.factoryAlreadyExistsError', { + defaultMessage: 'A control factory for type: {key} is already registered.', + values: { key: type }, + }) + ); + registry[type] = (await getFactory()) as ControlFactory; +}; + +export const getControlFactory = < + State extends object = object, + ApiType extends DefaultControlApi = DefaultControlApi +>( + key: string +): ControlFactory => { + if (registry[key] === undefined) + throw new Error( + i18n.translate('controlFactoryRegistry.factoryNotFoundError', { + defaultMessage: 'No control factory found for type: {key}', + values: { key }, + }) + ); + return registry[key] as ControlFactory; +}; + +export const getAllControlTypes = () => { + return Object.keys(registry); +}; diff --git a/examples/controls_example/public/react_controls/control_group/control_group_editor.tsx b/examples/controls_example/public/react_controls/control_group/control_group_editor.tsx new file mode 100644 index 00000000000000..de62427a1cd1a1 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/control_group_editor.tsx @@ -0,0 +1,245 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useCallback, useMemo } from 'react'; + +import { + EuiButton, + EuiButtonEmpty, + EuiButtonGroup, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiForm, + EuiFormRow, + EuiHorizontalRule, + EuiIconTip, + EuiSpacer, + EuiSwitch, + EuiTitle, +} from '@elastic/eui'; +import { css } from '@emotion/react'; +import { ControlStyle, ParentIgnoreSettings } from '@kbn/controls-plugin/public'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; + +import { ControlStateManager } from '../types'; +import { + ControlGroupEditorStrings, + CONTROL_LAYOUT_OPTIONS, +} from './control_group_editor_constants'; +import { ControlGroupApi, ControlGroupEditorState } from './types'; + +interface EditControlGroupProps { + onCancel: () => void; + onSave: () => void; + onDeleteAll: () => void; + stateManager: ControlStateManager; + api: ControlGroupApi; // controls must always have a parent API +} + +export const ControlGroupEditor = ({ + onCancel, + onSave, + onDeleteAll, + stateManager, + api, +}: EditControlGroupProps) => { + const [ + children, + selectedLabelPosition, + selectedChainingSystem, + selectedShowApplySelections, + selectedIgnoreParentSettings, + ] = useBatchedPublishingSubjects( + api.children$, + stateManager.labelPosition, + stateManager.chainingSystem, + stateManager.showApplySelections, + stateManager.ignoreParentSettings + ); + + const controlCount = useMemo(() => Object.keys(children).length, [children]); + + const updateIgnoreSetting = useCallback( + (newSettings: Partial) => { + stateManager.ignoreParentSettings.next({ + ...(selectedIgnoreParentSettings ?? {}), + ...newSettings, + }); + }, + [stateManager.ignoreParentSettings, selectedIgnoreParentSettings] + ); + + return ( + <> + + +

{ControlGroupEditorStrings.management.getFlyoutTitle()}

+
+
+ + + + { + stateManager.labelPosition.next(newPosition as ControlStyle); + }} + /> + + + +
+ + updateIgnoreSetting({ + ignoreFilters: !e.target.checked, + ignoreQuery: !e.target.checked, + }) + } + checked={ + !Boolean(selectedIgnoreParentSettings?.ignoreFilters) || + !Boolean(selectedIgnoreParentSettings?.ignoreQuery) + } + /> + + updateIgnoreSetting({ ignoreTimerange: !e.target.checked })} + checked={!Boolean(selectedIgnoreParentSettings?.ignoreTimerange)} + /> +
+
+ + +
+ + } + checked={!Boolean(selectedIgnoreParentSettings?.ignoreValidations)} + onChange={(e) => updateIgnoreSetting({ ignoreValidations: !e.target.checked })} + /> + + + } + checked={selectedChainingSystem === 'HIERARCHICAL'} + onChange={(e) => + stateManager.chainingSystem.next(e.target.checked ? 'HIERARCHICAL' : 'NONE') + } + /> + + + } + checked={!selectedShowApplySelections} + onChange={(e) => stateManager.showApplySelections.next(!e.target.checked)} + /> +
+
+ + {controlCount > 0 && ( + <> + + + + {ControlGroupEditorStrings.management.getDeleteAllButtonTitle()} + + + + )} +
+
+ + + + { + onCancel(); + }} + > + {ControlGroupEditorStrings.getCancelTitle()} + + + + { + onSave(); + }} + > + {ControlGroupEditorStrings.getSaveChangesTitle()} + + + + + + ); +}; + +const ControlSettingTooltipLabel = ({ label, tooltip }: { label: string; tooltip: string }) => ( + + {label} + + + + +); diff --git a/examples/controls_example/public/react_controls/control_group/control_group_editor_constants.tsx b/examples/controls_example/public/react_controls/control_group/control_group_editor_constants.tsx new file mode 100644 index 00000000000000..f08e93886ddc33 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/control_group_editor_constants.tsx @@ -0,0 +1,113 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { i18n } from '@kbn/i18n'; + +export const ControlGroupEditorStrings = { + getSaveChangesTitle: () => + i18n.translate('controls.controlGroup.manageControl.saveChangesTitle', { + defaultMessage: 'Save and close', + }), + getCancelTitle: () => + i18n.translate('controls.controlGroup.manageControl.cancelTitle', { + defaultMessage: 'Cancel', + }), + management: { + getFlyoutTitle: () => + i18n.translate('controls.controlGroup.management.flyoutTitle', { + defaultMessage: 'Control settings', + }), + getDeleteAllButtonTitle: () => + i18n.translate('controls.controlGroup.management.deleteAll', { + defaultMessage: 'Delete all', + }), + labelPosition: { + getLabelPositionTitle: () => + i18n.translate('controls.controlGroup.management.labelPosition.title', { + defaultMessage: 'Label position', + }), + getLabelPositionLegend: () => + i18n.translate('controls.controlGroup.management.labelPosition.designSwitchLegend', { + defaultMessage: 'Switch label position between inline and above', + }), + getInlineTitle: () => + i18n.translate('controls.controlGroup.management.labelPosition.inline', { + defaultMessage: 'Inline', + }), + getAboveTitle: () => + i18n.translate('controls.controlGroup.management.labelPosition.above', { + defaultMessage: 'Above', + }), + }, + selectionSettings: { + getSelectionSettingsTitle: () => + i18n.translate('controls.controlGroup.management.selectionSettings', { + defaultMessage: 'Selections', + }), + validateSelections: { + getValidateSelectionsTitle: () => + i18n.translate('controls.controlGroup.management.validate.title', { + defaultMessage: 'Validate user selections', + }), + getValidateSelectionsTooltip: () => + i18n.translate('controls.controlGroup.management.validate.tooltip', { + defaultMessage: 'Highlight control selections that result in no data.', + }), + }, + controlChaining: { + getHierarchyTitle: () => + i18n.translate('controls.controlGroup.management.hierarchy.title', { + defaultMessage: 'Chain controls', + }), + getHierarchyTooltip: () => + i18n.translate('controls.controlGroup.management.hierarchy.tooltip', { + defaultMessage: + 'Selections in one control narrow down available options in the next. Controls are chained from left to right.', + }), + }, + showApplySelections: { + getShowApplySelectionsTitle: () => + i18n.translate('controls.controlGroup.management.showApplySelections.title', { + defaultMessage: 'Apply selections automatically', + }), + getShowApplySelectionsTooltip: () => + i18n.translate('controls.controlGroup.management.showApplySelections.tooltip', { + defaultMessage: + 'If disabled, control selections will only be applied after clicking apply.', + }), + }, + }, + filteringSettings: { + getFilteringSettingsTitle: () => + i18n.translate('controls.controlGroup.management.filteringSettings', { + defaultMessage: 'Filtering', + }), + getUseGlobalFiltersTitle: () => + i18n.translate('controls.controlGroup.management.filtering.useGlobalFilters', { + defaultMessage: 'Apply global filters to controls', + }), + getUseGlobalTimeRangeTitle: () => + i18n.translate('controls.controlGroup.management.filtering.useGlobalTimeRange', { + defaultMessage: 'Apply global time range to controls', + }), + }, + }, +}; + +export const CONTROL_LAYOUT_OPTIONS = [ + { + id: `oneLine`, + 'data-test-subj': 'control-editor-layout-oneLine', + label: ControlGroupEditorStrings.management.labelPosition.getInlineTitle(), + }, + { + id: `twoLine`, + 'data-test-subj': 'control-editor-layout-twoLine', + label: ControlGroupEditorStrings.management.labelPosition.getAboveTitle(), + }, +]; diff --git a/examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx b/examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx new file mode 100644 index 00000000000000..703d31f18db1d6 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/get_control_group_factory.tsx @@ -0,0 +1,241 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useEffect } from 'react'; +import { BehaviorSubject } from 'rxjs'; + +import { + ControlGroupChainingSystem, + ControlWidth, + CONTROL_GROUP_TYPE, + DEFAULT_CONTROL_GROW, + DEFAULT_CONTROL_STYLE, + DEFAULT_CONTROL_WIDTH, +} from '@kbn/controls-plugin/common'; +import { ControlStyle, ParentIgnoreSettings } from '@kbn/controls-plugin/public'; +import { CoreStart } from '@kbn/core/public'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; +import { Filter } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; +import { combineCompatibleChildrenApis } from '@kbn/presentation-containers'; +import { + apiPublishesDataViews, + apiPublishesFilters, + PublishesDataViews, + PublishesFilters, + PublishingSubject, + useStateFromPublishingSubject, +} from '@kbn/presentation-publishing'; + +import { EuiFlexGroup } from '@elastic/eui'; +import { ControlRenderer } from '../control_renderer'; +import { DefaultControlApi } from '../types'; +import { openEditControlGroupFlyout } from './open_edit_control_group_flyout'; +import { deserializeControlGroup, serializeControlGroup } from './serialization_utils'; +import { + ControlGroupApi, + ControlGroupRuntimeState, + ControlGroupSerializedState, + ControlGroupUnsavedChanges, +} from './types'; + +export const getControlGroupEmbeddableFactory = (services: { + core: CoreStart; + dataViews: DataViewsPublicPluginStart; +}) => { + const controlGroupEmbeddableFactory: ReactEmbeddableFactory< + ControlGroupSerializedState, + ControlGroupApi, + ControlGroupRuntimeState + > = { + type: CONTROL_GROUP_TYPE, + deserializeState: (state) => deserializeControlGroup(state), + buildEmbeddable: async (initialState, buildApi, uuid, parentApi, setApi) => { + const { + initialChildControlState: childControlState, + defaultControlGrow, + defaultControlWidth, + labelPosition, + chainingSystem, + showApplySelections: initialShowApply, + ignoreParentSettings: initialParentSettings, + } = initialState; + + const children$ = new BehaviorSubject<{ [key: string]: DefaultControlApi }>({}); + const filters$ = new BehaviorSubject([]); + const dataViews = new BehaviorSubject(undefined); + const chainingSystem$ = new BehaviorSubject(chainingSystem); + const showApplySelections = new BehaviorSubject(initialShowApply); + const ignoreParentSettings = new BehaviorSubject( + initialParentSettings + ); + const grow = new BehaviorSubject( + defaultControlGrow === undefined ? DEFAULT_CONTROL_GROW : defaultControlGrow + ); + const width = new BehaviorSubject( + defaultControlWidth ?? DEFAULT_CONTROL_WIDTH + ); + const labelPosition$ = new BehaviorSubject( // TODO: Rename `ControlStyle` + labelPosition ?? DEFAULT_CONTROL_STYLE // TODO: Rename `DEFAULT_CONTROL_STYLE` + ); + + /** TODO: Handle loading; loading should be true if any child is loading */ + const dataLoading$ = new BehaviorSubject(true); + + /** TODO: Handle unsaved changes + * - Each child has an unsaved changed behaviour subject it pushes to + * - The control group listens to all of them (anyChildHasUnsavedChanges) and publishes its + * own unsaved changes if either one of its children has unsaved changes **or** one of + * the control group settings changed. + * - Children should **not** publish unsaved changes based on their output filters or selections. + * Instead, the control group will handle unsaved changes for filters. + */ + const unsavedChanges = new BehaviorSubject | undefined>( + undefined + ); + + const controlOrder = new BehaviorSubject>( + Object.keys(childControlState) + .map((key) => ({ + id: key, + order: childControlState[key].order, + type: childControlState[key].type, + })) + .sort((a, b) => (a.order > b.order ? 1 : -1)) + ); + const api = setApi({ + unsavedChanges, + resetUnsavedChanges: () => { + // TODO: Implement this + }, + snapshotRuntimeState: () => { + // TODO: Remove this if it ends up being unnecessary + return {} as unknown as ControlGroupSerializedState; + }, + dataLoading: dataLoading$, + children$: children$ as PublishingSubject<{ + [key: string]: unknown; + }>, + onEdit: async () => { + openEditControlGroupFlyout( + api, + { + chainingSystem: chainingSystem$, + labelPosition: labelPosition$, + showApplySelections, + ignoreParentSettings, + }, + { core: services.core } + ); + }, + isEditingEnabled: () => true, + getTypeDisplayName: () => + i18n.translate('controls.controlGroup.displayName', { + defaultMessage: 'Controls', + }), + getSerializedStateForChild: (childId) => { + return { rawState: childControlState[childId] }; + }, + serializeState: () => { + return serializeControlGroup( + children$.getValue(), + controlOrder.getValue().map(({ id }) => id), + { + labelPosition: labelPosition$.getValue(), + chainingSystem: chainingSystem$.getValue(), + showApplySelections: showApplySelections.getValue(), + ignoreParentSettings: ignoreParentSettings.getValue(), + } + ); + }, + getPanelCount: () => { + return (Object.keys(children$.getValue()) ?? []).length; + }, + addNewPanel: (panel) => { + // TODO: Add a new child control + return Promise.resolve(undefined); + }, + removePanel: (panelId) => { + // TODO: Remove a child control + }, + replacePanel: async (panelId, newPanel) => { + // TODO: Replace a child control + return Promise.resolve(panelId); + }, + grow, + width, + filters$, + dataViews, + labelPosition: labelPosition$, + }); + + /** + * Subscribe to all children's output filters, combine them, and output them + * TODO: If `showApplySelections` is true, publish to "unpublishedFilters" instead + * and only output to filters$ when the apply button is clicked. + * OR + * Always publish to "unpublishedFilters" and publish them manually on click + * (when `showApplySelections` is true) or after a small debounce (when false) + * See: https://github.com/elastic/kibana/pull/182842#discussion_r1624929511 + * - Note: Unsaved changes of control group **should** take into consideration the + * output filters, but not the "unpublishedFilters" + */ + const outputFiltersSubscription = combineCompatibleChildrenApis( + api, + 'filters$', + apiPublishesFilters, + [] + ).subscribe((newFilters) => filters$.next(newFilters)); + + /** Subscribe to all children's output data views, combine them, and output them */ + const childDataViewsSubscription = combineCompatibleChildrenApis< + PublishesDataViews, + DataView[] + >(api, 'dataViews', apiPublishesDataViews, []).subscribe((newDataViews) => + dataViews.next(newDataViews) + ); + + return { + api, + Component: (props, test) => { + const controlsInOrder = useStateFromPublishingSubject(controlOrder); + + useEffect(() => { + return () => { + outputFiltersSubscription.unsubscribe(); + childDataViewsSubscription.unsubscribe(); + }; + }, []); + + return ( + + {controlsInOrder.map(({ id, type }) => ( + api} + onApiAvailable={(controlApi) => { + children$.next({ + ...children$.getValue(), + [controlApi.uuid]: controlApi, + }); + }} + /> + ))} + + ); + }, + }; + }, + }; + + return controlGroupEmbeddableFactory; +}; diff --git a/examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx b/examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx new file mode 100644 index 00000000000000..7ca8b993083c35 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/open_edit_control_group_flyout.tsx @@ -0,0 +1,114 @@ +/* + * Copyright 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 { OverlayRef } from '@kbn/core-mount-utils-browser'; +import { CoreStart } from '@kbn/core/public'; +import { i18n } from '@kbn/i18n'; +import { tracksOverlays } from '@kbn/presentation-containers'; +import { apiHasParentApi } from '@kbn/presentation-publishing'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import React from 'react'; +import { BehaviorSubject } from 'rxjs'; + +import { ControlStateManager } from '../types'; +import { ControlGroupEditor } from './control_group_editor'; +import { ControlGroupApi, ControlGroupEditorState } from './types'; + +export const openEditControlGroupFlyout = ( + controlGroupApi: ControlGroupApi, + stateManager: ControlStateManager, + services: { + core: CoreStart; + } +) => { + /** + * Duplicate all state into a new manager because we do not want to actually apply the changes + * to the control group until the user hits save. + */ + const editorStateManager: ControlStateManager = Object.keys( + stateManager + ).reduce((prev, key) => { + return { + ...prev, + [key as keyof ControlGroupEditorState]: new BehaviorSubject( + stateManager[key as keyof ControlGroupEditorState].getValue() + ), + }; + }, {} as ControlStateManager); + + const closeOverlay = (overlayRef: OverlayRef) => { + if (apiHasParentApi(controlGroupApi) && tracksOverlays(controlGroupApi.parentApi)) { + controlGroupApi.parentApi.clearOverlays(); + } + overlayRef.close(); + }; + + const onDeleteAll = (ref: OverlayRef) => { + services.core.overlays + .openConfirm( + i18n.translate('controls.controlGroup.management.delete.sub', { + defaultMessage: 'Controls are not recoverable once removed.', + }), + { + confirmButtonText: i18n.translate('controls.controlGroup.management.delete.confirm', { + defaultMessage: 'Delete', + }), + cancelButtonText: i18n.translate('controls.controlGroup.management.delete.cancel', { + defaultMessage: 'Cancel', + }), + title: i18n.translate('controls.controlGroup.management.delete.deleteAllTitle', { + defaultMessage: 'Delete all controls?', + }), + buttonColor: 'danger', + } + ) + .then((confirmed) => { + if (confirmed) + Object.keys(controlGroupApi.children$.getValue()).forEach((childId) => { + controlGroupApi.removePanel(childId); + }); + ref.close(); + }); + }; + + const overlay = services.core.overlays.openFlyout( + toMountPoint( + { + Object.keys(stateManager).forEach((key) => { + ( + stateManager[key as keyof ControlGroupEditorState] as BehaviorSubject< + ControlGroupEditorState[keyof ControlGroupEditorState] + > + ).next(editorStateManager[key as keyof ControlGroupEditorState].getValue()); + }); + closeOverlay(overlay); + }} + onDeleteAll={() => onDeleteAll(overlay)} + onCancel={() => closeOverlay(overlay)} + />, + { + theme: services.core.theme, + i18n: services.core.i18n, + } + ), + { + 'aria-label': i18n.translate('controls.controlGroup.manageControl', { + defaultMessage: 'Edit control settings', + }), + outsideClickCloses: false, + onClose: () => closeOverlay(overlay), + } + ); + + if (apiHasParentApi(controlGroupApi) && tracksOverlays(controlGroupApi.parentApi)) { + controlGroupApi.parentApi.openOverlay(overlay); + } +}; diff --git a/examples/controls_example/public/react_controls/control_group/serialization_utils.ts b/examples/controls_example/public/react_controls/control_group/serialization_utils.ts new file mode 100644 index 00000000000000..94566bf20af82e --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/serialization_utils.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Reference } from '@kbn/content-management-utils'; +import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '@kbn/controls-plugin/common'; +import { SerializedPanelState } from '@kbn/presentation-containers'; +import { omit } from 'lodash'; +import { DefaultControlApi, DefaultControlState } from '../types'; +import { ControlGroupRuntimeState, ControlGroupSerializedState } from './types'; + +export const deserializeControlGroup = ( + state: SerializedPanelState +): ControlGroupRuntimeState => { + const panels = JSON.parse(state.rawState.panelsJSON); + const ignoreParentSettings = JSON.parse(state.rawState.ignoreParentSettingsJSON); + + /** Inject data view references into each individual control */ + const references = state.references ?? []; + references.forEach((reference) => { + const referenceName = reference.name; + const panelId = referenceName.substring('controlGroup_'.length, referenceName.lastIndexOf(':')); + if (panels[panelId]) { + panels[panelId].dataViewId = reference.id; + } + }); + + /** Flatten the state of each panel by removing `explicitInput` */ + const flattenedPanels = Object.keys(panels).reduce((prev, panelId) => { + const currentPanel = panels[panelId]; + const currentPanelExplicitInput = panels[panelId].explicitInput; + return { + ...prev, + [panelId]: { ...omit(currentPanel, 'explicitInput'), ...currentPanelExplicitInput }, + }; + }, {}); + + return { + ...omit(state.rawState, ['panelsJSON', 'ignoreParentSettingsJSON']), + initialChildControlState: flattenedPanels, + ignoreParentSettings, + labelPosition: state.rawState.controlStyle, // Rename "controlStyle" to "labelPosition" + defaultControlGrow: DEFAULT_CONTROL_GROW, + defaultControlWidth: DEFAULT_CONTROL_WIDTH, + }; +}; + +export const serializeControlGroup = ( + children: { + [key: string]: DefaultControlApi; + }, + idsInOrder: string[], + state: Omit< + ControlGroupRuntimeState, + | 'anyChildHasUnsavedChanges' + | 'defaultControlGrow' + | 'defaultControlWidth' + | 'initialChildControlState' + > +): SerializedPanelState => { + let references: Reference[] = []; + + /** Re-add the `explicitInput` layer on serialize so control group saved object retains shape */ + const explicitInputPanels = Object.keys(children).reduce((prev, panelId) => { + const child: DefaultControlApi = children[panelId]; + const type = child.type; + const { + rawState: { grow, width, ...rest }, + references: childReferences, + } = (child.serializeState as () => SerializedPanelState)(); + + if (childReferences && childReferences.length > 0) { + references = [...references, ...childReferences]; + } + + /** + * Note: With legacy control embeddables, `grow` and `width` were duplicated under + * explicit input - this is no longer the case. + */ + return { + ...prev, + [panelId]: { grow, order: idsInOrder.indexOf(panelId), type, width, explicitInput: rest }, + }; + }, {}); + + return { + rawState: { + ...omit(state, ['ignoreParentSettings', 'labelPosition']), + controlStyle: state.labelPosition, // Rename "labelPosition" to "controlStyle" + ignoreParentSettingsJSON: JSON.stringify(state.ignoreParentSettings), + panelsJSON: JSON.stringify(explicitInputPanels), + }, + references, + }; +}; diff --git a/examples/controls_example/public/react_controls/control_group/types.ts b/examples/controls_example/public/react_controls/control_group/types.ts new file mode 100644 index 00000000000000..b1807d31d801b3 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_group/types.ts @@ -0,0 +1,91 @@ +/* + * Copyright 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 { ControlGroupChainingSystem } from '@kbn/controls-plugin/common/control_group/types'; +import { ParentIgnoreSettings } from '@kbn/controls-plugin/public'; +import { ControlStyle, ControlWidth } from '@kbn/controls-plugin/public/types'; +import { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public'; +import { Filter } from '@kbn/es-query'; +import { HasSerializedChildState, PresentationContainer } from '@kbn/presentation-containers'; +import { + HasEditCapabilities, + HasParentApi, + PublishesDataLoading, + PublishesFilters, + PublishesUnifiedSearch, + PublishesUnsavedChanges, + PublishingSubject, +} from '@kbn/presentation-publishing'; +import { PublishesDataViews } from '@kbn/presentation-publishing/interfaces/publishes_data_views'; +import { DefaultControlState, PublishesControlDisplaySettings } from '../types'; + +/** The control display settings published by the control group are the "default" */ +type PublishesControlGroupDisplaySettings = PublishesControlDisplaySettings & { + labelPosition: PublishingSubject; +}; +export interface ControlPanelsState { + [panelId: string]: ControlState; +} + +export type ControlGroupUnsavedChanges = Omit< + ControlGroupRuntimeState, + 'initialChildControlState' | 'defaultControlGrow' | 'defaultControlWidth' +> & { + filters: Filter[] | undefined; +}; + +export type ControlPanelState = DefaultControlState & { type: string; order: number }; + +export type ControlGroupApi = PresentationContainer & + DefaultEmbeddableApi & + PublishesFilters & + PublishesDataViews & + HasSerializedChildState & + HasEditCapabilities & + PublishesDataLoading & + PublishesUnsavedChanges & + PublishesControlGroupDisplaySettings & + Partial>; + +export interface ControlGroupRuntimeState { + chainingSystem: ControlGroupChainingSystem; + defaultControlGrow?: boolean; + defaultControlWidth?: ControlWidth; + labelPosition: ControlStyle; // TODO: Rename this type to ControlLabelPosition + showApplySelections?: boolean; + ignoreParentSettings?: ParentIgnoreSettings; + + initialChildControlState: ControlPanelsState; + /** TODO: Handle the editor config, which is used with the control group renderer component */ + editorConfig?: { + hideDataViewSelector?: boolean; + hideWidthSettings?: boolean; + hideAdditionalSettings?: boolean; + }; +} + +export type ControlGroupEditorState = Pick< + ControlGroupRuntimeState, + 'chainingSystem' | 'labelPosition' | 'showApplySelections' | 'ignoreParentSettings' +>; + +export type ControlGroupSerializedState = Omit< + ControlGroupRuntimeState, + | 'labelPosition' + | 'ignoreParentSettings' + | 'defaultControlGrow' + | 'defaultControlWidth' + | 'anyChildHasUnsavedChanges' + | 'initialChildControlState' +> & { + panelsJSON: string; + ignoreParentSettingsJSON: string; + // In runtime state, we refer to this property as `labelPosition`; however, to avoid migrations, we will + // continue to refer to this property as the legacy `controlStyle` in the serialized state + controlStyle: ControlStyle; +}; diff --git a/examples/controls_example/public/react_controls/control_panel.tsx b/examples/controls_example/public/react_controls/control_panel.tsx new file mode 100644 index 00000000000000..ec431e61b9dcf1 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_panel.tsx @@ -0,0 +1,179 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 classNames from 'classnames'; +import React, { useState } from 'react'; + +import { EuiFlexItem, EuiFormControlLayout, EuiFormLabel, EuiFormRow, EuiIcon } from '@elastic/eui'; +import { css } from '@emotion/react'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { + apiHasParentApi, + apiPublishesViewMode, + useBatchedOptionalPublishingSubjects, +} from '@kbn/presentation-publishing'; +import { FloatingActions } from '@kbn/presentation-util-plugin/public'; +import { euiThemeVars } from '@kbn/ui-theme'; + +import { ControlError } from './control_error_component'; +import { ControlPanelProps, DefaultControlApi } from './types'; + +/** + * TODO: Handle dragging + */ +const DragHandle = ({ isEditable, controlTitle }: { isEditable: boolean; controlTitle?: string }) => + isEditable ? ( + + ) : null; + +export const ControlPanel = ({ + Component, +}: ControlPanelProps) => { + const [api, setApi] = useState(null); + + const viewModeSubject = (() => { + if ( + apiHasParentApi(api) && + apiHasParentApi(api.parentApi) && // api.parentApi => controlGroupApi + apiPublishesViewMode(api.parentApi.parentApi) // controlGroupApi.parentApi => dashboardApi + ) + return api.parentApi.parentApi.viewMode; // get view mode from dashboard API + })(); + + const [ + dataLoading, + blockingError, + panelTitle, + defaultPanelTitle, + grow, + width, + labelPosition, + rawViewMode, + ] = useBatchedOptionalPublishingSubjects( + api?.dataLoading, + api?.blockingError, + api?.panelTitle, + api?.defaultPanelTitle, + api?.grow, + api?.width, + api?.parentApi?.labelPosition, + viewModeSubject + ); + const usingTwoLineLayout = labelPosition === 'twoLine'; + + const [initialLoadComplete, setInitialLoadComplete] = useState(!dataLoading); + if (!initialLoadComplete && (dataLoading === false || (api && !api.dataLoading))) { + setInitialLoadComplete(true); + } + + const viewMode = (rawViewMode ?? ViewMode.VIEW) as ViewMode; + const isEditable = viewMode === ViewMode.EDIT; + + return ( + (draggingIndex ?? -1), + })} + > + + + {blockingError ? ( + + + + ) : ( + {api.getCustomPrepend()} + ) : usingTwoLineLayout ? ( + + ) : ( + <> + {' '} + + {panelTitle || defaultPanelTitle} + + + ) + } + > + { + if (newApi && !api) setApi(newApi); + }} + /> + + )} + + + + ); +}; diff --git a/examples/controls_example/public/react_controls/control_renderer.tsx b/examples/controls_example/public/react_controls/control_renderer.tsx new file mode 100644 index 00000000000000..471b12894bae79 --- /dev/null +++ b/examples/controls_example/public/react_controls/control_renderer.tsx @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useImperativeHandle, useMemo } from 'react'; +import { BehaviorSubject } from 'rxjs'; +import { v4 as generateId } from 'uuid'; + +import { SerializedStyles } from '@emotion/react'; +import { StateComparators } from '@kbn/presentation-publishing'; + +import { getControlFactory } from './control_factory_registry'; +import { ControlGroupApi } from './control_group/types'; +import { ControlPanel } from './control_panel'; +import { ControlApiRegistration, DefaultControlApi, DefaultControlState } from './types'; + +/** + * Renders a component from the control registry into a Control Panel + */ +export const ControlRenderer = < + StateType extends DefaultControlState = DefaultControlState, + ApiType extends DefaultControlApi = DefaultControlApi +>({ + type, + maybeId, + getParentApi, + onApiAvailable, +}: { + type: string; + maybeId?: string; + getParentApi: () => ControlGroupApi; + onApiAvailable?: (api: ApiType) => void; +}) => { + const component = useMemo( + () => + (() => { + const parentApi = getParentApi(); + const uuid = maybeId ?? generateId(); + const factory = getControlFactory(type); + + const buildApi = ( + apiRegistration: ControlApiRegistration, + comparators: StateComparators // TODO: Use these to calculate unsaved changes + ): ApiType => { + const fullApi = { + ...apiRegistration, + uuid, + parentApi, + unsavedChanges: new BehaviorSubject | undefined>(undefined), + resetUnsavedChanges: () => {}, + type: factory.type, + } as unknown as ApiType; + + onApiAvailable?.(fullApi); + return fullApi; + }; + + const { rawState: initialState } = parentApi.getSerializedStateForChild(uuid); + + const { api, Component } = factory.buildControl( + initialState as unknown as StateType, + buildApi, + uuid, + parentApi + ); + + return React.forwardRef((props, ref) => { + // expose the api into the imperative handle + useImperativeHandle(ref, () => api, []); + return ; + }); + })(), + /** + * Disabling exhaustive deps because we do not want to re-fetch the component + * from the embeddable registry unless the type changes. + */ + // eslint-disable-next-line react-hooks/exhaustive-deps + [type] + ); + + return Component={component} />; +}; diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx b/examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx new file mode 100644 index 00000000000000..9bc9eddbfc0d23 --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/data_control_constants.tsx @@ -0,0 +1,154 @@ +/* + * Copyright 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 { RANGE_SLIDER_CONTROL } from '@kbn/controls-plugin/common'; +import { i18n } from '@kbn/i18n'; + +export const DataControlEditorStrings = { + manageControl: { + getFlyoutCreateTitle: () => + i18n.translate('controls.controlGroup.manageControl.createFlyoutTitle', { + defaultMessage: 'Create control', + }), + getFlyoutEditTitle: () => + i18n.translate('controls.controlGroup.manageControl.editFlyoutTitle', { + defaultMessage: 'Edit control', + }), + dataSource: { + getFormGroupTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.formGroupTitle', { + defaultMessage: 'Data source', + }), + getFormGroupDescription: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.formGroupDescription', { + defaultMessage: 'Select the data view and field that you want to create a control for.', + }), + getSelectDataViewMessage: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.selectDataViewMessage', { + defaultMessage: 'Please select a data view', + }), + getDataViewTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.dataViewTitle', { + defaultMessage: 'Data view', + }), + getDataViewListErrorTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.dataViewListErrorTitle', { + defaultMessage: 'Error loading data views', + }), + getFieldTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.fieldTitle', { + defaultMessage: 'Field', + }), + getFieldListErrorTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.fieldListErrorTitle', { + defaultMessage: 'Error loading the field list', + }), + getControlTypeTitle: () => + i18n.translate('controls.controlGroup.manageControl.dataSource.controlTypesTitle', { + defaultMessage: 'Control type', + }), + getControlTypeErrorMessage: ({ + fieldSelected, + controlType, + }: { + fieldSelected?: boolean; + controlType?: string; + }) => { + if (!fieldSelected) { + return i18n.translate( + 'controls.controlGroup.manageControl.dataSource.controlTypErrorMessage.noField', + { + defaultMessage: 'Select a field first.', + } + ); + } + + switch (controlType) { + /** + * Note that options list controls are currently compatible with every field type; so, there is no + * need to have a special error message for these. + */ + case RANGE_SLIDER_CONTROL: { + return i18n.translate( + 'controls.controlGroup.manageControl.dataSource.controlTypeErrorMessage.rangeSlider', + { + defaultMessage: 'Range sliders are only compatible with number fields.', + } + ); + } + default: { + /** This shouldn't ever happen - but, adding just in case as a fallback. */ + return i18n.translate( + 'controls.controlGroup.manageControl.dataSource.controlTypeErrorMessage.default', + { + defaultMessage: 'Select a compatible control type.', + } + ); + } + } + }, + }, + displaySettings: { + getFormGroupTitle: () => + i18n.translate('controls.controlGroup.manageControl.displaySettings.formGroupTitle', { + defaultMessage: 'Display settings', + }), + getFormGroupDescription: () => + i18n.translate('controls.controlGroup.manageControl.displaySettings.formGroupDescription', { + defaultMessage: 'Change how the control appears on your dashboard.', + }), + getTitleInputTitle: () => + i18n.translate('controls.controlGroup.manageControl.displaySettings.titleInputTitle', { + defaultMessage: 'Label', + }), + getWidthInputTitle: () => + i18n.translate('controls.controlGroup.manageControl.displaySettings.widthInputTitle', { + defaultMessage: 'Minimum width', + }), + getGrowSwitchTitle: () => + i18n.translate('controls.controlGroup.manageControl.displaySettings.growSwitchTitle', { + defaultMessage: 'Expand width to fit available space', + }), + }, + controlTypeSettings: { + getFormGroupTitle: (type: string) => + i18n.translate('controls.controlGroup.manageControl.controlTypeSettings.formGroupTitle', { + defaultMessage: '{controlType} settings', + values: { controlType: type }, + }), + getFormGroupDescription: (type: string) => + i18n.translate( + 'controls.controlGroup.manageControl.controlTypeSettings.formGroupDescription', + { + defaultMessage: 'Custom settings for your {controlType} control.', + values: { controlType: type.toLocaleLowerCase() }, + } + ), + }, + getSaveChangesTitle: () => + i18n.translate('controls.controlGroup.manageControl.saveChangesTitle', { + defaultMessage: 'Save and close', + }), + getCancelTitle: () => + i18n.translate('controls.controlGroup.manageControl.cancelTitle', { + defaultMessage: 'Cancel', + }), + getDeleteButtonTitle: () => + i18n.translate('controls.controlGroup.management.delete', { + defaultMessage: 'Delete control', + }), + }, + management: { + controlWidth: { + getWidthSwitchLegend: () => + i18n.translate('controls.controlGroup.management.layout.controlWidthLegend', { + defaultMessage: 'Change control size', + }), + }, + }, +}; diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx b/examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx new file mode 100644 index 00000000000000..9f0db921b0778a --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/data_control_editor.tsx @@ -0,0 +1,403 @@ +/* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useEffect, useMemo, useState } from 'react'; +import useAsync from 'react-use/lib/useAsync'; + +import { + EuiButton, + EuiButtonEmpty, + EuiButtonGroup, + EuiCallOut, + EuiDescribedFormGroup, + EuiFieldText, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiForm, + EuiFormRow, + EuiIcon, + EuiKeyPadMenu, + EuiKeyPadMenuItem, + EuiSpacer, + EuiSwitch, + EuiTitle, + EuiToolTip, +} from '@elastic/eui'; +import { DataViewField } from '@kbn/data-views-plugin/common'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; +import { + LazyDataViewPicker, + LazyFieldPicker, + withSuspense, +} from '@kbn/presentation-util-plugin/public'; + +import { + ControlWidth, + DEFAULT_CONTROL_GROW, + DEFAULT_CONTROL_WIDTH, +} from '@kbn/controls-plugin/common'; +import { CONTROL_WIDTH_OPTIONS } from '@kbn/controls-plugin/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { getAllControlTypes, getControlFactory } from '../control_factory_registry'; +import { ControlGroupApi } from '../control_group/types'; +import { ControlStateManager } from '../types'; +import { DataControlEditorStrings } from './data_control_constants'; +import { getDataControlFieldRegistry } from './data_control_editor_utils'; +import { DataControlFactory, DefaultDataControlState, isDataControlFactory } from './types'; + +export interface ControlEditorProps< + State extends DefaultDataControlState = DefaultDataControlState +> { + controlId?: string; // if provided, then editing existing control; otherwise, creating a new control + controlType?: string; + onCancel: () => void; + onSave: (type?: string) => void; + stateManager: ControlStateManager; + parentApi: ControlGroupApi; // controls must always have a parent API + services: { + dataViews: DataViewsPublicPluginStart; + }; +} + +const FieldPicker = withSuspense(LazyFieldPicker, null); +const DataViewPicker = withSuspense(LazyDataViewPicker, null); + +export const DataControlEditor = ({ + controlId, + controlType, + onSave, + onCancel, + stateManager, + parentApi: controlGroup, + /** TODO: These should not be props */ + services: { dataViews: dataViewService }, +}: ControlEditorProps) => { + const [ + selectedDataViewId, + selectedFieldName, + currentTitle, + selectedGrow, + selectedWidth, + defaultGrow, + defaultWidth, + ] = useBatchedPublishingSubjects( + stateManager.dataViewId, + stateManager.fieldName, + stateManager.title, + stateManager.grow, + stateManager.width, + controlGroup.grow, + controlGroup.width + // controlGroup.lastUsedDataViewId, // TODO: Implement last used data view id + ); + + const [selectedFieldDisplayName, setSelectedFieldDisplayName] = useState(selectedFieldName); + const [selectedControlType, setSelectedControlType] = useState(controlType); + const [controlEditorValid, setControlEditorValid] = useState(false); + /** TODO: Make `editorConfig` work when refactoring the `ControlGroupRenderer` */ + // const editorConfig = controlGroup.getEditorConfig(); + + // TODO: Maybe remove `useAsync` - see https://github.com/elastic/kibana/pull/182842#discussion_r1624909709 + const { + loading: dataViewListLoading, + value: dataViewListItems = [], + error: dataViewListError, + } = useAsync(() => { + return dataViewService.getIdsWithTitle(); + }); + + // TODO: Maybe remove `useAsync` - see https://github.com/elastic/kibana/pull/182842#discussion_r1624909709 + const { + loading: dataViewLoading, + value: { selectedDataView, fieldRegistry } = { + selectedDataView: undefined, + fieldRegistry: undefined, + }, + error: fieldListError, + } = useAsync(async () => { + if (!selectedDataViewId) { + return; + } + const dataView = await dataViewService.get(selectedDataViewId); + const registry = await getDataControlFieldRegistry(dataView); + return { + selectedDataView: dataView, + fieldRegistry: registry, + }; + }, [selectedDataViewId]); + + useEffect(() => { + setControlEditorValid( + Boolean(selectedFieldName) && Boolean(selectedDataView) && Boolean(selectedControlType) + ); + }, [selectedFieldName, setControlEditorValid, selectedDataView, selectedControlType]); + + const dataControlFactories = useMemo(() => { + return getAllControlTypes() + .map((type) => getControlFactory(type)) + .filter((factory) => { + return isDataControlFactory(factory); + }); + }, []); + + const CompatibleControlTypesComponent = useMemo(() => { + return ( + + {dataControlFactories.map((factory) => { + const disabled = + fieldRegistry && selectedFieldName + ? !fieldRegistry[selectedFieldName]?.compatibleControlTypes.includes(factory.type) + : true; + const keyPadMenuItem = ( + setSelectedControlType(factory.type)} + label={factory.getDisplayName()} + > + + + ); + + return disabled ? ( + + {keyPadMenuItem} + + ) : ( + keyPadMenuItem + ); + })} + + ); + }, [selectedFieldName, fieldRegistry, selectedControlType, controlType, dataControlFactories]); + + const CustomSettingsComponent = useMemo(() => { + if (!selectedControlType || !selectedFieldName || !fieldRegistry) return; + + const controlFactory = getControlFactory(selectedControlType) as DataControlFactory; + const CustomSettings = controlFactory.CustomOptionsComponent; + + if (!CustomSettings) return; + + return ( + + {DataControlEditorStrings.manageControl.controlTypeSettings.getFormGroupTitle( + controlFactory.getDisplayName() + )} + + } + description={DataControlEditorStrings.manageControl.controlTypeSettings.getFormGroupDescription( + controlFactory.getDisplayName() + )} + data-test-subj="control-editor-custom-settings" + > + + + ); + }, [fieldRegistry, selectedControlType, selectedFieldName, stateManager]); + + return ( + <> + + +

+ {!controlType + ? DataControlEditorStrings.manageControl.getFlyoutCreateTitle() + : DataControlEditorStrings.manageControl.getFlyoutEditTitle()} +

+
+
+ + + {DataControlEditorStrings.manageControl.dataSource.getFormGroupTitle()}} + description={DataControlEditorStrings.manageControl.dataSource.getFormGroupDescription()} + > + {/* {!editorConfig?.hideDataViewSelector && ( */} + + {dataViewListError ? ( + +

{dataViewListError.message}

+
+ ) : ( + { + stateManager.dataViewId.next(newDataViewId); + }} + trigger={{ + label: + selectedDataView?.getName() ?? + DataControlEditorStrings.manageControl.dataSource.getSelectDataViewMessage(), + }} + selectableProps={{ isLoading: dataViewListLoading }} + /> + )} +
+ {/* )} */} + + + {fieldListError ? ( + +

{fieldListError.message}

+
+ ) : ( + { + /** TODO: Make `fieldFilterPredicate` work when refactoring the `ControlGroupRenderer` */ + // const customPredicate = controlGroup.fieldFilterPredicate?.(field) ?? true; + return Boolean(fieldRegistry?.[field.name]); + }} + selectedFieldName={selectedFieldName} + dataView={selectedDataView} + onSelectField={(field) => { + setSelectedControlType(fieldRegistry?.[field.name]?.compatibleControlTypes[0]); + const newDefaultTitle = field.displayName ?? field.name; + stateManager.fieldName.next(field.name); + setSelectedFieldDisplayName(newDefaultTitle); + if (!currentTitle || currentTitle === selectedFieldDisplayName) { + stateManager.title.next(newDefaultTitle); + } + }} + selectableProps={{ isLoading: dataViewListLoading || dataViewLoading }} + /> + )} +
+ + {CompatibleControlTypesComponent} + +
+ {DataControlEditorStrings.manageControl.displaySettings.getFormGroupTitle()} + } + description={DataControlEditorStrings.manageControl.displaySettings.getFormGroupDescription()} + > + + stateManager.title.next(e.target.value)} + /> + + {/* {!editorConfig?.hideWidthSettings && ( */} + +
+ stateManager.width.next(newWidth as ControlWidth)} + /> + + stateManager.grow.next(!selectedGrow)} + data-test-subj="control-editor-grow-switch" + /> +
+
+ {/* )} */} +
+ {CustomSettingsComponent} + {/* {!editorConfig?.hideAdditionalSettings ? CustomSettingsComponent : null} */} + {controlId && ( + <> + + { + onCancel(); + controlGroup.removePanel(controlId); + }} + > + {DataControlEditorStrings.manageControl.getDeleteButtonTitle()} + + + )} +
+
+ + + + { + onCancel(); + }} + > + {DataControlEditorStrings.manageControl.getCancelTitle()} + + + + { + onSave(); + }} + > + {DataControlEditorStrings.manageControl.getSaveChangesTitle()} + + + + + + ); +}; diff --git a/examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.ts b/examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.ts new file mode 100644 index 00000000000000..d4ced0b1aafa6f --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/data_control_editor_utils.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 { memoize } from 'lodash'; + +import { DataControlFieldRegistry } from '@kbn/controls-plugin/public/types'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { getAllControlTypes, getControlFactory } from '../control_factory_registry'; +import { isDataControlFactory } from './types'; + +/** TODO: This funciton is duplicated from the controls plugin to avoid exporting it */ +export const getDataControlFieldRegistry = memoize( + async (dataView: DataView) => { + return await loadFieldRegistryFromDataView(dataView); + }, + (dataView: DataView) => [dataView.id, JSON.stringify(dataView.fields.getAll())].join('|') +); + +/** TODO: This function is duplicated from the controls plugin to avoid exporting it */ +const loadFieldRegistryFromDataView = async ( + dataView: DataView +): Promise => { + const controlFactories = getAllControlTypes().map((controlType) => + getControlFactory(controlType) + ); + const fieldRegistry: DataControlFieldRegistry = {}; + return new Promise((resolve) => { + for (const field of dataView.fields.getAll()) { + const compatibleControlTypes = []; + for (const factory of controlFactories) { + if (isDataControlFactory(factory) && factory.isFieldCompatible(field)) { + compatibleControlTypes.push(factory.type); + } + } + if (compatibleControlTypes.length > 0) { + fieldRegistry[field.name] = { field, compatibleControlTypes }; + } + } + resolve(fieldRegistry); + }); +}; diff --git a/examples/controls_example/public/react_controls/data_controls/initialize_data_control.tsx b/examples/controls_example/public/react_controls/data_controls/initialize_data_control.tsx new file mode 100644 index 00000000000000..988104ca11d1a8 --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/initialize_data_control.tsx @@ -0,0 +1,137 @@ +/* + * Copyright 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 { BehaviorSubject, combineLatestWith, switchMap } from 'rxjs'; + +import { CoreStart } from '@kbn/core-lifecycle-browser'; +import { DataView, DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/common'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { Filter } from '@kbn/es-query'; +import { SerializedPanelState } from '@kbn/presentation-containers'; +import { StateComparators } from '@kbn/presentation-publishing'; + +import { ControlGroupApi } from '../control_group/types'; +import { initializeDefaultControlApi } from '../initialize_default_control_api'; +import { ControlApiInitialization, ControlStateManager, DefaultControlState } from '../types'; +import { openDataControlEditor } from './open_data_control_editor'; +import { DataControlApi, DefaultDataControlState } from './types'; + +export const initializeDataControl = ( + controlId: string, + controlType: string, + state: DefaultDataControlState, + editorStateManager: ControlStateManager, + controlGroup: ControlGroupApi, + services: { + core: CoreStart; + dataViews: DataViewsPublicPluginStart; + } +): { + dataControlApi: ControlApiInitialization; + dataControlComparators: StateComparators; + dataControlStateManager: ControlStateManager; + serializeDataControl: () => SerializedPanelState; +} => { + const { + defaultControlApi, + defaultControlComparators, + defaultControlStateManager, + serializeDefaultControl, + } = initializeDefaultControlApi(state); + + const panelTitle = new BehaviorSubject(state.title); + const defaultPanelTitle = new BehaviorSubject(undefined); + const dataViewId = new BehaviorSubject(state.dataViewId); + const fieldName = new BehaviorSubject(state.fieldName); + const dataViews = new BehaviorSubject(undefined); + const filters = new BehaviorSubject(undefined); + + const dataControlComparators: StateComparators = { + ...defaultControlComparators, + title: [panelTitle, (value: string | undefined) => panelTitle.next(value)], + dataViewId: [dataViewId, (value: string) => dataViewId.next(value)], + fieldName: [fieldName, (value: string) => fieldName.next(value)], + }; + + const stateManager: ControlStateManager = { + ...defaultControlStateManager, + dataViewId, + fieldName, + title: panelTitle, + }; + + /** + * Fetch the data view + field whenever the selected data view ID or field name changes; use the + * fetched field spec to set the default panel title, which is always equal to either the field + * name or the field's display name. + */ + dataViewId + .pipe( + combineLatestWith(fieldName), + switchMap(async ([currentDataViewId, currentFieldName]) => { + defaultControlApi.setDataLoading(true); + const dataView = await services.dataViews.get(currentDataViewId); + const field = dataView.getFieldByName(currentFieldName); + defaultControlApi.setDataLoading(false); + return { dataView, field }; + }) + ) + .subscribe(async ({ dataView, field }) => { + if (!dataView || !field) return; + dataViews.next([dataView]); + defaultPanelTitle.next(field.displayName || field.name); + }); + + const onEdit = async () => { + openDataControlEditor( + { ...stateManager, ...editorStateManager } as ControlStateManager< + DefaultDataControlState & EditorState + >, + controlGroup, + services, + controlType, + controlId + ); + }; + + const dataControlApi: ControlApiInitialization = { + ...defaultControlApi, + panelTitle, + defaultPanelTitle, + dataViews, + onEdit, + filters$: filters, + setOutputFilter: (newFilter: Filter | undefined) => { + filters.next(newFilter ? [newFilter] : undefined); + }, + isEditingEnabled: () => true, + }; + + return { + dataControlApi, + dataControlComparators, + dataControlStateManager: stateManager, + serializeDataControl: () => { + return { + rawState: { + ...serializeDefaultControl().rawState, + dataViewId: dataViewId.getValue(), + fieldName: fieldName.getValue(), + title: panelTitle.getValue(), + }, + references: [ + { + name: `controlGroup_${controlId}:${controlType}DataView`, + type: DATA_VIEW_SAVED_OBJECT_TYPE, + id: dataViewId.getValue(), + }, + ], + }; + }, + }; +}; diff --git a/examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx b/examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx new file mode 100644 index 00000000000000..5c25ffcc7947d8 --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/open_data_control_editor.tsx @@ -0,0 +1,131 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import deepEqual from 'react-fast-compare'; +import { BehaviorSubject } from 'rxjs'; + +import { CoreStart, OverlayRef } from '@kbn/core/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { tracksOverlays } from '@kbn/presentation-containers'; +import { apiHasParentApi } from '@kbn/presentation-publishing'; +import { toMountPoint } from '@kbn/react-kibana-mount'; + +import { ControlGroupApi } from '../control_group/types'; +import { DataControlEditor } from './data_control_editor'; +import { DefaultDataControlState } from './types'; +import { ControlStateManager } from '../types'; + +export const openDataControlEditor = async < + State extends DefaultDataControlState = DefaultDataControlState +>( + stateManager: ControlStateManager, + controlGroupApi: ControlGroupApi, + services: { + core: CoreStart; + dataViews: DataViewsPublicPluginStart; + }, + controlType?: string, + controlId?: string +): Promise => { + return new Promise((resolve) => { + /** + * Duplicate all state into a new manager because we do not want to actually apply the changes + * to the control until the user hits save. + */ + const editorStateManager: ControlStateManager = Object.keys(stateManager).reduce( + (prev, key) => { + return { + ...prev, + [key as keyof State]: new BehaviorSubject(stateManager[key as keyof State].getValue()), + }; + }, + {} as ControlStateManager + ); + + const closeOverlay = (overlayRef: OverlayRef) => { + if (apiHasParentApi(controlGroupApi) && tracksOverlays(controlGroupApi.parentApi)) { + controlGroupApi.parentApi.clearOverlays(); + } + overlayRef.close(); + }; + + const onCancel = (overlay: OverlayRef) => { + const initialState = Object.keys(stateManager).map((key) => { + return stateManager[key as keyof State].getValue(); + }); + const newState = Object.keys(editorStateManager).map((key) => { + return editorStateManager[key as keyof State].getValue(); + }); + + if (deepEqual(initialState, newState)) { + closeOverlay(overlay); + return; + } + services.core.overlays + .openConfirm( + i18n.translate('controls.controlGroup.management.discard.sub', { + defaultMessage: `Changes that you've made to this control will be discarded, are you sure you want to continue?`, + }), + { + confirmButtonText: i18n.translate('controls.controlGroup.management.discard.confirm', { + defaultMessage: 'Discard changes', + }), + cancelButtonText: i18n.translate('controls.controlGroup.management.discard.cancel', { + defaultMessage: 'Cancel', + }), + title: i18n.translate('controls.controlGroup.management.discard.title', { + defaultMessage: 'Discard changes?', + }), + buttonColor: 'danger', + } + ) + .then((confirmed) => { + if (confirmed) { + closeOverlay(overlay); + } + }); + }; + + const overlay = services.core.overlays.openFlyout( + toMountPoint( + { + onCancel(overlay); + }} + onSave={() => { + Object.keys(stateManager).forEach((key) => { + stateManager[key as keyof State].next( + editorStateManager[key as keyof State].getValue() + ); + }); + closeOverlay(overlay); + resolve(undefined); + }} + stateManager={editorStateManager} + services={{ dataViews: services.dataViews }} + />, + { + theme: services.core.theme, + i18n: services.core.i18n, + } + ), + { + onClose: () => closeOverlay(overlay), + } + ); + + if (apiHasParentApi(controlGroupApi) && tracksOverlays(controlGroupApi.parentApi)) { + controlGroupApi.parentApi.openOverlay(overlay); + } + }); +}; diff --git a/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx b/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx new file mode 100644 index 00000000000000..6e401cff5a37cf --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/search_control/get_search_control_factory.tsx @@ -0,0 +1,227 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useEffect } from 'react'; +import deepEqual from 'react-fast-compare'; +import { BehaviorSubject, combineLatest, debounceTime, distinctUntilChanged } from 'rxjs'; + +import { EuiFieldSearch, EuiFormRow, EuiRadioGroup } from '@elastic/eui'; +import { CoreStart } from '@kbn/core/public'; +import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; + +import { initializeDataControl } from '../initialize_data_control'; +import { DataControlFactory } from '../types'; +import { + SearchControlApi, + SearchControlState, + SearchControlTechniques, + SEARCH_CONTROL_TYPE, +} from './types'; + +const allSearchOptions = [ + { + id: 'match', + label: i18n.translate('controlsExamples.searchControl.searchTechnique.match', { + defaultMessage: 'Fuzzy match', + }), + 'data-test-subj': 'searchControl__matchSearchOptionAdditionalSetting', + }, + { + id: 'simple_query_string', + label: i18n.translate('controlsExamples.searchControl.searchTechnique.simpleQueryString', { + defaultMessage: 'Query string', + }), + 'data-test-subj': 'optionsListControl__queryStringSearchOptionAdditionalSetting', + }, +]; + +const DEFAULT_SEARCH_TECHNIQUE = 'match'; + +export const getSearchControlFactory = ({ + core, + dataViewsService, +}: { + core: CoreStart; + dataViewsService: DataViewsPublicPluginStart; +}): DataControlFactory => { + return { + type: SEARCH_CONTROL_TYPE, + getIconType: () => 'search', + getDisplayName: () => + i18n.translate('controlsExamples.searchControl.displayName', { defaultMessage: 'Search' }), + isFieldCompatible: (field) => { + return ( + field.searchable && + field.spec.type === 'string' && + (field.spec.esTypes ?? []).includes('text') + ); + }, + CustomOptionsComponent: ({ stateManager }) => { + const searchTechnique = useStateFromPublishingSubject(stateManager.searchTechnique); + + return ( + + { + const newSearchTechnique = id as SearchControlTechniques; + stateManager.searchTechnique.next(newSearchTechnique); + }} + /> + + ); + }, + buildControl: (initialState, buildApi, uuid, parentApi) => { + const searchString = new BehaviorSubject(initialState.searchString); + const searchTechnique = new BehaviorSubject( + initialState.searchTechnique ?? DEFAULT_SEARCH_TECHNIQUE + ); + const editorStateManager = { searchTechnique }; + + const { + dataControlApi, + dataControlComparators, + dataControlStateManager, + serializeDataControl, + } = initializeDataControl>( + uuid, + SEARCH_CONTROL_TYPE, + initialState, + editorStateManager, + parentApi, + { + core, + dataViews: dataViewsService, + } + ); + + const api = buildApi( + { + ...dataControlApi, + getTypeDisplayName: () => + i18n.translate('controlsExamples.searchControl.displayName', { + defaultMessage: 'Search', + }), + serializeState: () => { + const { rawState: dataControlState, references } = serializeDataControl(); + return { + rawState: { + ...dataControlState, + searchString: searchString.getValue(), + searchTechnique: searchTechnique.getValue(), + }, + references, // does not have any references other than those provided by the data control serializer + }; + }, + clearSelections: () => { + searchString.next(undefined); + }, + }, + { + ...dataControlComparators, + searchTechnique: [ + searchTechnique, + (newTechnique: SearchControlTechniques | undefined) => + searchTechnique.next(newTechnique), + ], + searchString: [ + searchString, + (newString: string | undefined) => + searchString.next(newString?.length === 0 ? undefined : newString), + ], + } + ); + + /** + * If either the search string or the search technique changes, recalulate the output filter + */ + const onSearchStringChanged = combineLatest([searchString, searchTechnique]) + .pipe(debounceTime(200), distinctUntilChanged(deepEqual)) + .subscribe(([newSearchString, currentSearchTechnnique]) => { + const currentDataView = dataControlApi.dataViews.getValue()?.[0]; + const currentField = dataControlStateManager.fieldName.getValue(); + + if (currentDataView && currentField) { + if (newSearchString) { + api.setOutputFilter( + currentSearchTechnnique === 'match' + ? { + query: { match: { [currentField]: { query: newSearchString } } }, + meta: { index: currentDataView.id }, + } + : { + query: { + simple_query_string: { + query: newSearchString, + fields: [currentField], + default_operator: 'and', + }, + }, + meta: { index: currentDataView.id }, + } + ); + } else { + api.setOutputFilter(undefined); + } + } + }); + + /** + * When the field changes (which can happen if either the field name or the dataview id changes), + * clear the previous search string. + */ + const onFieldChanged = combineLatest([ + dataControlStateManager.fieldName, + dataControlStateManager.dataViewId, + ]) + .pipe(distinctUntilChanged(deepEqual)) + .subscribe(() => { + searchString.next(undefined); + }); + + return { + api, + /** + * The `conrolStyleProps` prop is necessary because it contains the props from the generic + * ControlPanel that are necessary for styling + */ + Component: (conrolStyleProps) => { + const currentSearch = useStateFromPublishingSubject(searchString); + + useEffect(() => { + return () => { + // cleanup on unmount + onSearchStringChanged.unsubscribe(); + onFieldChanged.unsubscribe(); + }; + }, []); + + return ( + { + searchString.next(event.target.value); + }} + placeholder={i18n.translate('controls.searchControl.placeholder', { + defaultMessage: 'Search...', + })} + id={uuid} + fullWidth + /> + ); + }, + }; + }, + }; +}; diff --git a/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx b/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx new file mode 100644 index 00000000000000..d0b2d43b69f48c --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/search_control/types.tsx @@ -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 { DataControlApi, DefaultDataControlState } from '../types'; + +export const SEARCH_CONTROL_TYPE = 'searchControl'; + +export type SearchControlTechniques = 'match' | 'simple_query_string'; + +export interface SearchControlState extends DefaultDataControlState { + searchString?: string; + searchTechnique?: SearchControlTechniques; +} + +export type SearchControlApi = DataControlApi; diff --git a/examples/controls_example/public/react_controls/data_controls/types.ts b/examples/controls_example/public/react_controls/data_controls/types.ts new file mode 100644 index 00000000000000..a72c6c5db1c521 --- /dev/null +++ b/examples/controls_example/public/react_controls/data_controls/types.ts @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { CanClearSelections } from '@kbn/controls-plugin/public'; +import { DataViewField } from '@kbn/data-views-plugin/common'; +import { Filter } from '@kbn/es-query'; +import { + HasEditCapabilities, + PublishesDataViews, + PublishesFilters, + PublishesPanelTitle, +} from '@kbn/presentation-publishing'; +import { + ControlFactory, + ControlStateManager, + DefaultControlApi, + DefaultControlState, +} from '../types'; + +export type DataControlApi = DefaultControlApi & + Omit & // control titles cannot be hidden + HasEditCapabilities & + CanClearSelections & + PublishesDataViews & + PublishesFilters & { + setOutputFilter: (filter: Filter | undefined) => void; // a control should only ever output a **single** filter + }; + +export interface DataControlFactory< + State extends DefaultDataControlState = DefaultDataControlState, + Api extends DataControlApi = DataControlApi +> extends ControlFactory { + isFieldCompatible: (field: DataViewField) => boolean; + CustomOptionsComponent?: React.FC<{ + stateManager: ControlStateManager; + setControlEditorValid: (valid: boolean) => void; + }>; +} + +export const isDataControlFactory = ( + factory: ControlFactory +): factory is DataControlFactory => { + return typeof (factory as DataControlFactory).isFieldCompatible === 'function'; +}; + +export interface DefaultDataControlState extends DefaultControlState { + dataViewId: string; + fieldName: string; + title?: string; // custom control label +} diff --git a/examples/controls_example/public/react_controls/initialize_default_control_api.tsx b/examples/controls_example/public/react_controls/initialize_default_control_api.tsx new file mode 100644 index 00000000000000..dd2afcaf45d6c8 --- /dev/null +++ b/examples/controls_example/public/react_controls/initialize_default_control_api.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { BehaviorSubject } from 'rxjs'; + +import { ControlWidth } from '@kbn/controls-plugin/common'; +import { SerializedPanelState } from '@kbn/presentation-containers'; +import { StateComparators } from '@kbn/presentation-publishing'; + +import { + ControlApiInitialization, + ControlStateManager, + DefaultControlApi, + DefaultControlState, +} from './types'; + +export type ControlApi = ControlApiInitialization; + +export const initializeDefaultControlApi = ( + state: DefaultControlState +): { + defaultControlApi: ControlApi; + defaultControlStateManager: ControlStateManager; + defaultControlComparators: StateComparators; + serializeDefaultControl: () => SerializedPanelState; +} => { + const dataLoading = new BehaviorSubject(false); + const blockingError = new BehaviorSubject(undefined); + const grow = new BehaviorSubject(state.grow); + const width = new BehaviorSubject(state.width); + + const defaultControlApi: ControlApi = { + grow, + width, + dataLoading, + blockingError, + setBlockingError: (error) => blockingError.next(error), + setDataLoading: (loading) => dataLoading.next(loading), + }; + + const defaultControlStateManager: ControlStateManager = { + grow, + width, + }; + + const defaultControlComparators: StateComparators = { + grow: [grow, (newGrow: boolean | undefined) => grow.next(newGrow)], + width: [width, (newWidth: ControlWidth | undefined) => width.next(newWidth)], + }; + + return { + defaultControlApi, + defaultControlComparators, + defaultControlStateManager, + serializeDefaultControl: () => { + return { rawState: { grow: grow.getValue(), width: width.getValue() }, references: [] }; + }, + }; +}; diff --git a/examples/controls_example/public/react_controls/types.ts b/examples/controls_example/public/react_controls/types.ts new file mode 100644 index 00000000000000..7bb25ff9821bbf --- /dev/null +++ b/examples/controls_example/public/react_controls/types.ts @@ -0,0 +1,96 @@ +/* + * Copyright 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 { BehaviorSubject } from 'rxjs'; + +import { SerializedStyles } from '@emotion/react'; +import { ControlWidth } from '@kbn/controls-plugin/public/types'; +import { HasSerializableState } from '@kbn/presentation-containers'; +import { PanelCompatibleComponent } from '@kbn/presentation-panel-plugin/public/panel_component/types'; +import { + HasParentApi, + HasType, + HasUniqueId, + PublishesBlockingError, + PublishesDataLoading, + PublishesDisabledActionIds, + PublishesPanelTitle, + PublishesUnsavedChanges, + PublishingSubject, + StateComparators, +} from '@kbn/presentation-publishing'; + +import { ControlGroupApi } from './control_group/types'; + +export interface PublishesControlDisplaySettings { + grow: PublishingSubject; + width: PublishingSubject; +} + +export interface HasCustomPrepend { + getCustomPrepend: () => React.FC<{}>; +} + +export type DefaultControlApi = PublishesDataLoading & + PublishesBlockingError & + PublishesUnsavedChanges & + PublishesControlDisplaySettings & + Partial & + HasType & + HasUniqueId & + HasSerializableState & + HasParentApi & { + setDataLoading: (loading: boolean) => void; + setBlockingError: (error: Error | undefined) => void; + }; + +export interface DefaultControlState { + grow?: boolean; + width?: ControlWidth; +} + +export type ControlApiRegistration = Omit< + ControlApi, + 'uuid' | 'parentApi' | 'type' | 'unsavedChanges' | 'resetUnsavedChanges' +>; + +export type ControlApiInitialization = + Omit< + ControlApiRegistration, + 'serializeState' | 'getTypeDisplayName' | 'clearSelections' + >; + +// TODO: Move this to the Control plugin's setup contract +export interface ControlFactory< + State extends DefaultControlState = DefaultControlState, + ControlApi extends DefaultControlApi = DefaultControlApi +> { + type: string; + getIconType: () => string; + getDisplayName: () => string; + buildControl: ( + initialState: State, + buildApi: ( + apiRegistration: ControlApiRegistration, + comparators: StateComparators + ) => ControlApi, + uuid: string, + parentApi: ControlGroupApi + ) => { api: ControlApi; Component: React.FC<{}> }; +} + +export type ControlStateManager = { + [key in keyof Required]: BehaviorSubject; +}; + +export interface ControlPanelProps< + ApiType extends DefaultControlApi = DefaultControlApi, + PropsType extends {} = { css: SerializedStyles } +> { + Component: PanelCompatibleComponent; +} diff --git a/examples/controls_example/tsconfig.json b/examples/controls_example/tsconfig.json index 508a61e7020e0e..834ef6cebe5532 100644 --- a/examples/controls_example/tsconfig.json +++ b/examples/controls_example/tsconfig.json @@ -18,9 +18,21 @@ "@kbn/data-plugin", "@kbn/controls-plugin", "@kbn/navigation-plugin", - "@kbn/shared-ux-page-kibana-template", "@kbn/embeddable-plugin", "@kbn/data-views-plugin", "@kbn/es-query", + "@kbn/presentation-containers", + "@kbn/presentation-publishing", + "@kbn/ui-actions-plugin", + "@kbn/i18n-react", + "@kbn/shared-ux-markdown", + "@kbn/i18n", + "@kbn/core-mount-utils-browser", + "@kbn/react-kibana-mount", + "@kbn/content-management-utils", + "@kbn/presentation-util-plugin", + "@kbn/ui-theme", + "@kbn/core-lifecycle-browser", + "@kbn/presentation-panel-plugin", ] } diff --git a/oas_docs/bundle.json b/oas_docs/bundle.json index cdd86729d7f8e5..1dfcdd50639b3c 100644 --- a/oas_docs/bundle.json +++ b/oas_docs/bundle.json @@ -499,8 +499,7 @@ "description": "Kibana's operational status. A minimal response is sent for unauthorized users." } } - }, - "description": "Get Kibana's current status." + } }, "503": { "content": { @@ -517,11 +516,10 @@ "description": "Kibana's operational status. A minimal response is sent for unauthorized users." } } - }, - "description": "Get Kibana's current status." + } } }, - "summary": "Get Kibana's current status.", + "summary": "Get Kibana's current status", "tags": [] } } diff --git a/package.json b/package.json index 4188137c88ce06..4949f98aca52b3 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "**/@types/node": "20.10.5", "**/@typescript-eslint/utils": "5.62.0", "**/chokidar": "^3.5.3", + "**/d3-scale/**/d3-color": "npm:@elastic/d3-color@2.0.1", "**/globule/minimatch": "^3.1.2", "**/hoist-non-react-statics": "^3.3.2", "**/isomorphic-fetch/node-fetch": "^2.6.7", @@ -103,10 +104,10 @@ "@elastic/apm-rum": "^5.16.0", "@elastic/apm-rum-core": "^5.21.0", "@elastic/apm-rum-react": "^2.0.2", - "@elastic/charts": "65.1.0", + "@elastic/charts": "65.2.0", "@elastic/datemath": "5.0.3", "@elastic/ecs": "^8.11.1", - "@elastic/elasticsearch": "^8.13.0", + "@elastic/elasticsearch": "^8.13.1", "@elastic/ems-client": "8.5.1", "@elastic/eui": "94.6.0", "@elastic/filesaver": "1.1.2", @@ -457,6 +458,7 @@ "@kbn/eso-plugin": "link:x-pack/test/encrypted_saved_objects_api_integration/plugins/api_consumer_plugin", "@kbn/esql-ast": "link:packages/kbn-esql-ast", "@kbn/esql-ast-inspector-plugin": "link:examples/esql_ast_inspector", + "@kbn/esql-datagrid": "link:src/plugins/esql_datagrid", "@kbn/esql-utils": "link:packages/kbn-esql-utils", "@kbn/esql-validation-autocomplete": "link:packages/kbn-esql-validation-autocomplete", "@kbn/esql-validation-example-plugin": "link:examples/esql_validation_example", @@ -541,6 +543,7 @@ "@kbn/interactive-setup-plugin": "link:src/plugins/interactive_setup", "@kbn/interactive-setup-test-endpoints-plugin": "link:test/interactive_setup_api_integration/plugins/test_endpoints", "@kbn/interpreter": "link:packages/kbn-interpreter", + "@kbn/investigate-plugin": "link:x-pack/plugins/observability_solution/investigate", "@kbn/io-ts-utils": "link:packages/kbn-io-ts-utils", "@kbn/ipynb": "link:packages/kbn-ipynb", "@kbn/kbn-health-gateway-status-plugin": "link:test/health_gateway/plugins/status", @@ -886,6 +889,7 @@ "@kbn/unified-histogram-plugin": "link:src/plugins/unified_histogram", "@kbn/unified-search-plugin": "link:src/plugins/unified_search", "@kbn/unsaved-changes-badge": "link:packages/kbn-unsaved-changes-badge", + "@kbn/unsaved-changes-prompt": "link:packages/kbn-unsaved-changes-prompt", "@kbn/upgrade-assistant-plugin": "link:x-pack/plugins/upgrade_assistant", "@kbn/uptime-plugin": "link:x-pack/plugins/observability_solution/uptime", "@kbn/url-drilldown-plugin": "link:x-pack/plugins/drilldowns/url_drilldown", @@ -1009,7 +1013,7 @@ "deepmerge": "^4.2.2", "del": "^6.1.0", "diff": "^5.1.0", - "elastic-apm-node": "^4.5.4", + "elastic-apm-node": "^4.6.0", "email-addresses": "^5.0.0", "eventsource-parser": "^1.1.1", "execa": "^5.1.1", @@ -1029,6 +1033,7 @@ "getopts": "^2.2.5", "getos": "^3.1.0", "globby": "^11.1.0", + "google-auth-library": "^9.10.0", "gpt-tokenizer": "^2.1.2", "handlebars": "4.7.8", "he": "^1.2.0", diff --git a/packages/content-management/table_list_view_table/src/components/index.ts b/packages/content-management/table_list_view_table/src/components/index.ts index a4a09a5e6bbc6d..0448fb90ecb4b2 100644 --- a/packages/content-management/table_list_view_table/src/components/index.ts +++ b/packages/content-management/table_list_view_table/src/components/index.ts @@ -14,4 +14,4 @@ export { ItemDetails } from './item_details'; export { TableSortSelect } from './table_sort_select'; export { TagFilterPanel } from './tag_filter_panel'; -export type { SortColumnField } from './table_sort_select'; +export { type SortColumnField, getInitialSorting, saveSorting } from './table_sort_select'; diff --git a/packages/content-management/table_list_view_table/src/components/table_sort_select.tsx b/packages/content-management/table_list_view_table/src/components/table_sort_select.tsx index 9140c8ac3bc327..c9e06a29e9c8c8 100644 --- a/packages/content-management/table_list_view_table/src/components/table_sort_select.tsx +++ b/packages/content-management/table_list_view_table/src/components/table_sort_select.tsx @@ -177,3 +177,40 @@ export function TableSortSelect({ tableSort, hasUpdatedAtMetadata, onChange }: P ); } + +const sortStorageKey = (tableId: string) => `tableSort:${tableId}`; +export function getInitialSorting(tableId: string): { + isDefault: boolean; + tableSort: { + field: SortColumnField; + direction: Direction; + }; +} { + try { + const storedSorting = localStorage.getItem(sortStorageKey(tableId)); + if (storedSorting) { + const tableSort = JSON.parse(storedSorting); + return { isDefault: false, tableSort }; + } + } catch (e) { + // ignore + } + + return { + isDefault: true, + tableSort: { + field: 'attributes.title' as const, + direction: 'asc', + }, + }; +} +export function saveSorting( + tableId: string, + tableSort: { field: SortColumnField; direction: Direction } +) { + try { + localStorage.setItem(sortStorageKey(tableId), JSON.stringify(tableSort)); + } catch (e) { + /* empty */ + } +} diff --git a/packages/content-management/table_list_view_table/src/reducer.tsx b/packages/content-management/table_list_view_table/src/reducer.tsx index e96f8fc394347d..b4cf3691f9d759 100644 --- a/packages/content-management/table_list_view_table/src/reducer.tsx +++ b/packages/content-management/table_list_view_table/src/reducer.tsx @@ -11,8 +11,6 @@ import type { State } from './table_list_view_table'; import type { Action } from './actions'; export function getReducer() { - let sortColumnChanged = false; - return (state: State, action: Action): State => { switch (action.type) { case 'onFetchItems': { @@ -35,7 +33,7 @@ export function getReducer() { // Only change the table sort if it hasn't been changed already. // For example if its state comes from the URL, we don't want to override it here. - if (hasUpdatedAtMetadata && !sortColumnChanged) { + if (hasUpdatedAtMetadata && !state.sortColumnChanged) { tableSort = { field: 'updatedAt' as const, direction: 'desc' as const, @@ -89,10 +87,6 @@ export function getReducer() { }; } case 'onTableChange': { - if (action.data.sort) { - sortColumnChanged = true; - } - const tableSort = action.data.sort ?? state.tableSort; const pageIndex = action.data.page?.pageIndex ?? state.pagination.pageIndex; const pageSize = action.data.page?.pageSize ?? state.pagination.pageSize; @@ -109,6 +103,7 @@ export function getReducer() { }, tableSort, tableFilter, + sortColumnChanged: state.sortColumnChanged || Boolean(action.data.sort), }; } case 'showConfirmDeleteItemsModal': { diff --git a/packages/content-management/table_list_view_table/src/table_list_view.test.tsx b/packages/content-management/table_list_view_table/src/table_list_view.test.tsx index ce7ed6aa0bf809..c8747477994801 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view.test.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view.test.tsx @@ -72,6 +72,10 @@ describe('TableListView', () => { jest.useFakeTimers({ legacyFakeTimers: true }); }); + beforeEach(() => { + localStorage.clear(); + }); + afterAll(() => { jest.useRealTimers(); }); @@ -506,7 +510,7 @@ describe('TableListView', () => { ]); }); - test('filter select should change the sort order', async () => { + test('filter select should change the sort order and remember the order', async () => { let testBed: TestBed; await act(async () => { @@ -515,7 +519,7 @@ describe('TableListView', () => { }); }); - const { component, table, find } = testBed!; + let { component, table, find } = testBed!; const { openSortSelect } = getActions(testBed!); component.update(); @@ -544,6 +548,26 @@ describe('TableListView', () => { ['z-foo', twoDaysAgoToString], ['a-foo', yesterdayToString], ]); + + expect(localStorage.getItem('tableSort:test')).toBe( + '{"field":"attributes.title","direction":"desc"}' + ); + + component.unmount(); + await act(async () => { + testBed = await setupColumnSorting({ + findItems: jest.fn().mockResolvedValue({ total: hits.length, hits }), + }); + }); + + ({ component, table, find } = testBed!); + component.update(); + ({ tableCellsValues } = table.getMetaData('itemsInMemTable')); + + expect(tableCellsValues).toEqual([ + ['z-foo', twoDaysAgoToString], + ['a-foo', yesterdayToString], + ]); }); test('should update the select option when toggling the column header', async () => { diff --git a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx index 3c5051850cdd37..1053123e80191e 100644 --- a/packages/content-management/table_list_view_table/src/table_list_view_table.tsx +++ b/packages/content-management/table_list_view_table/src/table_list_view_table.tsx @@ -43,7 +43,7 @@ import { import { useServices } from './services'; import type { SavedObjectsFindOptionsReference } from './services'; import { getReducer } from './reducer'; -import type { SortColumnField } from './components'; +import { type SortColumnField, getInitialSorting, saveSorting } from './components'; import { useTags } from './use_tags'; import { useInRouterContext, useUrlState } from './use_url_state'; import { RowActions, TableItemsRowActions } from './types'; @@ -144,6 +144,7 @@ export interface State({ return getReducer(); }, []); - const initialState = useMemo>( - () => ({ + const initialState = useMemo>(() => { + const initialSort = getInitialSorting(entityName); + return { items: [], hasNoItems: undefined, totalItems: 0, @@ -373,16 +375,13 @@ function TableListViewTableComp({ pageSize: initialPageSize, pageSizeOptions: uniq([10, 20, 50, initialPageSize]).sort(), }, - tableSort: { - field: 'attributes.title' as const, - direction: 'asc', - }, + tableSort: initialSort.tableSort, + sortColumnChanged: !initialSort.isDefault, tableFilter: { createdBy: [], }, - }), - [initialPageSize] - ); + }; + }, [initialPageSize, entityName]); const [state, dispatch] = useReducer(reducer, initialState); @@ -597,7 +596,7 @@ function TableListViewTableComp({ ), sortable: true, - width: '150px', + width: '120px', }); } @@ -660,7 +659,7 @@ function TableListViewTableComp({ name: i18n.translate('contentManagement.tableList.listing.table.actionTitle', { defaultMessage: 'Actions', }), - width: '100px', + width: `${32 * actions.length}px`, actions, }); } @@ -795,14 +794,18 @@ function TableListViewTableComp({ const onSortChange = useCallback( (field: SortColumnField, direction: Direction) => { + const sort = { + field, + direction, + }; + // persist the sorting changes caused by explicit user's interaction + saveSorting(entityName, sort); + updateTableSortFilterAndPagination({ - sort: { - field, - direction, - }, + sort, }); }, - [updateTableSortFilterAndPagination] + [entityName, updateTableSortFilterAndPagination] ); const onFilterChange = useCallback( @@ -838,6 +841,9 @@ function TableListViewTableComp({ field: fieldSerialized as SortColumnField, direction: criteria.sort.direction, }; + + // persist the sorting changes caused by explicit user's interaction + saveSorting(entityName, data.sort); } data.page = { @@ -847,7 +853,7 @@ function TableListViewTableComp({ updateTableSortFilterAndPagination(data); }, - [updateTableSortFilterAndPagination] + [updateTableSortFilterAndPagination, entityName] ); const deleteSelectedItems = useCallback(async () => { diff --git a/packages/core/application/core-application-browser-internal/src/ui/app_container.tsx b/packages/core/application/core-application-browser-internal/src/ui/app_container.tsx index a6b85e017e24a0..0bb763ed9d57f5 100644 --- a/packages/core/application/core-application-browser-internal/src/ui/app_container.tsx +++ b/packages/core/application/core-application-browser-internal/src/ui/app_container.tsx @@ -134,7 +134,7 @@ const AppLoadingPlaceholder: FC<{ showPlainSpinner: boolean }> = ({ showPlainSpi size={'xxl'} className="appContainer__loading" data-test-subj="appContainer-loadingSpinner" - aria-label={i18n.translate('core.application.appContainer.loadingAriaLabel', { + aria-label={i18n.translate('core.application.appContainer.plainSpinner.loadingAriaLabel', { defaultMessage: 'Loading application', })} /> diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts index b9cca3027f2fca..e8dd64aab41b03 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.test.ts @@ -1002,32 +1002,4 @@ describe('solution navigations', () => { expect(activeSolution).toEqual(solution1); } }); - - it('should change the active solution if no node match the current Location', async () => { - const { projectNavigation, navLinksService, application } = setup({ - locationPathName: '/app/app3', // we are on app3 which only exists in solution3 - navLinkIds: ['app1', 'app2', 'app3'], - }); - - navLinksService.get.mockReturnValue({ url: '/app/app3', href: '/app/app3' } as any); - - const getActiveDefinition = () => - firstValueFrom(projectNavigation.getActiveSolutionNavDefinition$()); - - projectNavigation.updateSolutionNavigations({ solution1, solution2, solution3 }); - - { - const definition = await getActiveDefinition(); - expect(definition).toBe(null); // No active solution id yet - } - - // Change to solution 2, but we are still on '/app/app3' which only exists in solution3 - projectNavigation.changeActiveSolutionNavigation('solution2'); - - { - const definition = await getActiveDefinition(); - expect(definition?.id).toBe('solution3'); // The solution3 was activated as it matches the "/app/app3" location - expect(application.navigateToUrl).toHaveBeenCalled(); // Redirect - } - }); }); diff --git a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts index 892ae29ed68626..0a1292be9b3f13 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts +++ b/packages/core/chrome/core-chrome-browser-internal/src/project_navigation/project_navigation_service.ts @@ -32,7 +32,6 @@ import { of, type Observable, type Subscription, - take, } from 'rxjs'; import { type Location, createLocation } from 'history'; import deepEqual from 'react-fast-compare'; @@ -224,22 +223,9 @@ export class ProjectNavigationService { this.navigationTree$.next(navigationTree); this.navigationTreeUi$.next(navigationTreeUI); this.projectNavigationNavTreeFlattened = flattenNav(navigationTree); + this.updateActiveProjectNavigationNodes(); - // Verify if the current location is part of the navigation tree of - // the initiated solution. If not, we need to find the correct solution - const activeNodes = this.updateActiveProjectNavigationNodes(); - let willChangeSolution = false; - - if (activeNodes.length === 0) { - const solutionForCurrentLocation = this.findSolutionForCurrentLocation(); - if (solutionForCurrentLocation) { - willChangeSolution = true; - this.goToSolutionHome(solutionForCurrentLocation); - this.changeActiveSolutionNavigation(solutionForCurrentLocation); - } - } - - if (!initialised && !willChangeSolution) { + if (!initialised) { this.activeSolutionNavDefinitionId$.next(id); initialised = true; } @@ -318,48 +304,6 @@ export class ProjectNavigationService { }); } - /** - * When we are in stateful Kibana with multiple solution navigations, it is possible that a user - * lands on a page that does not belong to the current active solution navigation. In this case, - * we need to find the correct solution navigation based on the current location and switch to it. - */ - private findSolutionForCurrentLocation(): string | null { - if (Object.keys(this.solutionNavDefinitions$.getValue()).length === 0) return null; - - let idFound: string | null = null; - - combineLatest([this.solutionNavDefinitions$, this.location$]) - .pipe(take(1)) - .subscribe(([definitions, location]) => { - Object.entries(definitions).forEach(([id, definition]) => { - if (idFound) return; - - combineLatest([definition.navigationTree$, this.deepLinksMap$, this.cloudLinks$]) - .pipe( - take(1), - map(([def, deepLinksMap, cloudLinks]) => - parseNavigationTree(def, { - deepLinks: deepLinksMap, - cloudLinks, - }) - ) - ) - .subscribe(({ navigationTree }) => { - const maybeActiveNodes = this.findActiveNodes({ - location, - flattendTree: flattenNav(navigationTree), - }); - - if (maybeActiveNodes.length > 0) { - idFound = id; - } - }); - }); - }); - - return idFound; - } - private setSideNavComponent(component: SideNavComponent | null) { this.customProjectSideNavComponent$.next({ current: component }); } @@ -400,24 +344,6 @@ export class ProjectNavigationService { this.projectHome$.next(homeHref); } - private goToSolutionHome(id: string) { - const definitions = this.solutionNavDefinitions$.getValue(); - const definition = definitions[id]; - if (!definition) { - throw new Error(`No solution navigation definition found for id ${id}`); - } - - // Navigate to the new home page if it's defined - const link = this.navLinksService?.get(definition.homePage ?? 'undefined'); - if (!link) { - throw new Error(`No home page defined for solution navigation ${definition.id}`); - } - - const location = createLocation(link.url); - this.location$.next(location); - this.application?.navigateToUrl(link.url); - } - private changeActiveSolutionNavigation(id: string | null) { if (this.nextSolutionNavDefinitionId$.getValue() === id) return; this.nextSolutionNavDefinitionId$.next(id); diff --git a/packages/core/chrome/core-chrome-browser/index.ts b/packages/core/chrome/core-chrome-browser/index.ts index 27c20f502bc060..32b889ea7979df 100644 --- a/packages/core/chrome/core-chrome-browser/index.ts +++ b/packages/core/chrome/core-chrome-browser/index.ts @@ -57,4 +57,5 @@ export type { SolutionNavigationDefinition, SolutionNavigationDefinitions, EuiSideNavItemTypeEnhanced, + RenderAs, } from './src'; diff --git a/packages/core/chrome/core-chrome-browser/src/index.ts b/packages/core/chrome/core-chrome-browser/src/index.ts index a287499cd73ff9..d3ac70d6520b8a 100644 --- a/packages/core/chrome/core-chrome-browser/src/index.ts +++ b/packages/core/chrome/core-chrome-browser/src/index.ts @@ -56,4 +56,5 @@ export type { SolutionNavigationDefinition, SolutionNavigationDefinitions, EuiSideNavItemTypeEnhanced, + RenderAs, } from './project_navigation'; diff --git a/packages/core/http/core-http-server/src/router/route.ts b/packages/core/http/core-http-server/src/router/route.ts index bb3e59cfcd00bc..28f889d5dbdefe 100644 --- a/packages/core/http/core-http-server/src/router/route.ts +++ b/packages/core/http/core-http-server/src/router/route.ts @@ -160,7 +160,33 @@ export interface RouteConfigOptions { idleSocket?: number; }; - /** A short, human-friendly description of this endpoint */ + /** + * Short summary of this route. Required for all routes used in OAS documentation. + * + * @example + * ```ts + * router.get({ + * path: '/api/foo/{id}', + * access: 'public', + * summary: `Get foo resources for an ID`, + * }) + * ``` + */ + summary?: string; + + /** + * Optional API description, which supports [CommonMark](https://spec.commonmark.org) markdown formatting + * + * @example + * ```ts + * router.get({ + * path: '/api/foo/{id}', + * access: 'public', + * summary: `Get foo resources for an ID`, + * description: `Foo resources require **X** and **Y** `read` permissions to access.`, + * }) + * ``` + */ description?: string; } diff --git a/packages/core/http/core-http-server/src/versioning/types.ts b/packages/core/http/core-http-server/src/versioning/types.ts index 8495f05210a36b..af3173691415f9 100644 --- a/packages/core/http/core-http-server/src/versioning/types.ts +++ b/packages/core/http/core-http-server/src/versioning/types.ts @@ -55,14 +55,29 @@ export type VersionedRouteConfig = Omit< enableQueryVersion?: boolean; /** - * Human-friendly description of this route, should be usable for documentation + * Short summary of this route. Required for all routes used in OAS documentation. * * @example * ```ts * router.get({ * path: '/api/foo/{id}', * access: 'public', - * description: `Retrieve foo resources given an ID. To retrieve a list of IDs use the GET /api/foo API.`, + * summary: `Get foo resources for an ID`, + * }) + * ``` + */ + summary?: string; + + /** + * Optional API description, which supports [CommonMark](https://spec.commonmark.org) markdown formatting + * + * @example + * ```ts + * router.get({ + * path: '/api/foo/{id}', + * access: 'public', + * summary: `Get foo resources for an ID`, + * description: `Foo resources require **X** and **Y** `read` permissions to access.`, * }) * ``` */ diff --git a/packages/core/status/core-status-server-internal/src/legacy_status.ts b/packages/core/status/core-status-server-internal/src/legacy_status.ts index f154374d5470ec..ac692b2b4876db 100644 --- a/packages/core/status/core-status-server-internal/src/legacy_status.ts +++ b/packages/core/status/core-status-server-internal/src/legacy_status.ts @@ -106,7 +106,7 @@ const STATUS_LEVEL_LEGACY_ATTRS = deepFreeze>({ [ServiceStatusLevels.critical.toString()]: { id: 'red', state: 'red', - title: i18n.translate('core.status.redTitle', { + title: i18n.translate('core.status.critical.redTitle', { defaultMessage: 'Red', }), icon: 'danger', @@ -116,7 +116,7 @@ const STATUS_LEVEL_LEGACY_ATTRS = deepFreeze>({ [ServiceStatusLevels.unavailable.toString()]: { id: 'red', state: 'red', - title: i18n.translate('core.status.redTitle', { + title: i18n.translate('core.status.unavailable.redTitle', { defaultMessage: 'Red', }), icon: 'danger', @@ -126,7 +126,7 @@ const STATUS_LEVEL_LEGACY_ATTRS = deepFreeze>({ [ServiceStatusLevels.degraded.toString()]: { id: 'yellow', state: 'yellow', - title: i18n.translate('core.status.yellowTitle', { + title: i18n.translate('core.status.degraded.yellowTitle', { defaultMessage: 'Yellow', }), icon: 'warning', @@ -136,7 +136,7 @@ const STATUS_LEVEL_LEGACY_ATTRS = deepFreeze>({ [ServiceStatusLevels.available.toString()]: { id: 'green', state: 'green', - title: i18n.translate('core.status.greenTitle', { + title: i18n.translate('core.status.available.greenTitle', { defaultMessage: 'Green', }), icon: 'success', diff --git a/packages/core/status/core-status-server-internal/src/routes/status.ts b/packages/core/status/core-status-server-internal/src/routes/status.ts index 5557a4d60aaeff..4b243240321d71 100644 --- a/packages/core/status/core-status-server-internal/src/routes/status.ts +++ b/packages/core/status/core-status-server-internal/src/routes/status.ts @@ -88,7 +88,7 @@ export const registerStatusRoute = ({ // ROUTE_TAG_ACCEPT_JWT from '@kbn/security-plugin/server' that cannot be imported here directly. tags: ['api', 'security:acceptJWT'], access: 'public', // needs to be public to allow access from "system" users like k8s readiness probes. - description: `Get Kibana's current status.`, + summary: `Get Kibana's current status`, }, validate: { request: { diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/index.ts b/packages/kbn-alerts-ui-shared/src/rule_form/index.ts index dbdcd4efa464fb..3751b1848d23e3 100644 --- a/packages/kbn-alerts-ui-shared/src/rule_form/index.ts +++ b/packages/kbn-alerts-ui-shared/src/rule_form/index.ts @@ -7,5 +7,7 @@ */ export * from './rule_definition'; +export * from './rule_actions'; +export * from './rule_details'; export * from './utils'; export * from './types'; diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/types.ts b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/index.ts similarity index 86% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/types.ts rename to packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/index.ts index 60fd512c3cf5ba..bd84316ee7e2d4 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/types.ts +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/index.ts @@ -6,6 +6,4 @@ * Side Public License, v 1. */ -export interface InlinableRefNode { - $ref?: string; -} +export * from './rule_actions'; diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.test.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.test.tsx new file mode 100644 index 00000000000000..19f1482072fd93 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.test.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { render, screen, fireEvent } from '@testing-library/react'; +import { RuleActions } from './rule_actions'; + +const mockOnChange = jest.fn(); + +describe('Rule actions', () => { + afterEach(() => { + jest.resetAllMocks(); + }); + + test('Renders correctly', () => { + render(); + + expect(screen.getByTestId('ruleActions')).toBeInTheDocument(); + }); + + test('Calls onChange when button is click', () => { + render(); + + fireEvent.click(screen.getByTestId('ruleActionsAddActionButton')); + + expect(mockOnChange).toHaveBeenCalled(); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.tsx new file mode 100644 index 00000000000000..f49cd85bbe12f7 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_actions/rule_actions.tsx @@ -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 React from 'react'; +import { EuiButton } from '@elastic/eui'; +import { ADD_ACTION_TEXT } from '../translations'; + +export interface RuleActionsProps { + onClick: () => void; +} + +export const RuleActions = (props: RuleActionsProps) => { + const { onClick } = props; + return ( +
+ + {ADD_ACTION_TEXT} + +
+ ); +}; diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/index.ts b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/index.ts new file mode 100644 index 00000000000000..a38da3214a07d1 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 * from './rule_details'; diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.test.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.test.tsx new file mode 100644 index 00000000000000..58b327af94b477 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.test.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { fireEvent, render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { RuleDetails } from './rule_details'; + +const mockOnChange = jest.fn(); + +describe('RuleDetails', () => { + test('Renders correctly', () => { + render( + + ); + + expect(screen.getByTestId('ruleDetails')).toBeInTheDocument(); + }); + + test('Should allow name to be changed', () => { + render( + + ); + + fireEvent.change(screen.getByTestId('ruleDetailsNameInput'), { target: { value: 'hello' } }); + expect(mockOnChange).toHaveBeenCalledWith('name', 'hello'); + }); + + test('Should allow tags to be changed', () => { + render( + + ); + + userEvent.type(screen.getByTestId('comboBoxInput'), 'tag{enter}'); + expect(mockOnChange).toHaveBeenCalledWith('tags', ['tag']); + }); + + test('Should display error', () => { + render( + + ); + + expect(screen.getByText('name is invalid')).toBeInTheDocument(); + expect(screen.getByText('tags is invalid')).toBeInTheDocument(); + }); +}); diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.tsx b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.tsx new file mode 100644 index 00000000000000..a2cd9b6b02bcf7 --- /dev/null +++ b/packages/kbn-alerts-ui-shared/src/rule_form/rule_details/rule_details.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useCallback, useMemo } from 'react'; +import { + EuiDescribedFormGroup, + EuiFormRow, + EuiFieldText, + EuiComboBox, + EuiComboBoxOptionOption, + EuiText, +} from '@elastic/eui'; +import type { SanitizedRule, RuleTypeParams } from '@kbn/alerting-types'; +import type { RuleFormErrors } from '../types'; +import { + RULE_DETAILS_TITLE, + RULE_DETAILS_DESCRIPTION, + RULE_NAME_INPUT_TITLE, + RULE_TAG_INPUT_TITLE, +} from '../translations'; + +export interface RuleDetailsProps { + formValues: { + tags?: SanitizedRule['tags']; + name: SanitizedRule['name']; + }; + errors?: RuleFormErrors; + onChange: (property: string, value: unknown) => void; +} + +export const RuleDetails = (props: RuleDetailsProps) => { + const { formValues, errors = {}, onChange } = props; + + const { tags = [], name } = formValues; + + const tagsOptions = useMemo(() => { + return tags.map((tag: string) => ({ label: tag })); + }, [tags]); + + const onNameChange = useCallback( + (e: React.ChangeEvent) => { + onChange('name', e.target.value); + }, + [onChange] + ); + + const onAddTag = useCallback( + (searchValue: string) => { + onChange('tags', tags.concat([searchValue])); + }, + [onChange, tags] + ); + + const onSetTag = useCallback( + (options: Array>) => { + onChange( + 'tags', + options.map((selectedOption) => selectedOption.label) + ); + }, + [onChange] + ); + + const onBlur = useCallback(() => { + if (!tags) { + onChange('tags', []); + } + }, [onChange, tags]); + + return ( + {RULE_DETAILS_TITLE}} + description={ + +

{RULE_DETAILS_DESCRIPTION}

+
+ } + data-test-subj="ruleDetails" + > + 0} + error={errors.name} + > + + + 0} + error={errors.tags} + > + + +
+ ); +}; diff --git a/packages/kbn-alerts-ui-shared/src/rule_form/translations.ts b/packages/kbn-alerts-ui-shared/src/rule_form/translations.ts index 4ae1cbfd206c45..d9c86b60e7d9f7 100644 --- a/packages/kbn-alerts-ui-shared/src/rule_form/translations.ts +++ b/packages/kbn-alerts-ui-shared/src/rule_form/translations.ts @@ -194,3 +194,32 @@ export const INTERVAL_WARNING_TEXT = (minimum: string) => 'Intervals less than {minimum} are not recommended due to performance considerations.', values: { minimum }, }); + +export const ADD_ACTION_TEXT = i18n.translate('alertsUIShared.ruleForm.ruleActions.addActionText', { + defaultMessage: 'Add action', +}); + +export const RULE_DETAILS_TITLE = i18n.translate('alertsUIShared.ruleForm.ruleDetails.title', { + defaultMessage: 'Rule name and tags', +}); + +export const RULE_DETAILS_DESCRIPTION = i18n.translate( + 'alertsUIShared.ruleForm.ruleDetails.description', + { + defaultMessage: 'Define a name and tags for your rule.', + } +); + +export const RULE_NAME_INPUT_TITLE = i18n.translate( + 'alertsUIShared.ruleForm.ruleDetails.ruleNameInputTitle', + { + defaultMessage: 'Rule name', + } +); + +export const RULE_TAG_INPUT_TITLE = i18n.translate( + 'alertsUIShared.ruleForm.ruleDetails.ruleTagsInputTitle', + { + defaultMessage: 'Tags', + } +); diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts index 216397f1e1b400..250375623dfc3c 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/apm_error.ts @@ -8,7 +8,7 @@ import { ApmFields } from './apm_fields'; import { Serializable } from '../serializable'; -import { generateLongId, generateShortId } from '../utils/generate_id'; +import { generateLongIdWithSeed, generateShortId, generateLongId } from '../utils/generate_id'; export class ApmError extends Serializable { constructor(fields: ApmFields) { @@ -21,10 +21,13 @@ export class ApmError extends Serializable { } serialize() { + const errorMessage = + this.fields['error.grouping_name'] || this.fields['error.exception']?.[0]?.message; + const [data] = super.serialize(); - data['error.grouping_key'] = generateLongId( - this.fields['error.grouping_name'] || this.fields['error.exception']?.[0]?.message - ); + data['error.grouping_key'] = errorMessage + ? generateLongIdWithSeed(errorMessage) + : generateLongId(); return [data]; } diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts index b0ea0aea4663e1..205cc7d07f14f3 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts @@ -11,7 +11,7 @@ import { Span } from './span'; import { Transaction } from './transaction'; import { Event } from './event'; import { ApmApplicationMetricFields, ApmFields, GeoLocation, SpanParams } from './apm_fields'; -import { generateLongId } from '../utils/generate_id'; +import { generateLongIdWithSeed, generateLongId } from '../utils/generate_id'; import { Metricset } from './metricset'; import { ApmError } from './apm_error'; @@ -259,7 +259,7 @@ export class MobileDevice extends Entity { return new ApmError({ ...this.fields, 'error.type': 'crash', - 'error.id': generateLongId(message), + 'error.id': generateLongIdWithSeed(message), 'error.exception': [{ message, ...{ type: 'crash' } }], 'error.grouping_name': groupingName || message, }); diff --git a/packages/kbn-apm-synthtrace-client/src/lib/infra/docker_container.ts b/packages/kbn-apm-synthtrace-client/src/lib/infra/docker_container.ts index 03f72ee61bc065..b0dab3da9dabb9 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/infra/docker_container.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/infra/docker_container.ts @@ -21,6 +21,10 @@ export class DockerContainer extends Entity { ...this.fields, 'docker.cpu.total.pct': 25, 'docker.memory.usage.pct': 20, + 'docker.network.inbound.bytes': 100, + 'docker.network.outbound.bytes': 200, + 'docker.diskio.read.ops': 10, + 'docker.diskio.write.ops': 20, }); } } @@ -28,6 +32,10 @@ export class DockerContainer extends Entity { export interface DockerContainerMetricsDocument extends DockerContainerDocument { 'docker.cpu.total.pct': number; 'docker.memory.usage.pct': number; + 'docker.network.inbound.bytes': number; + 'docker.network.outbound.bytes': number; + 'docker.diskio.read.ops': number; + 'docker.diskio.write.ops': number; } class DockerContainerMetrics extends Serializable {} diff --git a/packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts b/packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts index c65c2843ddd3bb..6815b79ef5cf85 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/utils/generate_id.ts @@ -7,16 +7,33 @@ */ let seq = 0; +const pid = String(process.pid); -function generateId(seed?: string, length: number = 32) { - const str = seed ?? String(seq++); - return str.padStart(length, '0'); +const LONG_ID_LENGTH = 32; +const SHORT_ID_LENGTH = 16; + +function generateId(length: number = LONG_ID_LENGTH) { + const id = String(seq++); + const generatedId = pid + id.padStart(length - pid.length, '0'); + if (generatedId.length > length) { + throw new Error(`generated id is longer than ${length} characters: ${generatedId.length}`); + } + + return generatedId; +} + +function generateIdWithSeed(seed: string, length: number = LONG_ID_LENGTH) { + return seed?.padStart(length, '0'); +} + +export function generateShortId() { + return generateId(SHORT_ID_LENGTH); } -export function generateShortId(seed?: string) { - return generateId(seed, 16); +export function generateLongId() { + return generateId(LONG_ID_LENGTH); } -export function generateLongId(seed?: string) { - return generateId(seed, 32); +export function generateLongIdWithSeed(seed: string) { + return generateIdWithSeed(seed, LONG_ID_LENGTH); } diff --git a/packages/kbn-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts b/packages/kbn-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts index 5c121161637219..df512cc6a8a4f0 100644 --- a/packages/kbn-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts +++ b/packages/kbn-apm-synthtrace/src/test/scenarios/01_simple_trace.test.ts @@ -48,7 +48,24 @@ describe('simple trace', () => { // TODO this is not entirely factual, since id's are generated of a global sequence number it('generates the same data every time', () => { - expect(events).toMatchSnapshot(); + expect(events).toMatchSnapshot( + events.map((event) => { + const matchers: Record = {}; + if (event['transaction.id']) { + matchers['transaction.id'] = expect.any(String); + } + if (event['trace.id']) { + matchers['trace.id'] = expect.any(String); + } + if (event['span.id']) { + matchers['span.id'] = expect.any(String); + } + if (event['parent.id']) { + matchers['parent.id'] = expect.any(String); + } + return matchers; + }) + ); }); it('generates 15 transaction events', () => { @@ -83,9 +100,9 @@ describe('simple trace', () => { 'service.name': 'opbeans-java', 'service.node.name': 'instance-1', 'timestamp.us': 1609459200000000, - 'trace.id': '00000000000000000000000000000241', + 'trace.id': expect.stringContaining('00000000000000000000000241'), 'transaction.duration.us': 1000000, - 'transaction.id': '0000000000000240', + 'transaction.id': expect.stringContaining('0000000240'), 'transaction.name': 'GET /api/product/list', 'transaction.type': 'request', 'transaction.sampled': true, @@ -95,26 +112,28 @@ describe('simple trace', () => { it('outputs span events', () => { const [, span] = events; - expect(span).toEqual({ - '@timestamp': 1609459200050, - 'agent.name': 'java', - 'container.id': 'instance-1', - 'event.outcome': 'success', - 'host.name': 'instance-1', - 'parent.id': '0000000000000300', - 'processor.event': 'span', - 'processor.name': 'transaction', - 'service.environment': 'production', - 'service.name': 'opbeans-java', - 'service.node.name': 'instance-1', - 'span.duration.us': 900000, - 'span.id': '0000000000000302', - 'span.name': 'GET apm-*/_search', - 'span.subtype': 'elasticsearch', - 'span.type': 'db', - 'timestamp.us': 1609459200050000, - 'trace.id': '00000000000000000000000000000301', - 'transaction.id': '0000000000000300', - }); + expect(span).toEqual( + expect.objectContaining({ + '@timestamp': 1609459200050, + 'agent.name': 'java', + 'container.id': 'instance-1', + 'event.outcome': 'success', + 'host.name': 'instance-1', + 'parent.id': expect.stringContaining('0000000300'), + 'processor.event': 'span', + 'processor.name': 'transaction', + 'service.environment': 'production', + 'service.name': 'opbeans-java', + 'service.node.name': 'instance-1', + 'span.duration.us': 900000, + 'span.id': expect.stringContaining('0000000302'), + 'span.name': 'GET apm-*/_search', + 'span.subtype': 'elasticsearch', + 'span.type': 'db', + 'timestamp.us': 1609459200050000, + 'trace.id': expect.stringContaining('00000000000000000000000301'), + 'transaction.id': expect.stringContaining('0000000300'), + }) + ); }); }); diff --git a/packages/kbn-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap b/packages/kbn-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap index 15883c2711f431..f318942f397b36 100644 --- a/packages/kbn-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap +++ b/packages/kbn-apm-synthtrace/src/test/scenarios/__snapshots__/01_simple_trace.test.ts.snap @@ -14,9 +14,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459200000000, - "trace.id": "00000000000000000000000000000001", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000000", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -27,20 +27,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000000", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000002", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459200050000, - "trace.id": "00000000000000000000000000000001", - "transaction.id": "0000000000000000", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459200000, @@ -95,9 +95,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459260000000, - "trace.id": "00000000000000000000000000000005", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000004", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -108,20 +108,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000004", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000006", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459260050000, - "trace.id": "00000000000000000000000000000005", - "transaction.id": "0000000000000004", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459260000, @@ -176,9 +176,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459320000000, - "trace.id": "00000000000000000000000000000009", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000008", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -189,20 +189,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000008", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000010", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459320050000, - "trace.id": "00000000000000000000000000000009", - "transaction.id": "0000000000000008", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459320000, @@ -257,9 +257,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459380000000, - "trace.id": "00000000000000000000000000000013", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000012", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -270,20 +270,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000012", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000014", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459380050000, - "trace.id": "00000000000000000000000000000013", - "transaction.id": "0000000000000012", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459380000, @@ -338,9 +338,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459440000000, - "trace.id": "00000000000000000000000000000017", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000016", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -351,20 +351,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000016", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000018", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459440050000, - "trace.id": "00000000000000000000000000000017", - "transaction.id": "0000000000000016", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459440000, @@ -419,9 +419,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459500000000, - "trace.id": "00000000000000000000000000000021", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000020", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -432,20 +432,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000020", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000022", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459500050000, - "trace.id": "00000000000000000000000000000021", - "transaction.id": "0000000000000020", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459500000, @@ -500,9 +500,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459560000000, - "trace.id": "00000000000000000000000000000025", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000024", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -513,20 +513,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000024", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000026", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459560050000, - "trace.id": "00000000000000000000000000000025", - "transaction.id": "0000000000000024", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459560000, @@ -581,9 +581,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459620000000, - "trace.id": "00000000000000000000000000000029", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000028", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -594,20 +594,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000028", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000030", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459620050000, - "trace.id": "00000000000000000000000000000029", - "transaction.id": "0000000000000028", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459620000, @@ -662,9 +662,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459680000000, - "trace.id": "00000000000000000000000000000033", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000032", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -675,20 +675,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000032", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000034", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459680050000, - "trace.id": "00000000000000000000000000000033", - "transaction.id": "0000000000000032", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459680000, @@ -743,9 +743,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459740000000, - "trace.id": "00000000000000000000000000000037", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000036", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -756,20 +756,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000036", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000038", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459740050000, - "trace.id": "00000000000000000000000000000037", - "transaction.id": "0000000000000036", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459740000, @@ -824,9 +824,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459800000000, - "trace.id": "00000000000000000000000000000041", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000040", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -837,20 +837,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000040", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000042", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459800050000, - "trace.id": "00000000000000000000000000000041", - "transaction.id": "0000000000000040", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459800000, @@ -905,9 +905,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459860000000, - "trace.id": "00000000000000000000000000000045", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000044", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -918,20 +918,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000044", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000046", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459860050000, - "trace.id": "00000000000000000000000000000045", - "transaction.id": "0000000000000044", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459860000, @@ -986,9 +986,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459920000000, - "trace.id": "00000000000000000000000000000049", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000048", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -999,20 +999,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000048", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000050", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459920050000, - "trace.id": "00000000000000000000000000000049", - "transaction.id": "0000000000000048", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459920000, @@ -1067,9 +1067,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609459980000000, - "trace.id": "00000000000000000000000000000053", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000052", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -1080,20 +1080,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000052", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000054", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609459980050000, - "trace.id": "00000000000000000000000000000053", - "transaction.id": "0000000000000052", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609459980000, @@ -1148,9 +1148,9 @@ Array [ "service.name": "opbeans-java", "service.node.name": "instance-1", "timestamp.us": 1609460040000000, - "trace.id": "00000000000000000000000000000057", + "trace.id": Any, "transaction.duration.us": 1000000, - "transaction.id": "0000000000000056", + "transaction.id": Any, "transaction.name": "GET /api/product/list", "transaction.sampled": true, "transaction.type": "request", @@ -1161,20 +1161,20 @@ Array [ "container.id": "instance-1", "event.outcome": "success", "host.name": "instance-1", - "parent.id": "0000000000000056", + "parent.id": Any, "processor.event": "span", "processor.name": "transaction", "service.environment": "production", "service.name": "opbeans-java", "service.node.name": "instance-1", "span.duration.us": 900000, - "span.id": "0000000000000058", + "span.id": Any, "span.name": "GET apm-*/_search", "span.subtype": "elasticsearch", "span.type": "db", "timestamp.us": 1609460040050000, - "trace.id": "00000000000000000000000000000057", - "transaction.id": "0000000000000056", + "trace.id": Any, + "transaction.id": Any, }, Object { "@timestamp": 1609460040000, diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index a599f9a2bf0b66..34895385bef9b3 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -859,6 +859,7 @@ export const getDocLinks = ({ kibanaBranch, buildFlavor }: GetDocLinkOptions): D performancePresets: `${FLEET_DOCS}es-output-settings.html#es-output-settings-performance-tuning-settings`, scalingKubernetesResourcesAndLimits: `${FLEET_DOCS}scaling-on-kubernetes.html#_specifying_resources_and_limits_in_agent_manifests`, roleAndPrivileges: `${FLEET_DOCS}fleet-roles-and-privileges.html`, + proxiesSettings: `${FLEET_DOCS}fleet-agent-proxy-support.html`, }, ecs: { guide: `${ELASTIC_WEBSITE_URL}guide/en/ecs/${ECS_VERSION}/index.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 567652df3123cc..554e26ccd76850 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -552,6 +552,7 @@ export interface DocLinks { performancePresets: string; scalingKubernetesResourcesAndLimits: string; roleAndPrivileges: string; + proxiesSettings: string; }>; readonly ecs: { readonly guide: string; diff --git a/packages/kbn-es-types/index.ts b/packages/kbn-es-types/index.ts index 9d4c31644437ba..0e78385d1792cf 100644 --- a/packages/kbn-es-types/index.ts +++ b/packages/kbn-es-types/index.ts @@ -20,7 +20,7 @@ export type { MaybeReadonlyArray, ESQLColumn, ESQLRow, - ESQLSearchReponse, + ESQLSearchResponse, ESQLSearchParams, SearchField, } from './src'; diff --git a/packages/kbn-es-types/src/index.ts b/packages/kbn-es-types/src/index.ts index 5e2a67316fc9b4..c5083f358aef2e 100644 --- a/packages/kbn-es-types/src/index.ts +++ b/packages/kbn-es-types/src/index.ts @@ -17,7 +17,7 @@ import { SearchHit, ESQLColumn, ESQLRow, - ESQLSearchReponse, + ESQLSearchResponse, ESQLSearchParams, ChangePointType, } from './search'; @@ -53,7 +53,7 @@ export type { SearchHit, ESQLColumn, ESQLRow, - ESQLSearchReponse, + ESQLSearchResponse, ESQLSearchParams, ChangePointType, }; diff --git a/packages/kbn-es-types/src/search.ts b/packages/kbn-es-types/src/search.ts index 9802be6d13cb5d..d6cae90f3c019c 100644 --- a/packages/kbn-es-types/src/search.ts +++ b/packages/kbn-es-types/src/search.ts @@ -673,7 +673,7 @@ export interface ESQLColumn { export type ESQLRow = unknown[]; -export interface ESQLSearchReponse { +export interface ESQLSearchResponse { columns: ESQLColumn[]; // In case of ?drop_null_columns in the query, then // all_columns will have available and empty fields diff --git a/packages/kbn-esql-utils/src/utils/run_query.ts b/packages/kbn-esql-utils/src/utils/run_query.ts index 0de03d778507d7..7c52365d76b989 100644 --- a/packages/kbn-esql-utils/src/utils/run_query.ts +++ b/packages/kbn-esql-utils/src/utils/run_query.ts @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import type { ISearchGeneric } from '@kbn/search-types'; import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; -import type { ESQLColumn, ESQLSearchReponse, ESQLSearchParams } from '@kbn/es-types'; +import type { ESQLColumn, ESQLSearchResponse, ESQLSearchParams } from '@kbn/es-types'; import { lastValueFrom } from 'rxjs'; export function formatESQLColumns(columns: ESQLColumn[]): DatatableColumn[] { @@ -49,7 +49,7 @@ export async function getESQLQueryColumnsRaw({ ) ); - return (response.rawResponse as unknown as ESQLSearchReponse).columns ?? []; + return (response.rawResponse as unknown as ESQLSearchResponse).columns ?? []; } catch (error) { throw new Error( i18n.translate('esqlUtils.columnsErrorMsg', { @@ -100,7 +100,7 @@ export async function getESQLResults({ filter?: unknown; dropNullColumns?: boolean; }): Promise<{ - response: ESQLSearchReponse; + response: ESQLSearchResponse; params: ESQLSearchParams; }> { const result = await lastValueFrom( @@ -119,7 +119,7 @@ export async function getESQLResults({ ) ); return { - response: result.rawResponse as unknown as ESQLSearchReponse, + response: result.rawResponse as unknown as ESQLSearchResponse, params: result.requestParams as unknown as ESQLSearchParams, }; } diff --git a/packages/kbn-esql-validation-autocomplete/package.json b/packages/kbn-esql-validation-autocomplete/package.json index 892ffd69996564..51d2e86a26fd9c 100644 --- a/packages/kbn-esql-validation-autocomplete/package.json +++ b/packages/kbn-esql-validation-autocomplete/package.json @@ -10,6 +10,7 @@ "make:defs": "ts-node --transpileOnly ./scripts/generate_function_definitions.ts", "postmake:defs": "yarn run lint:fix && yarn run i18n:fix", "lint:fix": "cd ../.. && node ./scripts/eslint --fix ./packages/kbn-esql-validation-autocomplete/src/**/*.ts", - "i18n:fix": "cd ../.. && node ./scripts/i18n_check.js --fix" + "i18n:fix": "cd ../.. && node ./scripts/i18n_check.js --fix", + "test:validation": "cd ../.. && yarn test:jest ./packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts" } } diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts index 65e2c8fe385260..f50bf584efb0ec 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_definitions.ts @@ -29,7 +29,9 @@ const evalSupportedCommandsAndOptions = { supportedOptions: ['by'], }; -const excludedFunctions = new Set(['bucket', 'case']); +// coalesce can be removed when a test is added for version type +// (https://github.com/elastic/elasticsearch/pull/109032#issuecomment-2150033350) +const excludedFunctions = new Set(['bucket', 'case', 'coalesce']); const extraFunctions: FunctionDefinition[] = [ { @@ -52,6 +54,48 @@ const extraFunctions: FunctionDefinition[] = [ `from index | eval type = case(languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot")`, ], }, + { + type: 'eval', + name: 'coalesce', + description: + 'Returns the first of its arguments that is not null. If all arguments are null, it returns `null`.', + alias: undefined, + signatures: supportedFieldTypes + .map((type) => [ + { + params: [ + { + name: 'first', + type, + optional: false, + }, + ], + returnType: type, + minParams: 1, + }, + { + params: [ + { + name: 'first', + type, + optional: false, + }, + { + name: 'rest', + type, + optional: true, + }, + ], + returnType: type, + minParams: 1, + }, + ]) + .flat(), + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['ROW a=null, b="b"\n| EVAL COALESCE(a, b)'], + }, ]; const elasticsearchToKibanaType = (elasticsearchType: string) => { @@ -214,40 +258,6 @@ const functionEnrichments: Record> }), }, // can be removed when https://github.com/elastic/elasticsearch/issues/108982 is complete - coalesce: { - signatures: supportedFieldTypes - .map((type) => [ - { - params: [ - { - name: 'first', - type, - optional: false, - }, - ], - returnType: type, - minParams: 1, - }, - { - params: [ - { - name: 'first', - type, - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: type, - minParams: 1, - }, - ]) - .flat(), - }, - // can be removed when https://github.com/elastic/elasticsearch/issues/108982 is complete mv_dedupe: { signatures: supportedFieldTypes.map((type) => ({ params: [ @@ -304,21 +314,53 @@ function getFunctionDefinition(ESFunctionDefinition: Record): Funct } function printGeneratedFunctionsFile(functionDefinitions: FunctionDefinition[]) { + /** + * Deals with asciidoc internal cross-references in the function descriptions + * + * Examples: + * <> -> `MV_MAX` + * <> -> `ST_INTERSECTS` + * <> -> multivalued fields + */ + const removeAsciiDocInternalCrossReferences = ( + asciidocString: string, + functionNames: string[] + ) => { + const internalCrossReferenceRegex = /<<(.+?)(,.+?)?>>/g; + + const extractPossibleFunctionName = (id: string) => id.replace('esql-', ''); + + return asciidocString.replace(internalCrossReferenceRegex, (_match, anchorId, linkText) => { + const ret = linkText ? linkText.slice(1) : anchorId; + + const matchingFunction = functionNames.find( + (name) => + extractPossibleFunctionName(ret) === name.toLowerCase() || + extractPossibleFunctionName(ret) === name.toUpperCase() + ); + return matchingFunction ? `\`${matchingFunction.toUpperCase()}\`` : ret; + }); + }; + const removeInlineAsciiDocLinks = (asciidocString: string) => { const inlineLinkRegex = /\{.+?\}\/.+?\[(.+?)\]/g; + return asciidocString.replace(inlineLinkRegex, '$1'); }; const getDefinitionName = (name: string) => _.camelCase(`${name}Definition`); - const printFunctionDefinition = (functionDefinition: FunctionDefinition) => { + const printFunctionDefinition = ( + functionDefinition: FunctionDefinition, + functionNames: string[] + ) => { const { type, name, description, alias, signatures } = functionDefinition; return `const ${getDefinitionName(name)}: FunctionDefinition = { type: '${type}', name: '${name}', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.${name}', { defaultMessage: ${JSON.stringify( - removeInlineAsciiDocLinks(description) + removeAsciiDocInternalCrossReferences(removeInlineAsciiDocLinks(description), functionNames) )} }), alias: ${alias ? `['${alias.join("', '")}']` : 'undefined'}, signatures: ${JSON.stringify(signatures, null, 2)}, @@ -340,7 +382,14 @@ import type { FunctionDefinition } from './types'; `; - const functionDefinitionsString = functionDefinitions.map(printFunctionDefinition).join('\n\n'); + const functionDefinitionsString = functionDefinitions + .map((def) => + printFunctionDefinition( + def, + functionDefinitions.map(({ name }) => name) + ) + ) + .join('\n\n'); const fileContents = `${fileHeader}${functionDefinitionsString} export const evalFunctionDefinitions = [${functionDefinitions diff --git a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts index 3f3f4f42a07ced..b7cc5c4481e660 100644 --- a/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts +++ b/packages/kbn-esql-validation-autocomplete/scripts/generate_function_validation_tests.ts @@ -142,7 +142,7 @@ function generateImplicitDateCastingTestsForFunction( signature.params.some( (param, i) => param.type === 'date' && - !definition.signatures.some((def) => def.params[i].type === 'string') // don't count parameters that already accept a string + !definition.signatures.some((def) => getParamAtPosition(def, i)?.type === 'string') // don't count parameters that already accept a string ) ); diff --git a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts index 6c704cd69cd48e..930e8b0c308373 100644 --- a/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts +++ b/packages/kbn-esql-validation-autocomplete/src/definitions/functions.ts @@ -235,292 +235,6 @@ const cidrMatchDefinition: FunctionDefinition = { ], }; -const coalesceDefinition: FunctionDefinition = { - type: 'eval', - name: 'coalesce', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.coalesce', { - defaultMessage: - 'Returns the first of its arguments that is not null. If all arguments are null, it returns `null`.', - }), - alias: undefined, - signatures: [ - { - params: [ - { - name: 'first', - type: 'number', - optional: false, - }, - ], - returnType: 'number', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'number', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'number', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'date', - optional: false, - }, - ], - returnType: 'date', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'date', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'date', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'string', - optional: false, - }, - ], - returnType: 'string', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'string', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'string', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'boolean', - optional: false, - }, - ], - returnType: 'boolean', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'boolean', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'boolean', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'ip', - optional: false, - }, - ], - returnType: 'ip', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'ip', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'ip', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'cartesian_point', - optional: false, - }, - ], - returnType: 'cartesian_point', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'cartesian_point', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'cartesian_point', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'cartesian_shape', - optional: false, - }, - ], - returnType: 'cartesian_shape', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'cartesian_shape', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'cartesian_shape', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'geo_point', - optional: false, - }, - ], - returnType: 'geo_point', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'geo_point', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'geo_point', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'geo_shape', - optional: false, - }, - ], - returnType: 'geo_shape', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'geo_shape', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'geo_shape', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'version', - optional: false, - }, - ], - returnType: 'version', - minParams: 1, - }, - { - params: [ - { - name: 'first', - type: 'version', - optional: false, - }, - { - name: 'rest', - type: 'boolean', - optional: true, - }, - ], - returnType: 'version', - minParams: 1, - }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: ['ROW a=null, b="b"\n| EVAL COALESCE(a, b)'], -}; - const concatDefinition: FunctionDefinition = { type: 'eval', name: 'concat', @@ -953,8 +667,7 @@ const greatestDefinition: FunctionDefinition = { name: 'greatest', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.greatest', { defaultMessage: - 'Returns the maximum value from multiple columns. This is similar to <>\nexcept it is intended to run on multiple columns at once.', - ignoreTag: true, + 'Returns the maximum value from multiple columns. This is similar to `MV_MAX`\nexcept it is intended to run on multiple columns at once.', }), alias: undefined, signatures: [ @@ -1078,13 +791,49 @@ const greatestDefinition: FunctionDefinition = { examples: ['ROW a = 10, b = 20\n| EVAL g = GREATEST(a, b)'], }; +const ipPrefixDefinition: FunctionDefinition = { + type: 'eval', + name: 'ip_prefix', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.ip_prefix', { + defaultMessage: 'Truncates an IP to a given prefix length.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'ip', + type: 'ip', + optional: false, + }, + { + name: 'prefixLengthV4', + type: 'number', + optional: false, + }, + { + name: 'prefixLengthV6', + type: 'number', + optional: false, + }, + ], + returnType: 'ip', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'row ip4 = to_ip("1.2.3.4"), ip6 = to_ip("fe80::cae2:65ff:fece:feb9")\n| eval ip4_prefix = ip_prefix(ip4, 24, 0), ip6_prefix = ip_prefix(ip6, 0, 112);', + ], +}; + const leastDefinition: FunctionDefinition = { type: 'eval', name: 'least', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.least', { defaultMessage: - 'Returns the minimum value from multiple columns. This is similar to <> except it is intended to run on multiple columns at once.', - ignoreTag: true, + 'Returns the minimum value from multiple columns. This is similar to `MV_MIN` except it is intended to run on multiple columns at once.', }), alias: undefined, signatures: [ @@ -1444,20 +1193,185 @@ const ltrimDefinition: FunctionDefinition = { { params: [ { - name: 'string', - type: 'string', + name: 'string', + type: 'string', + optional: false, + }, + ], + returnType: 'string', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'ROW message = " some text ", color = " red "\n| EVAL message = LTRIM(message)\n| EVAL color = LTRIM(color)\n| EVAL message = CONCAT("\'", message, "\'")\n| EVAL color = CONCAT("\'", color, "\'")', + ], +}; + +const mvAppendDefinition: FunctionDefinition = { + type: 'eval', + name: 'mv_append', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mv_append', { + defaultMessage: 'Concatenates values of two multi-value fields.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'field1', + type: 'boolean', + optional: false, + }, + { + name: 'field2', + type: 'boolean', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'field1', + type: 'cartesian_point', + optional: false, + }, + { + name: 'field2', + type: 'cartesian_point', + optional: false, + }, + ], + returnType: 'cartesian_point', + }, + { + params: [ + { + name: 'field1', + type: 'cartesian_shape', + optional: false, + }, + { + name: 'field2', + type: 'cartesian_shape', + optional: false, + }, + ], + returnType: 'cartesian_shape', + }, + { + params: [ + { + name: 'field1', + type: 'date', + optional: false, + }, + { + name: 'field2', + type: 'date', + optional: false, + }, + ], + returnType: 'date', + }, + { + params: [ + { + name: 'field1', + type: 'number', + optional: false, + }, + { + name: 'field2', + type: 'number', + optional: false, + }, + ], + returnType: 'number', + }, + { + params: [ + { + name: 'field1', + type: 'geo_point', + optional: false, + }, + { + name: 'field2', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'geo_point', + }, + { + params: [ + { + name: 'field1', + type: 'geo_shape', + optional: false, + }, + { + name: 'field2', + type: 'geo_shape', + optional: false, + }, + ], + returnType: 'geo_shape', + }, + { + params: [ + { + name: 'field1', + type: 'ip', + optional: false, + }, + { + name: 'field2', + type: 'ip', + optional: false, + }, + ], + returnType: 'ip', + }, + { + params: [ + { + name: 'field1', + type: 'string', + optional: false, + }, + { + name: 'field2', + type: 'string', + optional: false, + }, + ], + returnType: 'string', + }, + { + params: [ + { + name: 'field1', + type: 'version', + optional: false, + }, + { + name: 'field2', + type: 'version', optional: false, }, ], - returnType: 'string', + returnType: 'version', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'ROW message = " some text ", color = " red "\n| EVAL message = LTRIM(message)\n| EVAL color = LTRIM(color)\n| EVAL message = CONCAT("\'", message, "\'")\n| EVAL color = CONCAT("\'", color, "\'")', - ], + examples: [], }; const mvAvgDefinition: FunctionDefinition = { @@ -1756,8 +1670,7 @@ const mvFirstDefinition: FunctionDefinition = { name: 'mv_first', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mv_first', { defaultMessage: - "Converts a multivalued expression into a single valued column containing the\nfirst value. This is most useful when reading from a function that emits\nmultivalued columns in a known order like <>.\n\nThe order that <> are read from\nunderlying storage is not guaranteed. It is *frequently* ascending, but don't\nrely on that. If you need the minimum value use <> instead of\n`MV_FIRST`. `MV_MIN` has optimizations for sorted values so there isn't a\nperformance benefit to `MV_FIRST`.", - ignoreTag: true, + "Converts a multivalued expression into a single valued column containing the\nfirst value. This is most useful when reading from a function that emits\nmultivalued columns in a known order like `SPLIT`.\n\nThe order that multivalued fields are read from\nunderlying storage is not guaranteed. It is *frequently* ascending, but don't\nrely on that. If you need the minimum value use `MV_MIN` instead of\n`MV_FIRST`. `MV_MIN` has optimizations for sorted values so there isn't a\nperformance benefit to `MV_FIRST`.", }), alias: undefined, signatures: [ @@ -1873,8 +1786,7 @@ const mvLastDefinition: FunctionDefinition = { name: 'mv_last', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.mv_last', { defaultMessage: - "Converts a multivalue expression into a single valued column containing the last\nvalue. This is most useful when reading from a function that emits multivalued\ncolumns in a known order like <>.\n\nThe order that <> are read from\nunderlying storage is not guaranteed. It is *frequently* ascending, but don't\nrely on that. If you need the maximum value use <> instead of\n`MV_LAST`. `MV_MAX` has optimizations for sorted values so there isn't a\nperformance benefit to `MV_LAST`.", - ignoreTag: true, + "Converts a multivalue expression into a single valued column containing the last\nvalue. This is most useful when reading from a function that emits multivalued\ncolumns in a known order like `SPLIT`.\n\nThe order that multivalued fields are read from\nunderlying storage is not guaranteed. It is *frequently* ascending, but don't\nrely on that. If you need the maximum value use `MV_MAX` instead of\n`MV_LAST`. `MV_MAX` has optimizations for sorted values so there isn't a\nperformance benefit to `MV_LAST`.", }), alias: undefined, signatures: [ @@ -2913,8 +2825,7 @@ const stContainsDefinition: FunctionDefinition = { name: 'st_contains', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_contains', { defaultMessage: - 'Returns whether the first geometry contains the second geometry.\nThis is the inverse of the <> function.', - ignoreTag: true, + 'Returns whether the first geometry contains the second geometry.\nThis is the inverse of the `ST_WITHIN` function.', }), alias: undefined, signatures: [ @@ -3052,8 +2963,7 @@ const stDisjointDefinition: FunctionDefinition = { name: 'st_disjoint', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_disjoint', { defaultMessage: - 'Returns whether the two geometries or geometry columns are disjoint.\nThis is the inverse of the <> function.\nIn mathematical terms: ST_Disjoint(A, B) ⇔ A ⋂ B = ∅', - ignoreTag: true, + 'Returns whether the two geometries or geometry columns are disjoint.\nThis is the inverse of the `ST_INTERSECTS` function.\nIn mathematical terms: ST_Disjoint(A, B) ⇔ A ⋂ B = ∅', }), alias: undefined, signatures: [ @@ -3191,8 +3101,7 @@ const stIntersectsDefinition: FunctionDefinition = { name: 'st_intersects', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_intersects', { defaultMessage: - 'Returns true if two geometries intersect.\nThey intersect if they have any point in common, including their interior points\n(points along lines or within polygons).\nThis is the inverse of the <> function.\nIn mathematical terms: ST_Intersects(A, B) ⇔ A ⋂ B ≠ ∅', - ignoreTag: true, + 'Returns true if two geometries intersect.\nThey intersect if they have any point in common, including their interior points\n(points along lines or within polygons).\nThis is the inverse of the `ST_DISJOINT` function.\nIn mathematical terms: ST_Intersects(A, B) ⇔ A ⋂ B ≠ ∅', }), alias: undefined, signatures: [ @@ -3330,8 +3239,7 @@ const stWithinDefinition: FunctionDefinition = { name: 'st_within', description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_within', { defaultMessage: - 'Returns whether the first geometry is within the second geometry.\nThis is the inverse of the <> function.', - ignoreTag: true, + 'Returns whether the first geometry is within the second geometry.\nThis is the inverse of the `ST_CONTAINS` function.', }), alias: undefined, signatures: [ @@ -3373,53 +3281,352 @@ const stWithinDefinition: FunctionDefinition = { optional: false, }, { - name: 'geomB', - type: 'cartesian_point', + name: 'geomB', + type: 'cartesian_point', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'geomA', + type: 'cartesian_shape', + optional: false, + }, + { + name: 'geomB', + type: 'cartesian_shape', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'geomA', + type: 'geo_point', + optional: false, + }, + { + name: 'geomB', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'geomA', + type: 'geo_point', + optional: false, + }, + { + name: 'geomB', + type: 'geo_shape', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'geomA', + type: 'geo_shape', + optional: false, + }, + { + name: 'geomB', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'boolean', + }, + { + params: [ + { + name: 'geomA', + type: 'geo_shape', + optional: false, + }, + { + name: 'geomB', + type: 'geo_shape', + optional: false, + }, + ], + returnType: 'boolean', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'FROM airport_city_boundaries\n| WHERE ST_WITHIN(city_boundary, TO_GEOSHAPE("POLYGON((109.1 18.15, 109.6 18.15, 109.6 18.65, 109.1 18.65, 109.1 18.15))"))\n| KEEP abbrev, airport, region, city, city_location', + ], +}; + +const stXDefinition: FunctionDefinition = { + type: 'eval', + name: 'st_x', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_x', { + defaultMessage: + 'Extracts the `x` coordinate from the supplied point.\nIf the points is of type `geo_point` this is equivalent to extracting the `longitude` value.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'point', + type: 'cartesian_point', + optional: false, + }, + ], + returnType: 'number', + }, + { + params: [ + { + name: 'point', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'number', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'ROW point = TO_GEOPOINT("POINT(42.97109629958868 14.7552534006536)")\n| EVAL x = ST_X(point), y = ST_Y(point)', + ], +}; + +const stYDefinition: FunctionDefinition = { + type: 'eval', + name: 'st_y', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_y', { + defaultMessage: + 'Extracts the `y` coordinate from the supplied point.\nIf the points is of type `geo_point` this is equivalent to extracting the `latitude` value.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'point', + type: 'cartesian_point', + optional: false, + }, + ], + returnType: 'number', + }, + { + params: [ + { + name: 'point', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'number', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'ROW point = TO_GEOPOINT("POINT(42.97109629958868 14.7552534006536)")\n| EVAL x = ST_X(point), y = ST_Y(point)', + ], +}; + +const startsWithDefinition: FunctionDefinition = { + type: 'eval', + name: 'starts_with', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.starts_with', { + defaultMessage: + 'Returns a boolean that indicates whether a keyword string starts with another string.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'str', + type: 'string', + optional: false, + }, + { + name: 'prefix', + type: 'string', + optional: false, + }, + ], + returnType: 'boolean', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['FROM employees\n| KEEP last_name\n| EVAL ln_S = STARTS_WITH(last_name, "B")'], +}; + +const substringDefinition: FunctionDefinition = { + type: 'eval', + name: 'substring', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.substring', { + defaultMessage: + 'Returns a substring of a string, specified by a start position and an optional length', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'string', + type: 'string', + optional: false, + }, + { + name: 'start', + type: 'number', + optional: false, + }, + { + name: 'length', + type: 'number', + optional: true, + }, + ], + returnType: 'string', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: [ + 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 1, 3)', + 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, -3, 3)', + 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 2)', + ], +}; + +const tanDefinition: FunctionDefinition = { + type: 'eval', + name: 'tan', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tan', { + defaultMessage: 'Returns the Tangent trigonometric function of an angle.', + }), + alias: undefined, + signatures: [ + { + params: [ + { + name: 'angle', + type: 'number', optional: false, }, ], - returnType: 'boolean', + returnType: 'number', }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['ROW a=1.8 \n| EVAL tan=TAN(a)'], +}; + +const tanhDefinition: FunctionDefinition = { + type: 'eval', + name: 'tanh', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tanh', { + defaultMessage: 'Returns the Tangent hyperbolic function of an angle.', + }), + alias: undefined, + signatures: [ { params: [ { - name: 'geomA', - type: 'cartesian_shape', - optional: false, - }, - { - name: 'geomB', - type: 'cartesian_shape', + name: 'angle', + type: 'number', optional: false, }, ], - returnType: 'boolean', + returnType: 'number', + }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['ROW a=1.8 \n| EVAL tanh=TANH(a)'], +}; + +const tauDefinition: FunctionDefinition = { + type: 'eval', + name: 'tau', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tau', { + defaultMessage: "Returns the ratio of a circle's circumference to its radius.", + }), + alias: undefined, + signatures: [ + { + params: [], + returnType: 'number', }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['ROW TAU()'], +}; + +const toBase64Definition: FunctionDefinition = { + type: 'eval', + name: 'to_base64', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_base64', { + defaultMessage: 'Encode a string to a base64 string.', + }), + alias: undefined, + signatures: [ { params: [ { - name: 'geomA', - type: 'geo_point', - optional: false, - }, - { - name: 'geomB', - type: 'geo_point', + name: 'string', + type: 'string', optional: false, }, ], - returnType: 'boolean', + returnType: 'string', }, + ], + supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], + supportedOptions: ['by'], + validate: undefined, + examples: ['row a = "elastic" \n| eval e = to_base64(a)'], +}; + +const toBooleanDefinition: FunctionDefinition = { + type: 'eval', + name: 'to_boolean', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_boolean', { + defaultMessage: + 'Converts an input value to a boolean value.\nA string value of *true* will be case-insensitive converted to the Boolean *true*.\nFor anything else, including the empty string, the function will return *false*.\nThe numerical value of *0* will be converted to *false*, anything else will be converted to *true*.', + }), + alias: ['to_bool'], + signatures: [ { params: [ { - name: 'geomA', - type: 'geo_point', - optional: false, - }, - { - name: 'geomB', - type: 'geo_shape', + name: 'field', + type: 'boolean', optional: false, }, ], @@ -3428,13 +3635,8 @@ const stWithinDefinition: FunctionDefinition = { { params: [ { - name: 'geomA', - type: 'geo_shape', - optional: false, - }, - { - name: 'geomB', - type: 'geo_point', + name: 'field', + type: 'number', optional: false, }, ], @@ -3443,13 +3645,8 @@ const stWithinDefinition: FunctionDefinition = { { params: [ { - name: 'geomA', - type: 'geo_shape', - optional: false, - }, - { - name: 'geomB', - type: 'geo_shape', + name: 'field', + type: 'string', optional: false, }, ], @@ -3459,170 +3656,162 @@ const stWithinDefinition: FunctionDefinition = { supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'FROM airport_city_boundaries\n| WHERE ST_WITHIN(city_boundary, TO_GEOSHAPE("POLYGON((109.1 18.15, 109.6 18.15, 109.6 18.65, 109.1 18.65, 109.1 18.15))"))\n| KEEP abbrev, airport, region, city, city_location', - ], + examples: ['ROW str = ["true", "TRuE", "false", "", "yes", "1"]\n| EVAL bool = TO_BOOLEAN(str)'], }; -const stXDefinition: FunctionDefinition = { +const toCartesianpointDefinition: FunctionDefinition = { type: 'eval', - name: 'st_x', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_x', { - defaultMessage: - 'Extracts the `x` coordinate from the supplied point.\nIf the points is of type `geo_point` this is equivalent to extracting the `longitude` value.', - }), + name: 'to_cartesianpoint', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.to_cartesianpoint', + { + defaultMessage: + 'Converts an input value to a `cartesian_point` value.\nA string will only be successfully converted if it respects WKT Point format.', + } + ), alias: undefined, signatures: [ { params: [ { - name: 'point', + name: 'field', type: 'cartesian_point', optional: false, }, ], - returnType: 'number', + returnType: 'cartesian_point', }, { params: [ { - name: 'point', - type: 'geo_point', + name: 'field', + type: 'string', optional: false, }, ], - returnType: 'number', + returnType: 'cartesian_point', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, examples: [ - 'ROW point = TO_GEOPOINT("POINT(42.97109629958868 14.7552534006536)")\n| EVAL x = ST_X(point), y = ST_Y(point)', + 'ROW wkt = ["POINT(4297.11 -1475.53)", "POINT(7580.93 2272.77)"]\n| MV_EXPAND wkt\n| EVAL pt = TO_CARTESIANPOINT(wkt)', ], }; -const stYDefinition: FunctionDefinition = { +const toCartesianshapeDefinition: FunctionDefinition = { type: 'eval', - name: 'st_y', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.st_y', { - defaultMessage: - 'Extracts the `y` coordinate from the supplied point.\nIf the points is of type `geo_point` this is equivalent to extracting the `latitude` value.', - }), + name: 'to_cartesianshape', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.to_cartesianshape', + { + defaultMessage: + 'Converts an input value to a `cartesian_shape` value.\nA string will only be successfully converted if it respects WKT format.', + } + ), alias: undefined, signatures: [ { params: [ { - name: 'point', + name: 'field', type: 'cartesian_point', optional: false, }, ], - returnType: 'number', + returnType: 'cartesian_shape', }, { params: [ { - name: 'point', - type: 'geo_point', + name: 'field', + type: 'cartesian_shape', optional: false, }, ], - returnType: 'number', + returnType: 'cartesian_shape', }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: [ - 'ROW point = TO_GEOPOINT("POINT(42.97109629958868 14.7552534006536)")\n| EVAL x = ST_X(point), y = ST_Y(point)', - ], -}; - -const startsWithDefinition: FunctionDefinition = { - type: 'eval', - name: 'starts_with', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.starts_with', { - defaultMessage: - 'Returns a boolean that indicates whether a keyword string starts with another string.', - }), - alias: undefined, - signatures: [ { params: [ { - name: 'str', - type: 'string', - optional: false, - }, - { - name: 'prefix', + name: 'field', type: 'string', optional: false, }, ], - returnType: 'boolean', + returnType: 'cartesian_shape', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['FROM employees\n| KEEP last_name\n| EVAL ln_S = STARTS_WITH(last_name, "B")'], + examples: [ + 'ROW wkt = ["POINT(4297.11 -1475.53)", "POLYGON ((3339584.72 1118889.97, 4452779.63 4865942.27, 2226389.81 4865942.27, 1113194.90 2273030.92, 3339584.72 1118889.97))"]\n| MV_EXPAND wkt\n| EVAL geom = TO_CARTESIANSHAPE(wkt)', + ], }; -const substringDefinition: FunctionDefinition = { +const toDatetimeDefinition: FunctionDefinition = { type: 'eval', - name: 'substring', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.substring', { + name: 'to_datetime', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_datetime', { defaultMessage: - 'Returns a substring of a string, specified by a start position and an optional length', + "Converts an input value to a date value.\nA string will only be successfully converted if it's respecting the format `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`.\nTo convert dates in other formats, use `DATE_PARSE`.", }), - alias: undefined, + alias: ['to_dt'], signatures: [ { params: [ { - name: 'string', - type: 'string', + name: 'field', + type: 'date', optional: false, }, + ], + returnType: 'date', + }, + { + params: [ { - name: 'start', + name: 'field', type: 'number', optional: false, }, + ], + returnType: 'date', + }, + { + params: [ { - name: 'length', - type: 'number', - optional: true, + name: 'field', + type: 'string', + optional: false, }, ], - returnType: 'string', + returnType: 'date', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, examples: [ - 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 1, 3)', - 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, -3, 3)', - 'FROM employees\n| KEEP last_name\n| EVAL ln_sub = SUBSTRING(last_name, 2)', + 'ROW string = ["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"]\n| EVAL datetime = TO_DATETIME(string)', + 'ROW int = [0, 1]\n| EVAL dt = TO_DATETIME(int)', ], }; -const tanDefinition: FunctionDefinition = { +const toDegreesDefinition: FunctionDefinition = { type: 'eval', - name: 'tan', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tan', { - defaultMessage: 'Returns the Tangent trigonometric function of an angle.', + name: 'to_degrees', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_degrees', { + defaultMessage: 'Converts a number in radians to degrees.', }), alias: undefined, signatures: [ { params: [ { - name: 'angle', + name: 'number', type: 'number', optional: false, }, @@ -3633,86 +3822,159 @@ const tanDefinition: FunctionDefinition = { supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW a=1.8 \n| EVAL tan=TAN(a)'], + examples: ['ROW rad = [1.57, 3.14, 4.71]\n| EVAL deg = TO_DEGREES(rad)'], }; -const tanhDefinition: FunctionDefinition = { +const toDoubleDefinition: FunctionDefinition = { type: 'eval', - name: 'tanh', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tanh', { - defaultMessage: 'Returns the Tangent hyperbolic function of an angle.', + name: 'to_double', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_double', { + defaultMessage: + 'Converts an input value to a double value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch,\nconverted to double. Boolean *true* will be converted to double *1.0*, *false* to *0.0*.', }), - alias: undefined, + alias: ['to_dbl'], signatures: [ { params: [ { - name: 'angle', + name: 'field', + type: 'boolean', + optional: false, + }, + ], + returnType: 'number', + }, + { + params: [ + { + name: 'field', type: 'number', optional: false, }, ], returnType: 'number', }, + { + params: [ + { + name: 'field', + type: 'date', + optional: false, + }, + ], + returnType: 'number', + }, + { + params: [ + { + name: 'field', + type: 'string', + optional: false, + }, + ], + returnType: 'number', + }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW a=1.8 \n| EVAL tanh=TANH(a)'], + examples: [ + 'ROW str1 = "5.20128E11", str2 = "foo"\n| EVAL dbl = TO_DOUBLE("520128000000"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)', + ], }; -const tauDefinition: FunctionDefinition = { +const toGeopointDefinition: FunctionDefinition = { type: 'eval', - name: 'tau', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.tau', { - defaultMessage: "Returns the ratio of a circle's circumference to its radius.", + name: 'to_geopoint', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_geopoint', { + defaultMessage: + 'Converts an input value to a `geo_point` value.\nA string will only be successfully converted if it respects WKT Point format.', }), alias: undefined, signatures: [ { - params: [], - returnType: 'number', + params: [ + { + name: 'field', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'geo_point', + }, + { + params: [ + { + name: 'field', + type: 'string', + optional: false, + }, + ], + returnType: 'geo_point', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW TAU()'], + examples: ['ROW wkt = "POINT(42.97109630194 14.7552534413725)"\n| EVAL pt = TO_GEOPOINT(wkt)'], }; -const toBase64Definition: FunctionDefinition = { +const toGeoshapeDefinition: FunctionDefinition = { type: 'eval', - name: 'to_base64', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_base64', { - defaultMessage: 'Encode a string to a base64 string.', + name: 'to_geoshape', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_geoshape', { + defaultMessage: + 'Converts an input value to a `geo_shape` value.\nA string will only be successfully converted if it respects WKT format.', }), alias: undefined, signatures: [ { params: [ { - name: 'string', + name: 'field', + type: 'geo_point', + optional: false, + }, + ], + returnType: 'geo_shape', + }, + { + params: [ + { + name: 'field', + type: 'geo_shape', + optional: false, + }, + ], + returnType: 'geo_shape', + }, + { + params: [ + { + name: 'field', type: 'string', optional: false, }, ], - returnType: 'string', + returnType: 'geo_shape', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['row a = "elastic" \n| eval e = to_base64(a)'], + examples: [ + 'ROW wkt = "POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))"\n| EVAL geom = TO_GEOSHAPE(wkt)', + ], }; -const toBooleanDefinition: FunctionDefinition = { +const toIntegerDefinition: FunctionDefinition = { type: 'eval', - name: 'to_boolean', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_boolean', { + name: 'to_integer', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_integer', { defaultMessage: - 'Converts an input value to a boolean value.\nA string value of *true* will be case-insensitive converted to the Boolean *true*.\nFor anything else, including the empty string, the function will return *false*.\nThe numerical value of *0* will be converted to *false*, anything else will be converted to *true*.', + 'Converts an input value to an integer value.\nIf the input parameter is of a date type, its value will be interpreted as milliseconds\nsince the Unix epoch, converted to integer.\nBoolean *true* will be converted to integer *1*, *false* to *0*.', }), - alias: ['to_bool'], + alias: ['to_int'], signatures: [ { params: [ @@ -3722,7 +3984,7 @@ const toBooleanDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'boolean', + returnType: 'number', }, { params: [ @@ -3732,7 +3994,17 @@ const toBooleanDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'boolean', + returnType: 'number', + }, + { + params: [ + { + name: 'field', + type: 'date', + optional: false, + }, + ], + returnType: 'number', }, { params: [ @@ -3742,36 +4014,32 @@ const toBooleanDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'boolean', + returnType: 'number', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW str = ["true", "TRuE", "false", "", "yes", "1"]\n| EVAL bool = TO_BOOLEAN(str)'], + examples: ['ROW long = [5013792, 2147483647, 501379200000]\n| EVAL int = TO_INTEGER(long)'], }; -const toCartesianpointDefinition: FunctionDefinition = { +const toIpDefinition: FunctionDefinition = { type: 'eval', - name: 'to_cartesianpoint', - description: i18n.translate( - 'kbn-esql-validation-autocomplete.esql.definitions.to_cartesianpoint', - { - defaultMessage: - 'Converts an input value to a `cartesian_point` value.\nA string will only be successfully converted if it respects WKT Point format.', - } - ), + name: 'to_ip', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_ip', { + defaultMessage: 'Converts an input string to an IP value.', + }), alias: undefined, signatures: [ { params: [ { name: 'field', - type: 'cartesian_point', + type: 'ip', optional: false, }, ], - returnType: 'cartesian_point', + returnType: 'ip', }, { params: [ @@ -3781,48 +4049,55 @@ const toCartesianpointDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'cartesian_point', + returnType: 'ip', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, examples: [ - 'ROW wkt = ["POINT(4297.11 -1475.53)", "POINT(7580.93 2272.77)"]\n| MV_EXPAND wkt\n| EVAL pt = TO_CARTESIANPOINT(wkt)', + 'ROW str1 = "1.1.1.1", str2 = "foo"\n| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2)\n| WHERE CIDR_MATCH(ip1, "1.0.0.0/8")', ], }; -const toCartesianshapeDefinition: FunctionDefinition = { +const toLongDefinition: FunctionDefinition = { type: 'eval', - name: 'to_cartesianshape', - description: i18n.translate( - 'kbn-esql-validation-autocomplete.esql.definitions.to_cartesianshape', - { - defaultMessage: - 'Converts an input value to a `cartesian_shape` value.\nA string will only be successfully converted if it respects WKT format.', - } - ), + name: 'to_long', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_long', { + defaultMessage: + 'Converts an input value to a long value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch, converted to long.\nBoolean *true* will be converted to long *1*, *false* to *0*.', + }), alias: undefined, signatures: [ { params: [ { name: 'field', - type: 'cartesian_point', + type: 'boolean', optional: false, }, ], - returnType: 'cartesian_shape', + returnType: 'number', }, { params: [ { name: 'field', - type: 'cartesian_shape', + type: 'number', optional: false, }, ], - returnType: 'cartesian_shape', + returnType: 'number', + }, + { + params: [ + { + name: 'field', + type: 'date', + optional: false, + }, + ], + returnType: 'number', }, { params: [ @@ -3832,72 +4107,47 @@ const toCartesianshapeDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'cartesian_shape', + returnType: 'number', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, examples: [ - 'ROW wkt = ["POINT(4297.11 -1475.53)", "POLYGON ((3339584.72 1118889.97, 4452779.63 4865942.27, 2226389.81 4865942.27, 1113194.90 2273030.92, 3339584.72 1118889.97))"]\n| MV_EXPAND wkt\n| EVAL geom = TO_CARTESIANSHAPE(wkt)', + 'ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"\n| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)', ], }; -const toDatetimeDefinition: FunctionDefinition = { +const toLowerDefinition: FunctionDefinition = { type: 'eval', - name: 'to_datetime', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_datetime', { - defaultMessage: - "Converts an input value to a date value.\nA string will only be successfully converted if it's respecting the format `yyyy-MM-dd'T'HH:mm:ss.SSS'Z'`.\nTo convert dates in other formats, use <>.", - ignoreTag: true, + name: 'to_lower', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_lower', { + defaultMessage: 'Returns a new string representing the input string converted to lower case.', }), - alias: ['to_dt'], + alias: undefined, signatures: [ { params: [ { - name: 'field', - type: 'date', - optional: false, - }, - ], - returnType: 'date', - }, - { - params: [ - { - name: 'field', - type: 'number', - optional: false, - }, - ], - returnType: 'date', - }, - { - params: [ - { - name: 'field', + name: 'str', type: 'string', optional: false, }, ], - returnType: 'date', + returnType: 'string', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'ROW string = ["1953-09-02T00:00:00.000Z", "1964-06-02T00:00:00.000Z", "1964-06-02 00:00:00"]\n| EVAL datetime = TO_DATETIME(string)', - 'ROW int = [0, 1]\n| EVAL dt = TO_DATETIME(int)', - ], + examples: ['ROW message = "Some Text"\n| EVAL message_lower = TO_LOWER(message)'], }; -const toDegreesDefinition: FunctionDefinition = { +const toRadiansDefinition: FunctionDefinition = { type: 'eval', - name: 'to_degrees', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_degrees', { - defaultMessage: 'Converts a number in radians to degrees.', + name: 'to_radians', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_radians', { + defaultMessage: 'Converts a number in degrees to radians.', }), alias: undefined, signatures: [ @@ -3915,17 +4165,16 @@ const toDegreesDefinition: FunctionDefinition = { supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW rad = [1.57, 3.14, 4.71]\n| EVAL deg = TO_DEGREES(rad)'], + examples: ['ROW deg = [90.0, 180.0, 270.0]\n| EVAL rad = TO_RADIANS(deg)'], }; -const toDoubleDefinition: FunctionDefinition = { +const toStringDefinition: FunctionDefinition = { type: 'eval', - name: 'to_double', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_double', { - defaultMessage: - 'Converts an input value to a double value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch,\nconverted to double. Boolean *true* will be converted to double *1.0*, *false* to *0.0*.', + name: 'to_string', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_string', { + defaultMessage: 'Converts an input value into a string.', }), - alias: ['to_dbl'], + alias: ['to_str'], signatures: [ { params: [ @@ -3935,17 +4184,27 @@ const toDoubleDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'number', + returnType: 'string', }, { params: [ { name: 'field', - type: 'number', + type: 'cartesian_point', optional: false, }, ], - returnType: 'number', + returnType: 'string', + }, + { + params: [ + { + name: 'field', + type: 'cartesian_shape', + optional: false, + }, + ], + returnType: 'string', }, { params: [ @@ -3955,36 +4214,18 @@ const toDoubleDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'number', + returnType: 'string', }, { params: [ { name: 'field', - type: 'string', + type: 'number', optional: false, }, ], - returnType: 'number', + returnType: 'string', }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: [ - 'ROW str1 = "5.20128E11", str2 = "foo"\n| EVAL dbl = TO_DOUBLE("520128000000"), dbl1 = TO_DOUBLE(str1), dbl2 = TO_DOUBLE(str2)', - ], -}; - -const toGeopointDefinition: FunctionDefinition = { - type: 'eval', - name: 'to_geopoint', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_geopoint', { - defaultMessage: - 'Converts an input value to a `geo_point` value.\nA string will only be successfully converted if it respects WKT Point format.', - }), - alias: undefined, - signatures: [ { params: [ { @@ -3993,81 +4234,66 @@ const toGeopointDefinition: FunctionDefinition = { optional: false, }, ], - returnType: 'geo_point', + returnType: 'string', }, { params: [ { name: 'field', - type: 'string', + type: 'geo_shape', optional: false, }, ], - returnType: 'geo_point', + returnType: 'string', }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: ['ROW wkt = "POINT(42.97109630194 14.7552534413725)"\n| EVAL pt = TO_GEOPOINT(wkt)'], -}; - -const toGeoshapeDefinition: FunctionDefinition = { - type: 'eval', - name: 'to_geoshape', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_geoshape', { - defaultMessage: - 'Converts an input value to a `geo_shape` value.\nA string will only be successfully converted if it respects WKT format.', - }), - alias: undefined, - signatures: [ { params: [ { name: 'field', - type: 'geo_point', + type: 'ip', optional: false, }, ], - returnType: 'geo_shape', + returnType: 'string', }, { params: [ { name: 'field', - type: 'geo_shape', + type: 'string', optional: false, }, ], - returnType: 'geo_shape', + returnType: 'string', }, { params: [ { name: 'field', - type: 'string', + type: 'version', optional: false, }, ], - returnType: 'geo_shape', + returnType: 'string', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'ROW wkt = "POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))"\n| EVAL geom = TO_GEOSHAPE(wkt)', - ], + examples: ['ROW a=10\n| EVAL j = TO_STRING(a)', 'ROW a=[10, 9, 8]\n| EVAL j = TO_STRING(a)'], }; -const toIntegerDefinition: FunctionDefinition = { +const toUnsignedLongDefinition: FunctionDefinition = { type: 'eval', - name: 'to_integer', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_integer', { - defaultMessage: - 'Converts an input value to an integer value.\nIf the input parameter is of a date type, its value will be interpreted as milliseconds\nsince the Unix epoch, converted to integer.\nBoolean *true* will be converted to integer *1*, *false* to *0*.', - }), - alias: ['to_int'], + name: 'to_unsigned_long', + description: i18n.translate( + 'kbn-esql-validation-autocomplete.esql.definitions.to_unsigned_long', + { + defaultMessage: + 'Converts an input value to an unsigned long value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch, converted to unsigned long.\nBoolean *true* will be converted to unsigned long *1*, *false* to *0*.', + } + ), + alias: ['to_ul', 'to_ulong'], signatures: [ { params: [ @@ -4083,7 +4309,7 @@ const toIntegerDefinition: FunctionDefinition = { params: [ { name: 'field', - type: 'number', + type: 'date', optional: false, }, ], @@ -4093,7 +4319,7 @@ const toIntegerDefinition: FunctionDefinition = { params: [ { name: 'field', - type: 'date', + type: 'number', optional: false, }, ], @@ -4113,116 +4339,83 @@ const toIntegerDefinition: FunctionDefinition = { supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW long = [5013792, 2147483647, 501379200000]\n| EVAL int = TO_INTEGER(long)'], + examples: [ + 'ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"\n| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)', + ], }; -const toIpDefinition: FunctionDefinition = { +const toUpperDefinition: FunctionDefinition = { type: 'eval', - name: 'to_ip', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_ip', { - defaultMessage: 'Converts an input string to an IP value.', + name: 'to_upper', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_upper', { + defaultMessage: 'Returns a new string representing the input string converted to upper case.', }), alias: undefined, signatures: [ { params: [ { - name: 'field', - type: 'ip', - optional: false, - }, - ], - returnType: 'ip', - }, - { - params: [ - { - name: 'field', + name: 'str', type: 'string', optional: false, }, ], - returnType: 'ip', + returnType: 'string', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'ROW str1 = "1.1.1.1", str2 = "foo"\n| EVAL ip1 = TO_IP(str1), ip2 = TO_IP(str2)\n| WHERE CIDR_MATCH(ip1, "1.0.0.0/8")', - ], + examples: ['ROW message = "Some Text"\n| EVAL message_upper = TO_UPPER(message)'], }; -const toLongDefinition: FunctionDefinition = { +const toVersionDefinition: FunctionDefinition = { type: 'eval', - name: 'to_long', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_long', { - defaultMessage: - 'Converts an input value to a long value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch, converted to long.\nBoolean *true* will be converted to long *1*, *false* to *0*.', + name: 'to_version', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_version', { + defaultMessage: 'Converts an input string to a version value.', }), - alias: undefined, + alias: ['to_ver'], signatures: [ { params: [ { name: 'field', - type: 'boolean', - optional: false, - }, - ], - returnType: 'number', - }, - { - params: [ - { - name: 'field', - type: 'number', - optional: false, - }, - ], - returnType: 'number', - }, - { - params: [ - { - name: 'field', - type: 'date', + type: 'string', optional: false, }, ], - returnType: 'number', + returnType: 'version', }, { params: [ { name: 'field', - type: 'string', + type: 'version', optional: false, }, ], - returnType: 'number', + returnType: 'version', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"\n| EVAL long1 = TO_LONG(str1), long2 = TO_LONG(str2), long3 = TO_LONG(str3)', - ], + examples: ['ROW v = TO_VERSION("1.2.3")'], }; -const toLowerDefinition: FunctionDefinition = { +const trimDefinition: FunctionDefinition = { type: 'eval', - name: 'to_lower', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_lower', { - defaultMessage: 'Returns a new string representing the input string converted to lower case.', + name: 'trim', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.trim', { + defaultMessage: 'Removes leading and trailing whitespaces from a string.', }), alias: undefined, signatures: [ { params: [ { - name: 'str', + name: 'string', type: 'string', optional: false, }, @@ -4233,327 +4426,327 @@ const toLowerDefinition: FunctionDefinition = { supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW message = "Some Text"\n| EVAL message_lower = TO_LOWER(message)'], + examples: [ + 'ROW message = " some text ", color = " red "\n| EVAL message = TRIM(message)\n| EVAL color = TRIM(color)', + ], }; -const toRadiansDefinition: FunctionDefinition = { +const caseDefinition: FunctionDefinition = { type: 'eval', - name: 'to_radians', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_radians', { - defaultMessage: 'Converts a number in degrees to radians.', + name: 'case', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.case', { + defaultMessage: + 'Accepts pairs of conditions and values. The function returns the value that belongs to the first condition that evaluates to `true`. If the number of arguments is odd, the last argument is the default value which is returned when no condition matches.', }), alias: undefined, signatures: [ { params: [ { - name: 'number', - type: 'number', - optional: false, + name: 'condition', + type: 'boolean', + }, + { + name: 'value', + type: 'any', }, ], - returnType: 'number', + minParams: 2, + returnType: 'any', }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: ['ROW deg = [90.0, 180.0, 270.0]\n| EVAL rad = TO_RADIANS(deg)'], + examples: [ + 'from index | eval type = case(languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot")', + ], }; -const toStringDefinition: FunctionDefinition = { +const coalesceDefinition: FunctionDefinition = { type: 'eval', - name: 'to_string', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_string', { - defaultMessage: 'Converts an input value into a string.', + name: 'coalesce', + description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.coalesce', { + defaultMessage: + 'Returns the first of its arguments that is not null. If all arguments are null, it returns `null`.', }), - alias: ['to_str'], + alias: undefined, signatures: [ { params: [ { - name: 'field', - type: 'boolean', + name: 'first', + type: 'number', optional: false, }, ], - returnType: 'string', + returnType: 'number', + minParams: 1, }, { params: [ { - name: 'field', - type: 'cartesian_point', + name: 'first', + type: 'number', + optional: false, + }, + { + name: 'rest', + type: 'number', + optional: true, + }, + ], + returnType: 'number', + minParams: 1, + }, + { + params: [ + { + name: 'first', + type: 'date', optional: false, }, ], - returnType: 'string', + returnType: 'date', + minParams: 1, }, { params: [ { - name: 'field', - type: 'cartesian_shape', + name: 'first', + type: 'date', optional: false, }, + { + name: 'rest', + type: 'date', + optional: true, + }, ], - returnType: 'string', + returnType: 'date', + minParams: 1, }, { params: [ { - name: 'field', - type: 'date', + name: 'first', + type: 'string', optional: false, }, ], returnType: 'string', + minParams: 1, }, { params: [ { - name: 'field', - type: 'number', + name: 'first', + type: 'string', optional: false, }, + { + name: 'rest', + type: 'string', + optional: true, + }, ], returnType: 'string', + minParams: 1, }, { params: [ { - name: 'field', - type: 'geo_point', + name: 'first', + type: 'boolean', optional: false, }, ], - returnType: 'string', + returnType: 'boolean', + minParams: 1, }, { params: [ { - name: 'field', - type: 'geo_shape', + name: 'first', + type: 'boolean', optional: false, }, + { + name: 'rest', + type: 'boolean', + optional: true, + }, ], - returnType: 'string', + returnType: 'boolean', + minParams: 1, }, { params: [ { - name: 'field', + name: 'first', type: 'ip', optional: false, }, ], - returnType: 'string', + returnType: 'ip', + minParams: 1, }, { params: [ { - name: 'field', - type: 'string', + name: 'first', + type: 'ip', optional: false, }, + { + name: 'rest', + type: 'ip', + optional: true, + }, ], - returnType: 'string', + returnType: 'ip', + minParams: 1, }, { params: [ { - name: 'field', - type: 'version', + name: 'first', + type: 'cartesian_point', optional: false, }, ], - returnType: 'string', + returnType: 'cartesian_point', + minParams: 1, }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: ['ROW a=10\n| EVAL j = TO_STRING(a)', 'ROW a=[10, 9, 8]\n| EVAL j = TO_STRING(a)'], -}; - -const toUnsignedLongDefinition: FunctionDefinition = { - type: 'eval', - name: 'to_unsigned_long', - description: i18n.translate( - 'kbn-esql-validation-autocomplete.esql.definitions.to_unsigned_long', - { - defaultMessage: - 'Converts an input value to an unsigned long value. If the input parameter is of a date type,\nits value will be interpreted as milliseconds since the Unix epoch, converted to unsigned long.\nBoolean *true* will be converted to unsigned long *1*, *false* to *0*.', - } - ), - alias: ['to_ul', 'to_ulong'], - signatures: [ { params: [ { - name: 'field', - type: 'boolean', + name: 'first', + type: 'cartesian_point', optional: false, }, + { + name: 'rest', + type: 'cartesian_point', + optional: true, + }, ], - returnType: 'number', + returnType: 'cartesian_point', + minParams: 1, }, { params: [ { - name: 'field', - type: 'date', + name: 'first', + type: 'cartesian_shape', optional: false, }, ], - returnType: 'number', + returnType: 'cartesian_shape', + minParams: 1, }, { params: [ { - name: 'field', - type: 'number', + name: 'first', + type: 'cartesian_shape', optional: false, }, + { + name: 'rest', + type: 'cartesian_shape', + optional: true, + }, ], - returnType: 'number', + returnType: 'cartesian_shape', + minParams: 1, }, { params: [ { - name: 'field', - type: 'string', + name: 'first', + type: 'geo_point', optional: false, }, ], - returnType: 'number', + returnType: 'geo_point', + minParams: 1, }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: [ - 'ROW str1 = "2147483648", str2 = "2147483648.2", str3 = "foo"\n| EVAL long1 = TO_UNSIGNED_LONG(str1), long2 = TO_ULONG(str2), long3 = TO_UL(str3)', - ], -}; - -const toUpperDefinition: FunctionDefinition = { - type: 'eval', - name: 'to_upper', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_upper', { - defaultMessage: 'Returns a new string representing the input string converted to upper case.', - }), - alias: undefined, - signatures: [ { params: [ { - name: 'str', - type: 'string', + name: 'first', + type: 'geo_point', optional: false, }, + { + name: 'rest', + type: 'geo_point', + optional: true, + }, ], - returnType: 'string', + returnType: 'geo_point', + minParams: 1, }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: ['ROW message = "Some Text"\n| EVAL message_upper = TO_UPPER(message)'], -}; - -const toVersionDefinition: FunctionDefinition = { - type: 'eval', - name: 'to_version', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.to_version', { - defaultMessage: 'Converts an input string to a version value.', - }), - alias: ['to_ver'], - signatures: [ { params: [ { - name: 'field', - type: 'string', + name: 'first', + type: 'geo_shape', optional: false, }, ], - returnType: 'version', + returnType: 'geo_shape', + minParams: 1, }, { params: [ { - name: 'field', - type: 'version', + name: 'first', + type: 'geo_shape', optional: false, }, + { + name: 'rest', + type: 'geo_shape', + optional: true, + }, ], - returnType: 'version', + returnType: 'geo_shape', + minParams: 1, }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: ['ROW v = TO_VERSION("1.2.3")'], -}; - -const trimDefinition: FunctionDefinition = { - type: 'eval', - name: 'trim', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.trim', { - defaultMessage: 'Removes leading and trailing whitespaces from a string.', - }), - alias: undefined, - signatures: [ { params: [ { - name: 'string', - type: 'string', + name: 'first', + type: 'version', optional: false, }, ], - returnType: 'string', + returnType: 'version', + minParams: 1, }, - ], - supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], - supportedOptions: ['by'], - validate: undefined, - examples: [ - 'ROW message = " some text ", color = " red "\n| EVAL message = TRIM(message)\n| EVAL color = TRIM(color)', - ], -}; - -const caseDefinition: FunctionDefinition = { - type: 'eval', - name: 'case', - description: i18n.translate('kbn-esql-validation-autocomplete.esql.definitions.case', { - defaultMessage: - 'Accepts pairs of conditions and values. The function returns the value that belongs to the first condition that evaluates to `true`. If the number of arguments is odd, the last argument is the default value which is returned when no condition matches.', - }), - alias: undefined, - signatures: [ { params: [ { - name: 'condition', - type: 'boolean', + name: 'first', + type: 'version', + optional: false, }, { - name: 'value', - type: 'any', + name: 'rest', + type: 'version', + optional: true, }, ], - minParams: 2, - returnType: 'any', + returnType: 'version', + minParams: 1, }, ], supportedCommands: ['stats', 'eval', 'where', 'row', 'sort'], supportedOptions: ['by'], validate: undefined, - examples: [ - 'from index | eval type = case(languages <= 1, "monolingual", languages <= 2, "bilingual", "polyglot")', - ], + examples: ['ROW a=null, b="b"\n| EVAL COALESCE(a, b)'], }; export const evalFunctionDefinitions = [ absDefinition, @@ -4564,7 +4757,6 @@ export const evalFunctionDefinitions = [ cbrtDefinition, ceilDefinition, cidrMatchDefinition, - coalesceDefinition, concatDefinition, cosDefinition, coshDefinition, @@ -4578,6 +4770,7 @@ export const evalFunctionDefinitions = [ floorDefinition, fromBase64Definition, greatestDefinition, + ipPrefixDefinition, leastDefinition, leftDefinition, lengthDefinition, @@ -4585,6 +4778,7 @@ export const evalFunctionDefinitions = [ logDefinition, log10Definition, ltrimDefinition, + mvAppendDefinition, mvAvgDefinition, mvConcatDefinition, mvCountDefinition, @@ -4641,4 +4835,5 @@ export const evalFunctionDefinitions = [ toVersionDefinition, trimDefinition, caseDefinition, + coalesceDefinition, ]; diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json index 08fcd159d2be5c..3315ead65d9e9c 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json +++ b/packages/kbn-esql-validation-autocomplete/src/validation/esql_validation_meta_tests.json @@ -9886,61 +9886,6 @@ "error": [], "warning": [] }, - { - "query": "row var = coalesce(\"a\")", - "error": [], - "warning": [] - }, - { - "query": "row coalesce(\"a\")", - "error": [], - "warning": [] - }, - { - "query": "from a_index | eval var = coalesce(stringField)", - "error": [], - "warning": [] - }, - { - "query": "from a_index | eval coalesce(stringField)", - "error": [], - "warning": [] - }, - { - "query": "from a_index | sort coalesce(stringField)", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(true)", - "error": [], - "warning": [] - }, - { - "query": "row coalesce(true)", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(to_boolean(true))", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(true, true)", - "error": [], - "warning": [] - }, - { - "query": "row coalesce(true, true)", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(to_boolean(true), to_boolean(true))", - "error": [], - "warning": [] - }, { "query": "row var = coalesce(5)", "error": [], @@ -9972,437 +9917,412 @@ "warning": [] }, { - "query": "row var = coalesce(to_string(true))", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(\"a\", \"a\")", - "error": [], - "warning": [] - }, - { - "query": "row coalesce(\"a\", \"a\")", - "error": [], - "warning": [] - }, - { - "query": "row var = coalesce(to_string(true), to_string(true))", - "error": [], - "warning": [] - }, - { - "query": "from a_index | where coalesce(numberField) > 0", + "query": "row var = coalesce(now())", "error": [], "warning": [] }, { - "query": "from a_index | where coalesce(numberField, numberField) > 0", + "query": "row coalesce(now())", "error": [], "warning": [] }, { - "query": "from a_index | where length(coalesce(stringField)) > 0", + "query": "row var = coalesce(to_datetime(now()))", "error": [], "warning": [] }, { - "query": "from a_index | where length(coalesce(stringField, stringField)) > 0", + "query": "row var = coalesce(now(), now())", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(booleanField)", + "query": "row coalesce(now(), now())", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(booleanField)", + "query": "row var = coalesce(to_datetime(now()), to_datetime(now()))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_boolean(booleanField))", + "query": "row var = coalesce(\"a\")", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(booleanField, booleanField)", + "query": "row coalesce(\"a\")", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(booleanField, booleanField)", + "query": "row var = coalesce(to_string(true))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_boolean(booleanField), to_boolean(booleanField))", + "query": "row var = coalesce(\"a\", \"a\")", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(numberField)", + "query": "row coalesce(\"a\", \"a\")", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(numberField)", + "query": "row var = coalesce(to_string(true), to_string(true))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_integer(booleanField))", + "query": "row var = coalesce(true)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(numberField, numberField)", + "query": "row coalesce(true)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(numberField, numberField)", + "query": "row var = coalesce(to_boolean(true))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_integer(booleanField), to_integer(booleanField))", + "query": "row var = coalesce(true, true)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_string(booleanField))", + "query": "row coalesce(true, true)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(stringField, stringField)", + "query": "row var = coalesce(to_boolean(true), to_boolean(true))", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(stringField, stringField)", + "query": "row var = coalesce(to_ip(\"127.0.0.1\"))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_string(booleanField), to_string(booleanField))", + "query": "row coalesce(to_ip(\"127.0.0.1\"))", "error": [], "warning": [] }, { - "query": "from a_index | sort coalesce(booleanField)", + "query": "row var = coalesce(to_ip(to_ip(\"127.0.0.1\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(5, true)", + "query": "row var = coalesce(to_ip(\"127.0.0.1\"), to_ip(\"127.0.0.1\"))", "error": [], "warning": [] }, { - "query": "row coalesce(5, true)", + "query": "row coalesce(to_ip(\"127.0.0.1\"), to_ip(\"127.0.0.1\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_integer(true), to_boolean(true))", + "query": "row var = coalesce(to_ip(to_ip(\"127.0.0.1\")), to_ip(to_ip(\"127.0.0.1\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(now())", + "query": "row var = coalesce(to_cartesianpoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row coalesce(now())", + "query": "row coalesce(to_cartesianpoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_datetime(now()))", + "query": "row var = coalesce(to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(now(), true)", + "query": "row var = coalesce(to_cartesianpoint(\"POINT (30 10)\"), to_cartesianpoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row coalesce(now(), true)", + "query": "row coalesce(to_cartesianpoint(\"POINT (30 10)\"), to_cartesianpoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_datetime(now()), to_boolean(true))", + "query": "row var = coalesce(to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")), to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(\"a\", true)", + "query": "row var = coalesce(to_cartesianshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row coalesce(\"a\", true)", + "query": "row coalesce(to_cartesianshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_string(true), to_boolean(true))", + "query": "row var = coalesce(to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_ip(\"127.0.0.1\"))", + "query": "row var = coalesce(to_cartesianshape(\"POINT (30 10)\"), to_cartesianshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row coalesce(to_ip(\"127.0.0.1\"))", + "query": "row coalesce(to_cartesianshape(\"POINT (30 10)\"), to_cartesianshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_ip(to_ip(\"127.0.0.1\")))", + "query": "row var = coalesce(to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")), to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_ip(\"127.0.0.1\"), true)", - "error": [], - "warning": [] - }, - { - "query": "row coalesce(to_ip(\"127.0.0.1\"), true)", + "query": "row var = coalesce(to_geopoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_ip(to_ip(\"127.0.0.1\")), to_boolean(true))", + "query": "row coalesce(to_geopoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianpoint(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_geopoint(to_geopoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row coalesce(to_cartesianpoint(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_geopoint(\"POINT (30 10)\"), to_geopoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")))", + "query": "row coalesce(to_geopoint(\"POINT (30 10)\"), to_geopoint(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianpoint(\"POINT (30 10)\"), true)", + "query": "row var = coalesce(to_geopoint(to_geopoint(\"POINT (30 10)\")), to_geopoint(to_geopoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row coalesce(to_cartesianpoint(\"POINT (30 10)\"), true)", + "query": "row var = coalesce(to_geoshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")), to_boolean(true))", + "query": "row coalesce(to_geoshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianshape(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_geoshape(to_geopoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row coalesce(to_cartesianshape(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_geoshape(\"POINT (30 10)\"), to_geoshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")))", + "query": "row coalesce(to_geoshape(\"POINT (30 10)\"), to_geoshape(\"POINT (30 10)\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianshape(\"POINT (30 10)\"), true)", + "query": "row var = coalesce(to_geoshape(to_geopoint(\"POINT (30 10)\")), to_geoshape(to_geopoint(\"POINT (30 10)\")))", "error": [], "warning": [] }, { - "query": "row coalesce(to_cartesianshape(\"POINT (30 10)\"), true)", + "query": "row var = coalesce(to_version(\"1.0.0\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")), to_boolean(true))", + "query": "row coalesce(to_version(\"1.0.0\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geopoint(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_version(\"a\"))", "error": [], "warning": [] }, { - "query": "row coalesce(to_geopoint(\"POINT (30 10)\"))", + "query": "row var = coalesce(to_version(\"1.0.0\"), to_version(\"1.0.0\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geopoint(to_geopoint(\"POINT (30 10)\")))", + "query": "row coalesce(to_version(\"1.0.0\"), to_version(\"1.0.0\"))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geopoint(\"POINT (30 10)\"), true)", + "query": "row var = coalesce(to_version(\"a\"), to_version(\"a\"))", "error": [], "warning": [] }, { - "query": "row coalesce(to_geopoint(\"POINT (30 10)\"), true)", + "query": "from a_index | where coalesce(numberField) > 0", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geopoint(to_geopoint(\"POINT (30 10)\")), to_boolean(true))", + "query": "from a_index | where coalesce(numberField, numberField) > 0", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geoshape(\"POINT (30 10)\"))", + "query": "from a_index | where length(coalesce(stringField)) > 0", "error": [], "warning": [] }, { - "query": "row coalesce(to_geoshape(\"POINT (30 10)\"))", + "query": "from a_index | where length(coalesce(stringField, stringField)) > 0", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geoshape(to_geopoint(\"POINT (30 10)\")))", + "query": "from a_index | eval var = coalesce(numberField)", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geoshape(\"POINT (30 10)\"), true)", + "query": "from a_index | eval coalesce(numberField)", "error": [], "warning": [] }, { - "query": "row coalesce(to_geoshape(\"POINT (30 10)\"), true)", + "query": "from a_index | eval var = coalesce(to_integer(booleanField))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_geoshape(to_geopoint(\"POINT (30 10)\")), to_boolean(true))", + "query": "from a_index | eval var = coalesce(numberField, numberField)", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_version(\"1.0.0\"))", + "query": "from a_index | eval coalesce(numberField, numberField)", "error": [], "warning": [] }, { - "query": "row coalesce(to_version(\"1.0.0\"))", + "query": "from a_index | eval var = coalesce(to_integer(booleanField), to_integer(booleanField))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_version(\"a\"))", + "query": "from a_index | eval var = coalesce(dateField)", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_version(\"1.0.0\"), true)", + "query": "from a_index | eval coalesce(dateField)", "error": [], "warning": [] }, { - "query": "row coalesce(to_version(\"1.0.0\"), true)", + "query": "from a_index | eval var = coalesce(to_datetime(dateField))", "error": [], "warning": [] }, { - "query": "row var = coalesce(to_version(\"a\"), to_boolean(true))", + "query": "from a_index | eval var = coalesce(dateField, dateField)", "error": [], "warning": [] }, { - "query": "from a_index | where coalesce(numberField, booleanField) > 0", + "query": "from a_index | eval coalesce(dateField, dateField)", "error": [], "warning": [] }, { - "query": "from a_index | where length(coalesce(stringField, booleanField)) > 0", + "query": "from a_index | eval var = coalesce(to_datetime(dateField), to_datetime(dateField))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(numberField, booleanField)", + "query": "from a_index | eval var = coalesce(stringField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(numberField, booleanField)", + "query": "from a_index | eval coalesce(stringField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_integer(booleanField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_string(booleanField))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(dateField)", + "query": "from a_index | eval var = coalesce(stringField, stringField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(dateField)", + "query": "from a_index | eval coalesce(stringField, stringField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_datetime(dateField))", + "query": "from a_index | eval var = coalesce(to_string(booleanField), to_string(booleanField))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(dateField, booleanField)", + "query": "from a_index | eval var = coalesce(booleanField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(dateField, booleanField)", + "query": "from a_index | eval coalesce(booleanField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_datetime(dateField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_boolean(booleanField))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(stringField, booleanField)", + "query": "from a_index | eval var = coalesce(booleanField, booleanField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(stringField, booleanField)", + "query": "from a_index | eval coalesce(booleanField, booleanField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_string(booleanField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_boolean(booleanField), to_boolean(booleanField))", "error": [], "warning": [] }, @@ -10422,17 +10342,17 @@ "warning": [] }, { - "query": "from a_index | eval var = coalesce(ipField, booleanField)", + "query": "from a_index | eval var = coalesce(ipField, ipField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(ipField, booleanField)", + "query": "from a_index | eval coalesce(ipField, ipField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_ip(ipField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_ip(ipField), to_ip(ipField))", "error": [], "warning": [] }, @@ -10441,23 +10361,28 @@ "error": [], "warning": [] }, + { + "query": "from a_index | eval coalesce(cartesianPointField)", + "error": [], + "warning": [] + }, { "query": "from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField))", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(cartesianPointField, booleanField)", + "query": "from a_index | eval var = coalesce(cartesianPointField, cartesianPointField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(cartesianPointField, booleanField)", + "query": "from a_index | eval coalesce(cartesianPointField, cartesianPointField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))", "error": [], "warning": [] }, @@ -10477,17 +10402,17 @@ "warning": [] }, { - "query": "from a_index | eval var = coalesce(cartesianShapeField, booleanField)", + "query": "from a_index | eval var = coalesce(cartesianShapeField, cartesianShapeField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(cartesianShapeField, booleanField)", + "query": "from a_index | eval coalesce(cartesianShapeField, cartesianShapeField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_cartesianshape(cartesianPointField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))", "error": [], "warning": [] }, @@ -10507,17 +10432,17 @@ "warning": [] }, { - "query": "from a_index | eval var = coalesce(geoPointField, booleanField)", + "query": "from a_index | eval var = coalesce(geoPointField, geoPointField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(geoPointField, booleanField)", + "query": "from a_index | eval coalesce(geoPointField, geoPointField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_geopoint(geoPointField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_geopoint(geoPointField), to_geopoint(geoPointField))", "error": [], "warning": [] }, @@ -10537,17 +10462,17 @@ "warning": [] }, { - "query": "from a_index | eval var = coalesce(geoShapeField, booleanField)", + "query": "from a_index | eval var = coalesce(geoShapeField, geoShapeField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(geoShapeField, booleanField)", + "query": "from a_index | eval coalesce(geoShapeField, geoShapeField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_geoshape(geoPointField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_geoshape(geoPointField), to_geoshape(geoPointField))", "error": [], "warning": [] }, @@ -10567,17 +10492,17 @@ "warning": [] }, { - "query": "from a_index | eval var = coalesce(versionField, booleanField)", + "query": "from a_index | eval var = coalesce(versionField, versionField)", "error": [], "warning": [] }, { - "query": "from a_index | eval coalesce(versionField, booleanField)", + "query": "from a_index | eval coalesce(versionField, versionField)", "error": [], "warning": [] }, { - "query": "from a_index | eval var = coalesce(to_version(stringField), to_boolean(booleanField))", + "query": "from a_index | eval var = coalesce(to_version(stringField), to_version(stringField))", "error": [], "warning": [] }, @@ -10586,11 +10511,6 @@ "error": [], "warning": [] }, - { - "query": "from a_index | eval coalesce(cartesianPointField)", - "error": [], - "warning": [] - }, { "query": "from a_index | eval coalesce(null)", "error": [], @@ -25322,6 +25242,408 @@ "query": "row nullVar = null | eval to_base64(nullVar)", "error": [], "warning": [] + }, + { + "query": "row var = ip_prefix(to_ip(\"127.0.0.1\"), 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row ip_prefix(to_ip(\"127.0.0.1\"), 5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = ip_prefix(to_ip(to_ip(\"127.0.0.1\")), to_integer(true), to_integer(true))", + "error": [], + "warning": [] + }, + { + "query": "row var = ip_prefix(true, true, true)", + "error": [ + "Argument of [ip_prefix] must be [ip], found value [true] type [boolean]", + "Argument of [ip_prefix] must be [number], found value [true] type [boolean]", + "Argument of [ip_prefix] must be [number], found value [true] type [boolean]" + ], + "warning": [] + }, + { + "query": "from a_index | eval var = ip_prefix(ipField, numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ip_prefix(ipField, numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = ip_prefix(to_ip(ipField), to_integer(booleanField), to_integer(booleanField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ip_prefix(booleanField, booleanField, booleanField)", + "error": [ + "Argument of [ip_prefix] must be [ip], found value [booleanField] type [boolean]", + "Argument of [ip_prefix] must be [number], found value [booleanField] type [boolean]", + "Argument of [ip_prefix] must be [number], found value [booleanField] type [boolean]" + ], + "warning": [] + }, + { + "query": "from a_index | eval ip_prefix(ipField, numberField, numberField, extraArg)", + "error": [ + "Error: [ip_prefix] function expects exactly 3 arguments, got 4." + ], + "warning": [] + }, + { + "query": "from a_index | sort ip_prefix(ipField, numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval ip_prefix(null, null, null)", + "error": [], + "warning": [] + }, + { + "query": "row nullVar = null | eval ip_prefix(nullVar, nullVar, nullVar)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(true, true)", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(true, true)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_boolean(true), to_boolean(true))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_cartesianpoint(\"POINT (30 10)\"), to_cartesianpoint(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_cartesianpoint(\"POINT (30 10)\"), to_cartesianpoint(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")), to_cartesianpoint(to_cartesianpoint(\"POINT (30 10)\")))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_cartesianshape(\"POINT (30 10)\"), to_cartesianshape(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_cartesianshape(\"POINT (30 10)\"), to_cartesianshape(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")), to_cartesianshape(to_cartesianpoint(\"POINT (30 10)\")))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(now(), now())", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(now(), now())", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_datetime(now()), to_datetime(now()))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(5, 5)", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_integer(true), to_integer(true))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_geopoint(\"POINT (30 10)\"), to_geopoint(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_geopoint(\"POINT (30 10)\"), to_geopoint(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_geopoint(to_geopoint(\"POINT (30 10)\")), to_geopoint(to_geopoint(\"POINT (30 10)\")))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_geoshape(\"POINT (30 10)\"), to_geoshape(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_geoshape(\"POINT (30 10)\"), to_geoshape(\"POINT (30 10)\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_geoshape(to_geopoint(\"POINT (30 10)\")), to_geoshape(to_geopoint(\"POINT (30 10)\")))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_ip(\"127.0.0.1\"), to_ip(\"127.0.0.1\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_ip(\"127.0.0.1\"), to_ip(\"127.0.0.1\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_ip(to_ip(\"127.0.0.1\")), to_ip(to_ip(\"127.0.0.1\")))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(\"a\", \"a\")", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_string(true), to_string(true))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_version(\"1.0.0\"), to_version(\"1.0.0\"))", + "error": [], + "warning": [] + }, + { + "query": "row mv_append(to_version(\"1.0.0\"), to_version(\"1.0.0\"))", + "error": [], + "warning": [] + }, + { + "query": "row var = mv_append(to_version(\"a\"), to_version(\"a\"))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where mv_append(numberField, numberField) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | where length(mv_append(stringField, stringField)) > 0", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(booleanField, booleanField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(booleanField, booleanField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_boolean(booleanField), to_boolean(booleanField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(cartesianPointField, cartesianPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(cartesianPointField, cartesianPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(cartesianShapeField, cartesianShapeField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(cartesianShapeField, cartesianShapeField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(dateField, dateField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_datetime(dateField), to_datetime(dateField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(numberField, numberField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_integer(booleanField), to_integer(booleanField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(geoPointField, geoPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(geoPointField, geoPointField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_geopoint(geoPointField), to_geopoint(geoPointField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(geoShapeField, geoShapeField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(geoShapeField, geoShapeField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_geoshape(geoPointField), to_geoshape(geoPointField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(ipField, ipField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(ipField, ipField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_ip(ipField), to_ip(ipField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(stringField, stringField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_string(booleanField), to_string(booleanField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(versionField, versionField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(versionField, versionField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval var = mv_append(to_version(stringField), to_version(stringField))", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(booleanField, booleanField, extraArg)", + "error": [ + "Error: [mv_append] function expects exactly 2 arguments, got 3." + ], + "warning": [] + }, + { + "query": "from a_index | sort mv_append(booleanField, booleanField)", + "error": [], + "warning": [] + }, + { + "query": "from a_index | eval mv_append(null, null)", + "error": [], + "warning": [] + }, + { + "query": "row nullVar = null | eval mv_append(nullVar, nullVar)", + "error": [], + "warning": [] } ] } \ No newline at end of file diff --git a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts index 2ec3e2b5bbb6f5..88e84aa66f2c85 100644 --- a/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts +++ b/packages/kbn-esql-validation-autocomplete/src/validation/validation.test.ts @@ -2417,197 +2417,193 @@ describe('validation logic', () => { }); describe('coalesce', () => { - testErrorsAndWarnings('row var = coalesce("a")', []); - testErrorsAndWarnings('row coalesce("a")', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(stringField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(stringField)', []); - testErrorsAndWarnings('from a_index | sort coalesce(stringField)', []); - testErrorsAndWarnings('row var = coalesce(true)', []); - testErrorsAndWarnings('row coalesce(true)', []); - testErrorsAndWarnings('row var = coalesce(to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce(true, true)', []); - testErrorsAndWarnings('row coalesce(true, true)', []); - testErrorsAndWarnings('row var = coalesce(to_boolean(true), to_boolean(true))', []); testErrorsAndWarnings('row var = coalesce(5)', []); testErrorsAndWarnings('row coalesce(5)', []); testErrorsAndWarnings('row var = coalesce(to_integer(true))', []); testErrorsAndWarnings('row var = coalesce(5, 5)', []); testErrorsAndWarnings('row coalesce(5, 5)', []); testErrorsAndWarnings('row var = coalesce(to_integer(true), to_integer(true))', []); + testErrorsAndWarnings('row var = coalesce(now())', []); + testErrorsAndWarnings('row coalesce(now())', []); + testErrorsAndWarnings('row var = coalesce(to_datetime(now()))', []); + testErrorsAndWarnings('row var = coalesce(now(), now())', []); + testErrorsAndWarnings('row coalesce(now(), now())', []); + testErrorsAndWarnings('row var = coalesce(to_datetime(now()), to_datetime(now()))', []); + testErrorsAndWarnings('row var = coalesce("a")', []); + testErrorsAndWarnings('row coalesce("a")', []); testErrorsAndWarnings('row var = coalesce(to_string(true))', []); testErrorsAndWarnings('row var = coalesce("a", "a")', []); testErrorsAndWarnings('row coalesce("a", "a")', []); testErrorsAndWarnings('row var = coalesce(to_string(true), to_string(true))', []); - - testErrorsAndWarnings('from a_index | where coalesce(numberField) > 0', []); - - testErrorsAndWarnings('from a_index | where coalesce(numberField, numberField) > 0', []); - - testErrorsAndWarnings('from a_index | where length(coalesce(stringField)) > 0', []); + testErrorsAndWarnings('row var = coalesce(true)', []); + testErrorsAndWarnings('row coalesce(true)', []); + testErrorsAndWarnings('row var = coalesce(to_boolean(true))', []); + testErrorsAndWarnings('row var = coalesce(true, true)', []); + testErrorsAndWarnings('row coalesce(true, true)', []); + testErrorsAndWarnings('row var = coalesce(to_boolean(true), to_boolean(true))', []); + testErrorsAndWarnings('row var = coalesce(to_ip("127.0.0.1"))', []); + testErrorsAndWarnings('row coalesce(to_ip("127.0.0.1"))', []); + testErrorsAndWarnings('row var = coalesce(to_ip(to_ip("127.0.0.1")))', []); + testErrorsAndWarnings('row var = coalesce(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); + testErrorsAndWarnings('row coalesce(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); testErrorsAndWarnings( - 'from a_index | where length(coalesce(stringField, stringField)) > 0', + 'row var = coalesce(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(booleanField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_boolean(booleanField))', []); - - testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(booleanField, booleanField)', []); + testErrorsAndWarnings('row var = coalesce(to_cartesianpoint("POINT (30 10)"))', []); + testErrorsAndWarnings('row coalesce(to_cartesianpoint("POINT (30 10)"))', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_boolean(booleanField), to_boolean(booleanField))', + 'row var = coalesce(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(numberField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(numberField)', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_integer(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(numberField, numberField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(numberField, numberField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_integer(booleanField), to_integer(booleanField))', + 'row var = coalesce(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(to_string(booleanField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(stringField, stringField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(stringField, stringField)', []); - testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_string(booleanField), to_string(booleanField))', + 'row coalesce(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', [] ); - testErrorsAndWarnings('from a_index | sort coalesce(booleanField)', []); - testErrorsAndWarnings('row var = coalesce(5, true)', []); - testErrorsAndWarnings('row coalesce(5, true)', []); - testErrorsAndWarnings('row var = coalesce(to_integer(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce(now())', []); - testErrorsAndWarnings('row coalesce(now())', []); - testErrorsAndWarnings('row var = coalesce(to_datetime(now()))', []); - testErrorsAndWarnings('row var = coalesce(now(), true)', []); - testErrorsAndWarnings('row coalesce(now(), true)', []); - testErrorsAndWarnings('row var = coalesce(to_datetime(now()), to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce("a", true)', []); - testErrorsAndWarnings('row coalesce("a", true)', []); - testErrorsAndWarnings('row var = coalesce(to_string(true), to_boolean(true))', []); - testErrorsAndWarnings('row var = coalesce(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row coalesce(to_ip("127.0.0.1"))', []); - testErrorsAndWarnings('row var = coalesce(to_ip(to_ip("127.0.0.1")))', []); - testErrorsAndWarnings('row var = coalesce(to_ip("127.0.0.1"), true)', []); - testErrorsAndWarnings('row coalesce(to_ip("127.0.0.1"), true)', []); testErrorsAndWarnings( - 'row var = coalesce(to_ip(to_ip("127.0.0.1")), to_boolean(true))', + 'row var = coalesce(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', [] ); - testErrorsAndWarnings('row var = coalesce(to_cartesianpoint("POINT (30 10)"))', []); - testErrorsAndWarnings('row coalesce(to_cartesianpoint("POINT (30 10)"))', []); + + testErrorsAndWarnings('row var = coalesce(to_cartesianshape("POINT (30 10)"))', []); + testErrorsAndWarnings('row coalesce(to_cartesianshape("POINT (30 10)"))', []); testErrorsAndWarnings( - 'row var = coalesce(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', + 'row var = coalesce(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', [] ); - testErrorsAndWarnings('row var = coalesce(to_cartesianpoint("POINT (30 10)"), true)', []); - testErrorsAndWarnings('row coalesce(to_cartesianpoint("POINT (30 10)"), true)', []); - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_boolean(true))', + 'row var = coalesce(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', [] ); - testErrorsAndWarnings('row var = coalesce(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings('row coalesce(to_cartesianshape("POINT (30 10)"))', []); - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', + 'row coalesce(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', [] ); - testErrorsAndWarnings('row var = coalesce(to_cartesianshape("POINT (30 10)"), true)', []); - testErrorsAndWarnings('row coalesce(to_cartesianshape("POINT (30 10)"), true)', []); - testErrorsAndWarnings( - 'row var = coalesce(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_boolean(true))', + 'row var = coalesce(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', [] ); testErrorsAndWarnings('row var = coalesce(to_geopoint("POINT (30 10)"))', []); testErrorsAndWarnings('row coalesce(to_geopoint("POINT (30 10)"))', []); testErrorsAndWarnings('row var = coalesce(to_geopoint(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = coalesce(to_geopoint("POINT (30 10)"), true)', []); - testErrorsAndWarnings('row coalesce(to_geopoint("POINT (30 10)"), true)', []); testErrorsAndWarnings( - 'row var = coalesce(to_geopoint(to_geopoint("POINT (30 10)")), to_boolean(true))', + 'row var = coalesce(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row coalesce(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = coalesce(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', [] ); testErrorsAndWarnings('row var = coalesce(to_geoshape("POINT (30 10)"))', []); testErrorsAndWarnings('row coalesce(to_geoshape("POINT (30 10)"))', []); testErrorsAndWarnings('row var = coalesce(to_geoshape(to_geopoint("POINT (30 10)")))', []); - testErrorsAndWarnings('row var = coalesce(to_geoshape("POINT (30 10)"), true)', []); - testErrorsAndWarnings('row coalesce(to_geoshape("POINT (30 10)"), true)', []); testErrorsAndWarnings( - 'row var = coalesce(to_geoshape(to_geopoint("POINT (30 10)")), to_boolean(true))', + 'row var = coalesce(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row coalesce(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = coalesce(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', [] ); testErrorsAndWarnings('row var = coalesce(to_version("1.0.0"))', []); testErrorsAndWarnings('row coalesce(to_version("1.0.0"))', []); testErrorsAndWarnings('row var = coalesce(to_version("a"))', []); - testErrorsAndWarnings('row var = coalesce(to_version("1.0.0"), true)', []); - testErrorsAndWarnings('row coalesce(to_version("1.0.0"), true)', []); - testErrorsAndWarnings('row var = coalesce(to_version("a"), to_boolean(true))', []); - testErrorsAndWarnings('from a_index | where coalesce(numberField, booleanField) > 0', []); + testErrorsAndWarnings('row var = coalesce(to_version("1.0.0"), to_version("1.0.0"))', []); + testErrorsAndWarnings('row coalesce(to_version("1.0.0"), to_version("1.0.0"))', []); + testErrorsAndWarnings('row var = coalesce(to_version("a"), to_version("a"))', []); + testErrorsAndWarnings('from a_index | where coalesce(numberField) > 0', []); + testErrorsAndWarnings('from a_index | where coalesce(numberField, numberField) > 0', []); + testErrorsAndWarnings('from a_index | where length(coalesce(stringField)) > 0', []); testErrorsAndWarnings( - 'from a_index | where length(coalesce(stringField, booleanField)) > 0', + 'from a_index | where length(coalesce(stringField, stringField)) > 0', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(numberField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(numberField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(numberField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(numberField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(to_integer(booleanField))', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(numberField, numberField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(numberField, numberField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_integer(booleanField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_integer(booleanField), to_integer(booleanField))', [] ); testErrorsAndWarnings('from a_index | eval var = coalesce(dateField)', []); testErrorsAndWarnings('from a_index | eval coalesce(dateField)', []); testErrorsAndWarnings('from a_index | eval var = coalesce(to_datetime(dateField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(dateField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(dateField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(dateField, dateField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(dateField, dateField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = coalesce(to_datetime(dateField), to_datetime(dateField))', + [] + ); + + testErrorsAndWarnings('from a_index | eval var = coalesce(stringField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(stringField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(to_string(booleanField))', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(stringField, stringField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(stringField, stringField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_datetime(dateField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_string(booleanField), to_string(booleanField))', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(stringField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(stringField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(booleanField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(to_boolean(booleanField))', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(booleanField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(booleanField, booleanField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_string(booleanField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_boolean(booleanField), to_boolean(booleanField))', [] ); testErrorsAndWarnings('from a_index | eval var = coalesce(ipField)', []); testErrorsAndWarnings('from a_index | eval coalesce(ipField)', []); testErrorsAndWarnings('from a_index | eval var = coalesce(to_ip(ipField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(ipField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(ipField, booleanField)', []); - + testErrorsAndWarnings('from a_index | eval var = coalesce(ipField, ipField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(ipField, ipField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_ip(ipField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_ip(ipField), to_ip(ipField))', [] ); - testErrorsAndWarnings('from a_index | eval var = coalesce(cartesianPointField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(cartesianPointField)', []); testErrorsAndWarnings( 'from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField))', @@ -2615,17 +2611,17 @@ describe('validation logic', () => { ); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(cartesianPointField, booleanField)', + 'from a_index | eval var = coalesce(cartesianPointField, cartesianPointField)', [] ); testErrorsAndWarnings( - 'from a_index | eval coalesce(cartesianPointField, booleanField)', + 'from a_index | eval coalesce(cartesianPointField, cartesianPointField)', [] ); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', [] ); @@ -2638,17 +2634,17 @@ describe('validation logic', () => { ); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(cartesianShapeField, booleanField)', + 'from a_index | eval var = coalesce(cartesianShapeField, cartesianShapeField)', [] ); testErrorsAndWarnings( - 'from a_index | eval coalesce(cartesianShapeField, booleanField)', + 'from a_index | eval coalesce(cartesianShapeField, cartesianShapeField)', [] ); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_cartesianshape(cartesianPointField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', [] ); @@ -2656,13 +2652,13 @@ describe('validation logic', () => { testErrorsAndWarnings('from a_index | eval coalesce(geoPointField)', []); testErrorsAndWarnings('from a_index | eval var = coalesce(to_geopoint(geoPointField))', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(geoPointField, booleanField)', + 'from a_index | eval var = coalesce(geoPointField, geoPointField)', [] ); - testErrorsAndWarnings('from a_index | eval coalesce(geoPointField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(geoPointField, geoPointField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_geopoint(geoPointField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_geopoint(geoPointField), to_geopoint(geoPointField))', [] ); @@ -2670,29 +2666,28 @@ describe('validation logic', () => { testErrorsAndWarnings('from a_index | eval coalesce(geoShapeField)', []); testErrorsAndWarnings('from a_index | eval var = coalesce(to_geoshape(geoPointField))', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(geoShapeField, booleanField)', + 'from a_index | eval var = coalesce(geoShapeField, geoShapeField)', [] ); - testErrorsAndWarnings('from a_index | eval coalesce(geoShapeField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(geoShapeField, geoShapeField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_geoshape(geoPointField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_geoshape(geoPointField), to_geoshape(geoPointField))', [] ); testErrorsAndWarnings('from a_index | eval var = coalesce(versionField)', []); testErrorsAndWarnings('from a_index | eval coalesce(versionField)', []); testErrorsAndWarnings('from a_index | eval var = coalesce(to_version(stringField))', []); - testErrorsAndWarnings('from a_index | eval var = coalesce(versionField, booleanField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(versionField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval var = coalesce(versionField, versionField)', []); + testErrorsAndWarnings('from a_index | eval coalesce(versionField, versionField)', []); testErrorsAndWarnings( - 'from a_index | eval var = coalesce(to_version(stringField), to_boolean(booleanField))', + 'from a_index | eval var = coalesce(to_version(stringField), to_version(stringField))', [] ); testErrorsAndWarnings('from a_index | sort coalesce(numberField)', []); - testErrorsAndWarnings('from a_index | eval coalesce(cartesianPointField)', []); testErrorsAndWarnings('from a_index | eval coalesce(null)', []); testErrorsAndWarnings('row nullVar = null | eval coalesce(nullVar)', []); }); @@ -10082,6 +10077,263 @@ describe('validation logic', () => { testErrorsAndWarnings('from a_index | eval to_base64(null)', []); testErrorsAndWarnings('row nullVar = null | eval to_base64(nullVar)', []); }); + + describe('ip_prefix', () => { + testErrorsAndWarnings('row var = ip_prefix(to_ip("127.0.0.1"), 5, 5)', []); + testErrorsAndWarnings('row ip_prefix(to_ip("127.0.0.1"), 5, 5)', []); + + testErrorsAndWarnings( + 'row var = ip_prefix(to_ip(to_ip("127.0.0.1")), to_integer(true), to_integer(true))', + [] + ); + + testErrorsAndWarnings('row var = ip_prefix(true, true, true)', [ + 'Argument of [ip_prefix] must be [ip], found value [true] type [boolean]', + 'Argument of [ip_prefix] must be [number], found value [true] type [boolean]', + 'Argument of [ip_prefix] must be [number], found value [true] type [boolean]', + ]); + + testErrorsAndWarnings( + 'from a_index | eval var = ip_prefix(ipField, numberField, numberField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval ip_prefix(ipField, numberField, numberField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = ip_prefix(to_ip(ipField), to_integer(booleanField), to_integer(booleanField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval ip_prefix(booleanField, booleanField, booleanField)', + [ + 'Argument of [ip_prefix] must be [ip], found value [booleanField] type [boolean]', + 'Argument of [ip_prefix] must be [number], found value [booleanField] type [boolean]', + 'Argument of [ip_prefix] must be [number], found value [booleanField] type [boolean]', + ] + ); + + testErrorsAndWarnings( + 'from a_index | eval ip_prefix(ipField, numberField, numberField, extraArg)', + ['Error: [ip_prefix] function expects exactly 3 arguments, got 4.'] + ); + + testErrorsAndWarnings( + 'from a_index | sort ip_prefix(ipField, numberField, numberField)', + [] + ); + testErrorsAndWarnings('from a_index | eval ip_prefix(null, null, null)', []); + testErrorsAndWarnings('row nullVar = null | eval ip_prefix(nullVar, nullVar, nullVar)', []); + }); + + describe('mv_append', () => { + testErrorsAndWarnings('row var = mv_append(true, true)', []); + testErrorsAndWarnings('row mv_append(true, true)', []); + testErrorsAndWarnings('row var = mv_append(to_boolean(true), to_boolean(true))', []); + + testErrorsAndWarnings( + 'row var = mv_append(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row mv_append(to_cartesianpoint("POINT (30 10)"), to_cartesianpoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_cartesianpoint(to_cartesianpoint("POINT (30 10)")), to_cartesianpoint(to_cartesianpoint("POINT (30 10)")))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row mv_append(to_cartesianshape("POINT (30 10)"), to_cartesianshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_cartesianshape(to_cartesianpoint("POINT (30 10)")), to_cartesianshape(to_cartesianpoint("POINT (30 10)")))', + [] + ); + + testErrorsAndWarnings('row var = mv_append(now(), now())', []); + testErrorsAndWarnings('row mv_append(now(), now())', []); + testErrorsAndWarnings('row var = mv_append(to_datetime(now()), to_datetime(now()))', []); + testErrorsAndWarnings('row var = mv_append(5, 5)', []); + testErrorsAndWarnings('row mv_append(5, 5)', []); + testErrorsAndWarnings('row var = mv_append(to_integer(true), to_integer(true))', []); + + testErrorsAndWarnings( + 'row var = mv_append(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row mv_append(to_geopoint("POINT (30 10)"), to_geopoint("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_geopoint(to_geopoint("POINT (30 10)")), to_geopoint(to_geopoint("POINT (30 10)")))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row mv_append(to_geoshape("POINT (30 10)"), to_geoshape("POINT (30 10)"))', + [] + ); + + testErrorsAndWarnings( + 'row var = mv_append(to_geoshape(to_geopoint("POINT (30 10)")), to_geoshape(to_geopoint("POINT (30 10)")))', + [] + ); + + testErrorsAndWarnings('row var = mv_append(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); + testErrorsAndWarnings('row mv_append(to_ip("127.0.0.1"), to_ip("127.0.0.1"))', []); + + testErrorsAndWarnings( + 'row var = mv_append(to_ip(to_ip("127.0.0.1")), to_ip(to_ip("127.0.0.1")))', + [] + ); + + testErrorsAndWarnings('row var = mv_append("a", "a")', []); + testErrorsAndWarnings('row mv_append("a", "a")', []); + testErrorsAndWarnings('row var = mv_append(to_string(true), to_string(true))', []); + testErrorsAndWarnings('row var = mv_append(to_version("1.0.0"), to_version("1.0.0"))', []); + testErrorsAndWarnings('row mv_append(to_version("1.0.0"), to_version("1.0.0"))', []); + testErrorsAndWarnings('row var = mv_append(to_version("a"), to_version("a"))', []); + testErrorsAndWarnings('from a_index | where mv_append(numberField, numberField) > 0', []); + testErrorsAndWarnings( + 'from a_index | where length(mv_append(stringField, stringField)) > 0', + [] + ); + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(booleanField, booleanField)', + [] + ); + testErrorsAndWarnings('from a_index | eval mv_append(booleanField, booleanField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_boolean(booleanField), to_boolean(booleanField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(cartesianPointField, cartesianPointField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval mv_append(cartesianPointField, cartesianPointField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_cartesianpoint(cartesianPointField), to_cartesianpoint(cartesianPointField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(cartesianShapeField, cartesianShapeField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval mv_append(cartesianShapeField, cartesianShapeField)', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_cartesianshape(cartesianPointField), to_cartesianshape(cartesianPointField))', + [] + ); + + testErrorsAndWarnings('from a_index | eval var = mv_append(dateField, dateField)', []); + testErrorsAndWarnings('from a_index | eval mv_append(dateField, dateField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_datetime(dateField), to_datetime(dateField))', + [] + ); + + testErrorsAndWarnings('from a_index | eval var = mv_append(numberField, numberField)', []); + testErrorsAndWarnings('from a_index | eval mv_append(numberField, numberField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_integer(booleanField), to_integer(booleanField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(geoPointField, geoPointField)', + [] + ); + testErrorsAndWarnings('from a_index | eval mv_append(geoPointField, geoPointField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_geopoint(geoPointField), to_geopoint(geoPointField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(geoShapeField, geoShapeField)', + [] + ); + testErrorsAndWarnings('from a_index | eval mv_append(geoShapeField, geoShapeField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_geoshape(geoPointField), to_geoshape(geoPointField))', + [] + ); + + testErrorsAndWarnings('from a_index | eval var = mv_append(ipField, ipField)', []); + testErrorsAndWarnings('from a_index | eval mv_append(ipField, ipField)', []); + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_ip(ipField), to_ip(ipField))', + [] + ); + testErrorsAndWarnings('from a_index | eval var = mv_append(stringField, stringField)', []); + testErrorsAndWarnings('from a_index | eval mv_append(stringField, stringField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_string(booleanField), to_string(booleanField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(versionField, versionField)', + [] + ); + testErrorsAndWarnings('from a_index | eval mv_append(versionField, versionField)', []); + + testErrorsAndWarnings( + 'from a_index | eval var = mv_append(to_version(stringField), to_version(stringField))', + [] + ); + + testErrorsAndWarnings( + 'from a_index | eval mv_append(booleanField, booleanField, extraArg)', + ['Error: [mv_append] function expects exactly 2 arguments, got 3.'] + ); + + testErrorsAndWarnings('from a_index | sort mv_append(booleanField, booleanField)', []); + testErrorsAndWarnings('from a_index | eval mv_append(null, null)', []); + testErrorsAndWarnings('row nullVar = null | eval mv_append(nullVar, nullVar)', []); + }); }); }); diff --git a/packages/kbn-expandable-flyout/README.md b/packages/kbn-expandable-flyout/README.md index 2baa93ee6058b0..60e07a5cc84ed6 100644 --- a/packages/kbn-expandable-flyout/README.md +++ b/packages/kbn-expandable-flyout/README.md @@ -59,6 +59,8 @@ To control (or mutate) flyout's layout, you can utilize [useExpandableFlyoutApi] - **previousPreviewPanel**: navigate to the previous preview panel - **closeFlyout**: close the flyout +> The expandable flyout propagates the `onClose` callback from the EuiFlyout component. As we recommend having a single instance of the flyout in your application, it's up to the application's code to dispatch the event (through Redux, window events, observable, prop drilling...). + ## Usage To use the expandable flyout in your plugin, first you need wrap your code with the [context provider](https://github.com/elastic/kibana/blob/main/packages/kbn-expandable-flyout/src/context.tsx) at a high enough level as follows: diff --git a/packages/kbn-expandable-flyout/src/index.tsx b/packages/kbn-expandable-flyout/src/index.tsx index b55efac7bec690..7bcfa050fbfa55 100644 --- a/packages/kbn-expandable-flyout/src/index.tsx +++ b/packages/kbn-expandable-flyout/src/index.tsx @@ -31,6 +31,10 @@ export interface ExpandableFlyoutProps extends Omit { * Allows for custom styles to be passed to the EuiFlyout component */ customStyles?: Interpolation; + /** + * Callback function to let application's code the flyout is closed + */ + onClose?: EuiFlyoutProps['onClose']; } /** @@ -93,7 +97,12 @@ export const ExpandableFlyout: React.FC = ({ {...flyoutProps} size={flyoutWidth} ownFocus={false} - onClose={closeFlyout} + onClose={(e) => { + closeFlyout(); + if (flyoutProps.onClose) { + flyoutProps.onClose(e); + } + }} css={customStyles} > , - IKibanaSearchResponse + IKibanaSearchResponse >(searchParams, { strategy: ESQL_SEARCH_STRATEGY, abortSignal: abortController.signal, diff --git a/packages/kbn-openapi-bundler/README.md b/packages/kbn-openapi-bundler/README.md index 0a096b3f281522..cfe165c49c4474 100644 --- a/packages/kbn-openapi-bundler/README.md +++ b/packages/kbn-openapi-bundler/README.md @@ -3,19 +3,22 @@ `@kbn/openapi-bundler` is a tool for transforming multiple OpenAPI specification files (source specs) into a bundled specification file(s) (target spec). The number of resulting bundles depends on a number of versions used in the OpenAPI specification files. The package can be used for API documentation generation purposes. This approach allows you to: -- Abstract away the knowledge of where you keep your OpenAPI specs, how many specs are there, and how to find them. Consumer should only know where result files are located - the bundles. +- Abstract away the knowledge of where you keep your OpenAPI specs, how many specs are there, and how to find them. Consumer should only know where result files (bundles) are located. - Omit internal API endpoints from the bundle. - Omit API endpoints that are hidden behind a feature flag and haven't been released yet. - Omit parts of schemas that are hidden behind a feature flag (e.g. a new property added to an existing response schema). -- Omit custom OpenAPI attributes from the bundle, such as `x-codegen-enabled`, `x-internal`, and `x-modify` (see below). +- Omit custom OpenAPI attributes from the bundle, such as `x-codegen-enabled`, `x-internal`, `x-modify` and `x-labels`. +- Include only dedicated OpenAPI operation objects (a.k.a HTTP verbs) into the result bundle by labeling them via `x-labels` + and using `includeLabels` bundler option, e.g. produce separate ESS and Serverless bundles - Transform the target schema according to the custom OpenAPI attributes, such as `x-modify`. -- Resolve references, inline some of them and merge allOf object schemas for better readability. The bundled file contains only local references and paths. +- Resolve references, inline some of them and merge `allOf` object schemas for better readability. The bundled file contains only local references and paths. +- Group OpenAPI specs by version (OpenAPI's `info.version`) and produce a separate bundle for each group ## Getting started -To let this package help you with bundling your OpenAPI specifications you should have OpenAPI specification describing your API endpoint request and response schemas along with common types used in your API. Refer [@kbn/openapi-generator](../kbn-openapi-generator/README.md) and [OpenAPI 3.0.3](https://swagger.io/specification/v3/) (support for [OpenAPI 3.1.0](https://swagger.io/specification/) is planned to be added soon) for more details. +To let this package help you with bundling your OpenAPI specifications you should have OpenAPI specification describing your API endpoint request and response schemas along with common types used in your API. Refer [@kbn/openapi-generator](../kbn-openapi-generator/README.md) and [OpenAPI 3.0.3](https://swagger.io/specification/v3/) (support for [OpenAPI 3.1.0](https://swagger.io/specification/) is planned to be added later) for more details. -Following recommendations provided in `@kbn/openapi-generator` you should have OpenAPI specs defined under a common folder something like `my-plugin/common/api`. +Following the recommendations provided in `@kbn/openapi-generator` you should have OpenAPI specs defined under a common folder something like `my-plugin/common/api`. Currently package supports only programmatic API. As the next step you need to create a JavaScript script file like below and put it to `my-plugin/scripts/openapi` @@ -29,15 +32,28 @@ const { join, resolve } = require('path'); const ROOT = resolve(__dirname, '../..'); bundle({ - // Root path e.g. plugin root directory - rootDir: ROOT, - // Glob pattern to find OpenAPI specification files, relative to `rootDir` - sourceGlob: './**/*.schema.yaml', + // Glob pattern to find OpenAPI specification files + sourceGlob: join(ROOT, './**/*.schema.yaml'), // Output file path. Absolute or related to the node.js working directory. // It may contain `{version}` placeholder which is optional. `{version}` placeholder - // will be replaced with the bundled specs version or filename will be prepended with - // version when placeholder is omitted, e.g. `2023-10-31-my-plugin.bundled.schema.yaml`. - outputFilePath: join(ROOT, 'target/openapi/my-plugin-{version}.bundled.schema.yaml'), + // will be replaced with the bundled specs version. In case the placeholder is omitted + // resulting bundle's filename will be prepended with a version, + // e.g. `2023-10-31-my-plugin.bundled.schema.yaml`. + outputFilePath: join(ROOT, 'target/openapi/my_bundle_name_{version}.bundled.schema.yaml'), + // OpenAPI info object (excluding `version` field) for the resulting bundle + // It allows to specify custom title like "My Domain API bundle" and description + specInfo: { + title: 'My Domain API bundle', + description: 'My description', + }, + // Bundler options (optional) + options: { + // Optional `includeLabels` allow to produce Serverless dedicated bundle by including only + // OpenAPI operations objects (a.k.a HTTP verbs) labeled with specified labels, e.g. `serverless`. + // It requires labeling relevant operations objects with labels you want to be included, in the example + // below it should be a `serverless` label. + includeLabels: ['serverless'], + }, }); ``` @@ -60,8 +76,10 @@ Finally you should be able to run OpenAPI bundler via yarn openapi:bundle ``` -This command will produce a bundled file `my-plugin/target/openapi/my-plugin.bundled.schema.yaml` containing -all specs matching `./**/*.schema.yaml` glob pattern. +This command will produce one or multiple bundled files like +`my-plugin/target/openapi/my_bundle_name_2023_10_31.bundled.schema.yaml` depending on how many +different versions (OpenAPI's `info.version`) were encountered in the processed bundles. +Produces bundles will contain corresponding specs matching `./**/*.schema.yaml` glob pattern. Here's an example how your source schemas can look like and the expected result @@ -76,6 +94,7 @@ info: paths: /api/path/to/endpoint: get: + x-labels: [ess, serverless] operationId: MyGetEndpoint responses: '200': @@ -97,6 +116,7 @@ info: paths: /api/path/to/endpoint: post: + x-labels: [serverless] x-internal: true operationId: MyPostEndpoint responses: @@ -108,13 +128,16 @@ paths: type: object ``` -And the target spec will look like +And the result bundle generated in `target/openapi/my_bundle_name_2023_10_31.bundled.schema.yaml` +will look like ```yaml openapi: 3.0.3 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: 'My Domain API bundle' + description: 'My description' + version: '2023-10-31' +servers: ... paths: /api/path/to/endpoint: get: @@ -136,17 +159,175 @@ paths: schema: type: object components: - schemas: {} + schemas: + securitySchemes: ... +``` + +## Multiple API versions declared via OpenAPI's `info.version` + +Serverless brought necessity for versioned HTTP API endpoints. We started with a single `2023-10-31` version. In some point +in time a group of API endpoints will need to bumps its version due to incompatible changes. In this case engineers need +to declare new version OpenAPI specs. + +OpenAPI specification doesn't provide a clear way to version API endpoints besides having different path prefix like `v1/`, +`v2/` and etc. De facto standard is to use OpenAPI's `info.version` to specify API endpoints version. [@kbn/openapi-generator](../kbn-openapi-generator/README.md) follows this pattern as well. + +OpenAPI specs bundling brings a challenge related to different API versions. When there is a necessity to bundle OpenAPI specs +describing different API versions then path clashing occurs. It's the case since multiple OpenAPI spec have the same path/HTTP verbs defined. A result bundle can have only one of them. OpenAPI specification doesn't provide a way to adopt HTTP header +versioning Kibana uses. + +To address this problem the bundler produces multiple bundles depending on how many distinct API versions were encountered +in `info.version`. Each bundle's name is prefixed with its version. `outputFilePath` provides flexibility to specify a +placeholder to the version via `{version}`. For example the following bundler configuration + +```js + +bundle({ + ... + outputFilePath: join(ROOT, 'my_path/my_bundle_name_{version}.bundled.schema.yaml'), + ... +}); ``` +will produce as many result bundles in `my_path` as many distinct API version in `info.version` were encountered, e.g. +`my_bundle_name_2023_10_31.bundled.schema.yaml` and `my_bundle_name_2024_01_01.bundled.schema.yaml` if there are only +two distinct version. + ## Supported custom (`x-` prefixed) properties OpenAPI specification allows to define custom properties. They can be used to describe extra functionality that is not covered by the standard OpenAPI Specification. We currently support the following custom properties +- [x-labels](#x-labels) - labels OpenAPI operation objects (a.k.a HTTP verbs), allows to produce separate ESS and Serverless bundles - [x-internal](#x-internal) - marks source spec nodes the bundler must NOT include in the target spec - [x-modify](#x-modify) - marks nodes to be modified by the bundler - [x-inline](#x-inline) - marks reference nodes to be inlined when bundled +### `x-labels` + +`x-labels` custom property allows to label OpenAPI operation objects (a.k.a HTTP verbs) with custom string labels like `label-a` or `myLabelB`. Without specifying bundling options By itself `x-labels` don't affect the resulting bundle. It works in conjunction with bundler's `options.includeXLables`. To tell the bundler which operation objects to include `options.includeXLables` should be set to +labels you expect to be in the resulting bundle. + +The primary goal of this feature is to make possible producing separate ESS and Serverless bundles. Taking this into account all +operation objects should be labeled by using `x-labels` custom property and `ess` and `serverless` labels. + +**Important** If `options.includeXLables` bundler's option is set then bundler will include **only** operation objects having specified labels. Operation objects without `x-labels` custom property or invalid `x-labels` value (an array of strings is expected) will be excluded from the resulting bundle. For example setting `options.includeXLables: ['ess']` will include only operation objects +having `ess` label like `x-labels: [ess]` and `x-labels: [ess, serverless, something-else]`. + +An example source spec looks like the following + +```yaml +openapi: 3.0.3 +info: + title: My endpoint + version: '2023-10-31' + +paths: + /api/path/to/endpoint: + get: + x-labels: [ess, serverless] + operationId: MyGetEndpoint + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + /api/legacy/ess-only/api/endpoint + get: + x-labels: [ess] + operationId: MyGetEndpoint + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object +``` + +And the bundler configurations to bundle ESS and Serverless separately will look like + +```js +bundle({ + sourceGlob: join(ROOT, './**/*.schema.yaml'), + outputFilePath: join( + ROOT, + 'target/openapi/serverless/my_bundle_name_{version}.bundled.schema.yaml' + ), + options: { + includeLabels: ['serverless'], + }, +}); + +bundle({ + sourceGlob: join(ROOT, './**/*.schema.yaml'), + outputFilePath: join(ROOT, 'target/openapi/ess/my_bundle_name_{version}.bundled.schema.yaml'), + options: { + includeLabels: ['ess'], + }, +}); +``` + +After running the above script the bundler will produce the following bundles + +- `target/openapi/serverless/my_bundle_name_2023_10_31.bundled.schema.yaml` + +```yaml +openapi: 3.0.3 +info: + title: Bundled OpenAPI specs + version: '2023-10-31' +servers: ... +paths: + /api/path/to/endpoint: + get: + operationId: MyGetEndpoint + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object +components: + schemas: + securitySchemes: ... +``` + +- `target/openapi/ess/my_bundle_name_2023_10_31.bundled.schema.yaml` + +```yaml +openapi: 3.0.3 +info: + title: Bundled OpenAPI specs + version: '2023-10-31' +servers: ... +paths: + /api/path/to/endpoint: + get: + operationId: MyGetEndpoint + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object + post: + operationId: MyPostEndpoint + responses: + '200': + description: Successful response + content: + application/json: + schema: + type: object +components: + schemas: + securitySchemes: ... +``` + ### `x-internal` Marks source spec nodes the bundler must NOT include in the target spec. @@ -188,13 +369,13 @@ paths: type: object ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.3 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: get: @@ -244,13 +425,13 @@ components: type: object ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.3 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: get: @@ -303,13 +484,13 @@ paths: - param2 ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.0 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: patch: @@ -354,13 +535,13 @@ paths: type: number ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.0 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: patch: @@ -416,13 +597,13 @@ components: - param2 ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.0 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: patch: @@ -478,13 +659,13 @@ components: type: object ``` -The target spec will look like +The result bundle will look like ```yaml openapi: 3.0.3 info: - title: Bundled specs file. See individual paths.verb.tags for details - version: not applicable + title: Bundled OpenAPI specs + version: '2023-10-31' paths: /api/path/to/endpoint: post: @@ -497,3 +678,19 @@ paths: schema: type: object ``` + +## Contribution + +In case you decide to contribute to the `kbn-openapi-bundler` package please make sure to add and/or update existing e2e test in `kbn-openapi-bundler/tests` folder. + +To run package tests use the following command in the repo root folder + +```bash +yarn test:jest packages/kbn-openapi-bundler +``` + +Jest watch mode can be enabled by passing `--watch` flag + +```bash +yarn test:jest packages/kbn-openapi-bundler --watch +``` diff --git a/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts b/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts index 502ede318ca6d0..ca53afffdf010e 100644 --- a/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts +++ b/packages/kbn-openapi-bundler/src/bundler/bundle_document.ts @@ -7,23 +7,25 @@ */ import { isAbsolute } from 'path'; -import { RefResolver } from './ref_resolver'; -import { processDocument } from './process_document'; -import { BundleRefProcessor } from './document_processors/bundle_refs'; -import { createSkipNodeWithInternalPropProcessor } from './document_processors/skip_node_with_internal_prop'; -import { createModifyPartialProcessor } from './document_processors/modify_partial'; -import { createSkipInternalPathProcessor } from './document_processors/skip_internal_path'; -import { ResolvedDocument, ResolvedRef } from './types'; -import { createRemovePropsProcessor } from './document_processors/remove_props'; -import { createModifyRequiredProcessor } from './document_processors/modify_required'; -import { X_CODEGEN_ENABLED, X_INLINE, X_INTERNAL, X_MODIFY } from './known_custom_props'; -import { RemoveUnusedComponentsProcessor } from './document_processors/remove_unused_components'; +import { RefResolver } from './ref_resolver/ref_resolver'; +import { processDocument } from './process_document/process_document'; +import { X_CODEGEN_ENABLED, X_INLINE, X_INTERNAL, X_LABELS, X_MODIFY } from './known_custom_props'; import { isPlainObjectType } from '../utils/is_plain_object_type'; +import { ResolvedDocument } from './ref_resolver/resolved_document'; +import { ResolvedRef } from './ref_resolver/resolved_ref'; +import { createSkipNodeWithInternalPropProcessor } from './process_document/document_processors/skip_node_with_internal_prop'; +import { createSkipInternalPathProcessor } from './process_document/document_processors/skip_internal_path'; +import { createModifyPartialProcessor } from './process_document/document_processors/modify_partial'; +import { createModifyRequiredProcessor } from './process_document/document_processors/modify_required'; +import { createRemovePropsProcessor } from './process_document/document_processors/remove_props'; import { createFlattenFoldedAllOfItemsProcessor, createMergeNonConflictingAllOfItemsProcessor, createUnfoldSingleAllOfItemProcessor, -} from './document_processors/reduce_all_of_items'; +} from './process_document/document_processors/reduce_all_of_items'; +import { createIncludeLabelsProcessor } from './process_document/document_processors/include_labels'; +import { BundleRefProcessor } from './process_document/document_processors/bundle_refs'; +import { RemoveUnusedComponentsProcessor } from './process_document/document_processors/remove_unused_components'; export class SkipException extends Error { constructor(public documentPath: string, message: string) { @@ -35,6 +37,10 @@ export interface BundledDocument extends ResolvedDocument { bundledRefs: ResolvedRef[]; } +interface BundleDocumentOptions { + includeLabels?: string[]; +} + /** * Bundles document into one file and performs appropriate document modifications. * @@ -49,7 +55,10 @@ export interface BundledDocument extends ResolvedDocument { * @param absoluteDocumentPath document's absolute path * @returns bundled document */ -export async function bundleDocument(absoluteDocumentPath: string): Promise { +export async function bundleDocument( + absoluteDocumentPath: string, + options?: BundleDocumentOptions +): Promise { if (!isAbsolute(absoluteDocumentPath)) { throw new Error( `bundleDocument expects an absolute document path but got "${absoluteDocumentPath}"` @@ -69,18 +78,26 @@ export async function bundleDocument(absoluteDocumentPath: string): Promise; diff --git a/packages/kbn-openapi-bundler/src/bundler/known_custom_props.ts b/packages/kbn-openapi-bundler/src/bundler/known_custom_props.ts index 4a1832a62bce05..53f105a6e6c35c 100644 --- a/packages/kbn-openapi-bundler/src/bundler/known_custom_props.ts +++ b/packages/kbn-openapi-bundler/src/bundler/known_custom_props.ts @@ -8,16 +8,18 @@ /** * `x-internal: true` marks nodes the bundler must NOT include in the result bundled document. Any other values are ignored. + * See README for more details. */ export const X_INTERNAL = 'x-internal'; /** - * `x-internal: true` marks reference nodes the bundler must inline in the result bundled document. + * `x-inline: true` marks reference nodes the bundler must inline in the result bundled document. + * See README for more details. */ export const X_INLINE = 'x-inline'; /** - * `x-modify` marks nodes to be modified by the bundler. `partial` and `required` values are supported. + * `x-modify` marks nodes to be modified by the bundler. `partial` and `required` values are supported. See README for more details. * * - `partial` leads to removing `required` property making params under `properties` optional * - `required` leads to adding or extending `required` property by adding all param names under `properties` @@ -29,3 +31,9 @@ export const X_MODIFY = 'x-modify'; * in result bundled document. */ export const X_CODEGEN_ENABLED = 'x-codegen-enabled'; + +/** + * `x-labels` allows to mark operation objects with arbitrary labels. It allows to exclude or include nodes + * marked with specific labels into the resulting bundle. See README for more details. + */ +export const X_LABELS = 'x-labels'; diff --git a/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts index 72f55645fa717b..e7379c05b5b6e3 100644 --- a/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts +++ b/packages/kbn-openapi-bundler/src/bundler/merge_documents/merge_shared_components.ts @@ -10,7 +10,7 @@ import { OpenAPIV3 } from 'openapi-types'; import deepEqual from 'fast-deep-equal'; import chalk from 'chalk'; import { insertRefByPointer } from '../../utils/insert_by_json_pointer'; -import { ResolvedRef } from '../types'; +import { ResolvedRef } from '../ref_resolver/resolved_ref'; import { BundledDocument } from '../bundle_document'; export function mergeSharedComponents( diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts b/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts deleted file mode 100644 index fd6e73d4272c6a..00000000000000 --- a/packages/kbn-openapi-bundler/src/bundler/process_document.test.ts +++ /dev/null @@ -1,230 +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 { processDocument } from './process_document'; -import { RefResolver } from './ref_resolver'; -import { Document, DocumentNodeProcessor } from './types'; - -jest.mock('./ref_resolver'); - -describe('processDocument', () => { - it('invokes processors in the provided order', async () => { - const resolvedDocument = { - absolutePath: '/path/to/document', - document: {} as Document, - }; - const calls: string[] = []; - const processor1: DocumentNodeProcessor = { - onNodeLeave() { - calls.push('processor1'); - }, - }; - const processor2: DocumentNodeProcessor = { - onNodeLeave() { - calls.push('processor2'); - }, - }; - - processDocument(resolvedDocument, new RefResolver(), [processor1, processor2]); - - expect(calls).toEqual(['processor1', 'processor2']); - }); - - it('invokes callbacks in expected order (enter -> ref -> leave)', async () => { - const document = { - id: 'root', - t1: { - id: 't1', - $ref: '#/TestRef', - }, - }; - const calls: string[] = []; - const refResolver = new RefResolver(); - const processor: DocumentNodeProcessor = { - onNodeEnter(node) { - calls.push(`enter - ${(node as NodeWithId).id}`); - }, - shouldRemove(node) { - calls.push(`shouldRemove - ${(node as NodeWithId).id}`); - return false; - }, - onRefNodeLeave(node) { - calls.push(`ref - ${(node as NodeWithId).id}`); - }, - onNodeLeave(node) { - calls.push(`leave - ${(node as NodeWithId).id}`); - }, - }; - - const refNode = { - id: 'TestRef', - bar: 'foo', - }; - - (refResolver.resolveRef as jest.Mock).mockResolvedValue({ - absolutePath: '/path/to/document', - document: { - TestRef: refNode, - }, - refNode, - pointer: '/TestRef', - }); - - await processDocument( - { - absolutePath: '/path/to/document', - document: document as unknown as Document, - }, - refResolver, - [processor] - ); - - expect(calls).toEqual([ - 'shouldRemove - root', - 'enter - root', - 'shouldRemove - t1', - 'enter - t1', - 'shouldRemove - TestRef', - 'enter - TestRef', - 'leave - TestRef', - 'ref - t1', - 'leave - t1', - 'leave - root', - ]); - }); - - it('removes a node after "shouldRemove" callback returned true', async () => { - const nodeToRemove = { - id: 't2', - foo: 'bar', - }; - const document = { - t1: { - id: 't1', - }, - t2: nodeToRemove, - }; - const removeNodeProcessor: DocumentNodeProcessor = { - shouldRemove(node) { - return node === nodeToRemove; - }, - }; - - await processDocument( - { - absolutePath: '/path/to/document', - document: document as unknown as Document, - }, - new RefResolver(), - [removeNodeProcessor] - ); - - expect(document).toEqual({ - t1: { - id: 't1', - }, - }); - }); - - it('handles recursive documents', async () => { - const nodeA: Record = { - foo: 'bar', - }; - const nodeB: Record = { - bar: ' foo', - }; - - nodeA.circular = nodeB; - nodeB.circular = nodeA; - - const document = { - nodeA, - nodeB, - }; - - await processDocument( - { - absolutePath: '/path/to/document', - document: document as unknown as Document, - }, - new RefResolver(), - [] - ); - - expect(document).toBeDefined(); - }); - - it('handles self-recursive references', async () => { - const document = { - node: { - $ref: '#/TestComponentCircular', - }, - TestComponentCircular: { - $ref: '#/TestComponentCircular', - }, - }; - const refResolver = new RefResolver(); - - (refResolver.resolveRef as jest.Mock).mockResolvedValue({ - absolutePath: '/path/to/document', - document, - refNode: { - $ref: '#/TestComponentCircular', - }, - pointer: '/TestComponentCircular', - }); - - await processDocument( - { - absolutePath: '/path/to/document', - document: document as unknown as Document, - }, - refResolver, - [] - ); - - expect(document).toBeDefined(); - }); - - it('handles recursive references', async () => { - const document: Record = { - node: { - $ref: '#/TestComponentCircular', - }, - TestComponentCircular: { - $ref: '#/AnotherTestComponentCircular', - }, - AnotherTestComponentCircular: { - $ref: '#/TestComponentCircular', - }, - }; - const refResolver = new RefResolver(); - - (refResolver.resolveRef as jest.Mock).mockImplementation((_, pointer) => ({ - absolutePath: '/path/to/document', - document, - refNode: document[pointer.slice(1)], - pointer, - })); - - await processDocument( - { - absolutePath: '/path/to/document', - document: document as unknown as Document, - }, - refResolver, - [] - ); - - expect(document).toBeDefined(); - }); -}); - -interface NodeWithId { - id?: string; -} diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/bundle_refs.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/bundle_refs.ts similarity index 84% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/bundle_refs.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/bundle_refs.ts index 976914bcbd3432..76da77cc06b0eb 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/bundle_refs.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/bundle_refs.ts @@ -8,19 +8,16 @@ import deepEqual from 'fast-deep-equal'; import chalk from 'chalk'; -import { - Document, - ResolvedRef, - TraverseDocumentContext, - RefNode, - DocumentNode, - TraverseRootDocumentContext, - DocumentNodeProcessor, -} from '../types'; -import { hasProp } from '../../utils/has_prop'; +import { hasProp } from '../../../utils/has_prop'; import { isChildContext } from '../is_child_context'; -import { insertRefByPointer } from '../../utils/insert_by_json_pointer'; +import { insertRefByPointer } from '../../../utils/insert_by_json_pointer'; import { inlineRef } from './utils/inline_ref'; +import { ResolvedRef } from '../../ref_resolver/resolved_ref'; +import { Document } from '../../document'; +import { DocumentNode, RefNode } from '../types/node'; +import { TraverseDocumentContext, TraverseRootDocumentContext } from '../types/context'; +import { DocumentNodeProcessor } from './types/document_node_processor'; +import { TraverseDocumentNodeContext } from './types/traverse_document_node_context'; /** * Node processor to bundle and conditionally dereference document references. @@ -45,7 +42,11 @@ export class BundleRefProcessor implements DocumentNodeProcessor { } } - onRefNodeLeave(node: RefNode, resolvedRef: ResolvedRef, context: TraverseDocumentContext): void { + onRefNodeLeave( + node: RefNode, + resolvedRef: ResolvedRef, + context: TraverseDocumentNodeContext + ): void { if (!resolvedRef.pointer.startsWith('/components')) { throw new Error( `$ref pointer ${chalk.yellow( diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/include_labels.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/include_labels.ts new file mode 100644 index 00000000000000..6ff92075a58528 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/include_labels.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 { pick } from 'lodash'; +import { logger } from '../../../logger'; +import { hasProp } from '../../../utils/has_prop'; +import { X_LABELS } from '../../known_custom_props'; +import { DocumentNode } from '../types/node'; +import { DocumentNodeProcessor } from './types/document_node_processor'; + +/** + * Creates a node processor to include only OAS operation objects labeled + * with one or more of the provided via `labelsToInclude` labels. + */ +export function createIncludeLabelsProcessor(labelsToInclude: string[]): DocumentNodeProcessor { + if (labelsToInclude.length === 0) { + throw new Error('"labelsToInclude" must have at least one label.'); + } + + const canNodeHaveLabels = (node: Readonly): boolean => { + // Currently, x-labels can be applied only to operations (path + method). + // Each operation object has a `responses` field. + // https://swagger.io/docs/specification/paths-and-operations/ + return 'responses' in node; + }; + const logUnsupportedNodeWarning = (location: string, labelsValue: unknown): void => { + const value = Array.isArray(labelsValue) ? labelsValue.join(', ') : labelsValue; + + logger.warning( + `"${X_LABELS}: ${value}" in ${location} is ignored since "${X_LABELS}" is supported only for Operation objects.` + ); + }; + const logInvalidLabelsValueWarning = (location: string, labelsValue: unknown) => { + logger.warning( + `"${X_LABELS}" in ${location} is ignored since an array of labels is expected but got "${JSON.stringify( + labelsValue + )}".` + ); + }; + const KNOWN_HTTP_METHODS = ['head', 'get', 'post', 'patch', 'put', 'options', 'delete', 'trace']; + + return { + shouldRemove(node, { parentKey }) { + const isValidNode = canNodeHaveLabels(node); + const nodeLabels = X_LABELS in node ? node[X_LABELS] : undefined; + + if (!isValidNode) { + if (nodeLabels) { + // x-labels can't be applied to this node. + // We log a warning, but the node should still be included. + logUnsupportedNodeWarning(parentKey.toString(), nodeLabels); + } + + return false; + } + + if (!nodeLabels) { + return true; + } + + if (!Array.isArray(nodeLabels)) { + // x-labels value is not valid. + // We log a warning and remove the node because it doesn't contain the needed labels. + logInvalidLabelsValueWarning(parentKey.toString(), nodeLabels); + + return true; + } + + const hasAllExpectedLabels = labelsToInclude.every((label) => nodeLabels.includes(label)); + + // if an operation object has all labels from labelsToInclude + // leave it in the resulting bundle by returning `false` + return !hasAllExpectedLabels; + }, + // Empty path objects after excluding all operation objects by `shouldRemove` have to be removed + onNodeLeave(node, { isRootNode }) { + if ( + !isRootNode || + !hasProp(node, 'paths') || + typeof node.paths !== 'object' || + node.paths === null + ) { + return; + } + + for (const [path, pathObject] of Object.entries(node.paths)) { + if (typeof pathObject !== 'object' || pathObject === null) { + continue; + } + + // We need to check HTTP verbs only + // If there are no HTTP verbs the path definition is considered empty + const httpVerbs = pick(pathObject, KNOWN_HTTP_METHODS); + + if (Object.keys(httpVerbs).length === 0) { + delete node.paths[path as keyof typeof node.paths]; + } + } + }, + }; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_partial.ts similarity index 85% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_partial.ts index 5d667eff1bc805..bb532cb130c36d 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_partial.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_partial.ts @@ -6,10 +6,10 @@ * Side Public License, v 1. */ -import { DocumentNodeProcessor } from '../types'; -import { hasProp } from '../../utils/has_prop'; +import { DocumentNodeProcessor } from './types/document_node_processor'; +import { hasProp } from '../../../utils/has_prop'; +import { X_MODIFY } from '../../known_custom_props'; import { inlineRef } from './utils/inline_ref'; -import { X_MODIFY } from '../known_custom_props'; /** * Creates a node processor to modify a node by removing `required` property when diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_required.ts similarity index 88% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_required.ts index 769672d64a39db..fc2b275a457430 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/modify_required.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/modify_required.ts @@ -7,11 +7,11 @@ */ import chalk from 'chalk'; -import { logger } from '../../logger'; -import { isPlainObjectType } from '../../utils/is_plain_object_type'; -import { DocumentNodeProcessor } from '../types'; -import { hasProp } from '../../utils/has_prop'; -import { X_MODIFY } from '../known_custom_props'; +import { logger } from '../../../logger'; +import { isPlainObjectType } from '../../../utils/is_plain_object_type'; +import { hasProp } from '../../../utils/has_prop'; +import { X_MODIFY } from '../../known_custom_props'; +import { DocumentNodeProcessor } from './types/document_node_processor'; import { inlineRef } from './utils/inline_ref'; /** diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts similarity index 95% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts index dcf4b82a42af5d..c4ff7d68e410a5 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/flatten_folded_all_of_items.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DocumentNodeProcessor } from '../../types'; +import { DocumentNodeProcessor } from '../types/document_node_processor'; /** * Creates a node processor to flatten folded `allOf` items. Folded means `allOf` has items diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/index.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/index.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/index.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/index.ts diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts similarity index 96% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts index 87895be952b960..3c6d57d90346ea 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/merge_non_conflicting_all_of_items.ts @@ -9,8 +9,8 @@ import { omit } from 'lodash'; import deepEqual from 'fast-deep-equal'; import { OpenAPIV3 } from 'openapi-types'; -import { isPlainObjectType } from '../../../utils/is_plain_object_type'; -import { DocumentNodeProcessor } from '../../types'; +import { isPlainObjectType } from '../../../../utils/is_plain_object_type'; +import { DocumentNodeProcessor } from '../types/document_node_processor'; type MergedObjectSchema = Required> & Pick; diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts similarity index 94% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts index 67a056091db4c6..f90fa50c716156 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/reduce_all_of_items/unfold_single_all_of_item.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DocumentNodeProcessor } from '../../types'; +import { DocumentNodeProcessor } from '../types/document_node_processor'; /** * Created a node processor to remove/unfold `allOf` with only single item. diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_props.ts similarity index 84% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_props.ts index 02fb2036e2a0c1..c7d890c0a47608 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_props.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_props.ts @@ -6,8 +6,8 @@ * Side Public License, v 1. */ -import { isPlainObjectType } from '../../utils/is_plain_object_type'; -import { DocumentNodeProcessor } from '../types'; +import { isPlainObjectType } from '../../../utils/is_plain_object_type'; +import { DocumentNodeProcessor } from './types/document_node_processor'; /** * Creates a node processor to remove specified by `propNames` properties. diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_unused_components.ts similarity index 80% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_unused_components.ts index 393f986ec5a1ae..f0bb72c34644ce 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/remove_unused_components.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/remove_unused_components.ts @@ -6,9 +6,11 @@ * Side Public License, v 1. */ -import { hasProp } from '../../utils/has_prop'; -import { isPlainObjectType } from '../../utils/is_plain_object_type'; -import { DocumentNodeProcessor, PlainObjectNode, ResolvedRef } from '../types'; +import { hasProp } from '../../../utils/has_prop'; +import { isPlainObjectType } from '../../../utils/is_plain_object_type'; +import { ResolvedRef } from '../../ref_resolver/resolved_ref'; +import { PlainObjectNode } from '../types/node'; +import { DocumentNodeProcessor } from './types/document_node_processor'; /** * Helps to remove unused components. diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_internal_path.ts similarity index 91% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_internal_path.ts index 280002ce13890e..983ee42e9f6445 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_internal_path.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_internal_path.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DocumentNodeProcessor } from '../types'; +import { DocumentNodeProcessor } from './types/document_node_processor'; /** * Creates a node processor to skip paths starting with `/internal` and omit them from the result document. diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_node_with_internal_prop.ts similarity index 90% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_node_with_internal_prop.ts index b674cfb8c0b9c4..e2c03829aa3d06 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/skip_node_with_internal_prop.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/skip_node_with_internal_prop.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { DocumentNodeProcessor } from '../types'; +import { DocumentNodeProcessor } from './types/document_node_processor'; /** * Creates a node processor to skip nodes having provided `skipProperty` property diff --git a/packages/kbn-openapi-bundler/src/bundler/types.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/document_node_processor.ts similarity index 53% rename from packages/kbn-openapi-bundler/src/bundler/types.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/document_node_processor.ts index fa8a7f3c831208..f52c606ccb1104 100644 --- a/packages/kbn-openapi-bundler/src/bundler/types.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/document_node_processor.ts @@ -6,120 +6,9 @@ * Side Public License, v 1. */ -/** - * A plain object node not containing `$ref` property - */ -export type PlainObjectNode = Record; - -/** - * An array node - */ -export type ArrayNode = unknown[]; - -/** - * A ref node containing `$ref` property besides the others - */ -export interface RefNode extends PlainObjectNode { - $ref: string; -} - -/** - * An abstract OpenAPI entry node. Content besides $ref isn't important. - */ -export type DocumentNode = PlainObjectNode | ArrayNode | RefNode; - -/** - * Document abstraction. We don't mind OpenAPI `3.0` and `3.1` differences. - */ -export type Document = Record; - -export interface ResolvedDocument { - /** - * Document's absolute path - */ - absolutePath: string; - /** - * Document's root - */ - document: Document; -} - -export interface ResolvedRef extends ResolvedDocument { - /** - * Parsed pointer without leading hash symbol (e.g. `/components/schemas/MySchema`) - */ - pointer: string; - - /** - * Resolved ref's node pointer points to - */ - refNode: DocumentNode; -} - -export interface TraverseRootDocumentContext { - /** - * Root document - */ - resolvedDocument: ResolvedDocument; - - parentContext?: undefined; - followedRef?: undefined; -} - -export interface TraverseChildDocumentContext { - /** - * Current document after resolving $ref property - */ - resolvedRef: ResolvedRef; - - /** - * Context of the parent document the current one in `document` field was referenced via $ref. Empty if it's the root document. - */ - parentContext: TraverseDocumentContext; - - /** - * Reference used to resolve the current document - */ - followedRef: string; -} - -/** - * Traverse context storing additional information related to the currently traversed node - */ -export type TraverseDocumentContext = TraverseRootDocumentContext | TraverseChildDocumentContext; - -export type TraverseDocumentEntryContext = TraverseDocumentContext & { - parentNode: DocumentNode; - parentKey: string | number; -}; - -/** - * Should remove processor controls whether a node and all its descendants - * should be omitted from the further processing and result document. - * - * When result is - * - * - `true` - omit the node - * - `false` - keep the node - * - */ -export type ShouldRemoveNodeProcessorFn = ( - node: Readonly, - context: TraverseDocumentEntryContext -) => boolean; - -export type OnNodeEntryProcessorFn = ( - node: Readonly, - context: TraverseDocumentEntryContext -) => void; - -export type OnNodeLeaveProcessorFn = (node: DocumentNode, context: TraverseDocumentContext) => void; - -export type OnRefNodeLeaveProcessorFn = ( - node: RefNode, - resolvedRef: ResolvedRef, - context: TraverseDocumentContext -) => void; +import { ResolvedRef } from '../../../ref_resolver/resolved_ref'; +import { DocumentNode, RefNode } from '../../types/node'; +import { TraverseDocumentNodeContext } from './traverse_document_node_context'; /** * OpenAPI tree is traversed in two phases @@ -161,3 +50,31 @@ export interface DocumentNodeProcessor { onNodeLeave?: OnNodeLeaveProcessorFn; onRefNodeLeave?: OnRefNodeLeaveProcessorFn; } + +/** + * Should remove processor controls whether a node and all its descendants + * should be omitted from the further processing and result document. + * + * When result is + * + * - `true` - omit the node + * - `false` - keep the node + * + */ +type ShouldRemoveNodeProcessorFn = ( + node: Readonly, + context: TraverseDocumentNodeContext +) => boolean; + +type OnNodeEntryProcessorFn = ( + node: Readonly, + context: TraverseDocumentNodeContext +) => void; + +type OnNodeLeaveProcessorFn = (node: DocumentNode, context: TraverseDocumentNodeContext) => void; + +type OnRefNodeLeaveProcessorFn = ( + node: RefNode, + resolvedRef: ResolvedRef, + context: TraverseDocumentNodeContext +) => void; diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/traverse_document_node_context.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/traverse_document_node_context.ts new file mode 100644 index 00000000000000..f1db75cd8ba149 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/types/traverse_document_node_context.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { TraverseDocumentContext } from '../../types/context'; +import { DocumentNode } from '../../types/node'; + +export type TraverseDocumentNodeContext = TraverseDocumentContext & { + isRootNode: boolean; + parentNode: DocumentNode; + parentKey: string | number; +}; diff --git a/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/utils/inline_ref.ts similarity index 76% rename from packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/utils/inline_ref.ts index fac6c519980b96..cdd8a57242c878 100644 --- a/packages/kbn-openapi-bundler/src/bundler/document_processors/utils/inline_ref.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/document_processors/utils/inline_ref.ts @@ -6,8 +6,12 @@ * Side Public License, v 1. */ -import { DocumentNode, ResolvedRef } from '../../types'; -import { InlinableRefNode } from '../types'; +import { ResolvedRef } from '../../../ref_resolver/resolved_ref'; +import { DocumentNode } from '../../types/node'; + +interface InlinableRefNode { + $ref?: string; +} export function inlineRef(node: DocumentNode, resolvedRef: ResolvedRef): void { Object.assign(node, resolvedRef.refNode); diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/index.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/index.ts new file mode 100644 index 00000000000000..f32d50b31e21a4 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 * from './process_document'; diff --git a/packages/kbn-openapi-bundler/src/bundler/is_child_context.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/is_child_context.ts similarity index 95% rename from packages/kbn-openapi-bundler/src/bundler/is_child_context.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/is_child_context.ts index f3fe4dde915cfe..a57a0106cc88a4 100644 --- a/packages/kbn-openapi-bundler/src/bundler/is_child_context.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/is_child_context.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { TraverseChildDocumentContext, TraverseDocumentContext } from './types'; +import { TraverseChildDocumentContext, TraverseDocumentContext } from './types/context'; export function isChildContext( context: TraverseDocumentContext diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/process_document.test.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/process_document.test.ts new file mode 100644 index 00000000000000..385ff93b3a1c7d --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/process_document.test.ts @@ -0,0 +1,513 @@ +/* + * Copyright 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 { RefResolver } from '../ref_resolver'; +import { Document } from '../document'; +import { processDocument } from './process_document'; +import { DocumentNodeProcessor } from './document_processors/types/document_node_processor'; + +jest.mock('../ref_resolver'); + +describe('processDocument', () => { + it('invokes processors in the provided order', async () => { + const resolvedDocument = { + absolutePath: '/path/to/document', + document: {} as Document, + }; + const calls: string[] = []; + const processor1: DocumentNodeProcessor = { + onNodeLeave() { + calls.push('processor1'); + }, + }; + const processor2: DocumentNodeProcessor = { + onNodeLeave() { + calls.push('processor2'); + }, + }; + + processDocument(resolvedDocument, new RefResolver(), [processor1, processor2]); + + expect(calls).toEqual(['processor1', 'processor2']); + }); + + it('invokes callbacks in expected order (shouldRemove -> enter -> ref -> leave)', async () => { + const document = { + id: 'root', + t1: { + id: 't1', + $ref: '#/TestRef', + }, + }; + const calls: string[] = []; + const refResolver = new RefResolver(); + const processor: DocumentNodeProcessor = { + onNodeEnter(node) { + calls.push(`enter - ${(node as NodeWithId).id}`); + }, + shouldRemove(node) { + calls.push(`shouldRemove - ${(node as NodeWithId).id}`); + return false; + }, + onRefNodeLeave(node) { + calls.push(`ref - ${(node as NodeWithId).id}`); + }, + onNodeLeave(node) { + calls.push(`leave - ${(node as NodeWithId).id}`); + }, + }; + + const refNode = { + id: 'TestRef', + bar: 'foo', + }; + + (refResolver.resolveRef as jest.Mock).mockResolvedValue({ + absolutePath: '/path/to/document', + document: { + TestRef: refNode, + }, + refNode, + pointer: '/TestRef', + }); + + await processDocument( + { + absolutePath: '/path/to/document', + document: document as unknown as Document, + }, + refResolver, + [processor] + ); + + expect(calls).toEqual([ + 'shouldRemove - root', + 'enter - root', + 'shouldRemove - t1', + 'enter - t1', + 'shouldRemove - TestRef', + 'enter - TestRef', + 'leave - TestRef', + 'ref - t1', + 'leave - t1', + 'leave - root', + ]); + }); + + it('removes a node after "shouldRemove" callback returned true', async () => { + const nodeToRemove = { + id: 't2', + foo: 'bar', + }; + const document = { + t1: { + id: 't1', + }, + t2: nodeToRemove, + }; + const removeNodeProcessor: DocumentNodeProcessor = { + shouldRemove(node) { + return node === nodeToRemove; + }, + }; + + await processDocument( + { + absolutePath: '/path/to/document', + document: document as unknown as Document, + }, + new RefResolver(), + [removeNodeProcessor] + ); + + expect(document).toEqual({ + t1: { + id: 't1', + }, + }); + }); + + it('handles recursive documents', async () => { + const nodeA: Record = { + foo: 'bar', + }; + const nodeB: Record = { + bar: ' foo', + }; + + nodeA.circular = nodeB; + nodeB.circular = nodeA; + + const document = { + nodeA, + nodeB, + }; + + await processDocument( + { + absolutePath: '/path/to/document', + document: document as unknown as Document, + }, + new RefResolver(), + [] + ); + + expect(document).toBeDefined(); + }); + + it('handles self-recursive references', async () => { + const document = { + node: { + $ref: '#/TestComponentCircular', + }, + TestComponentCircular: { + $ref: '#/TestComponentCircular', + }, + }; + const refResolver = new RefResolver(); + + (refResolver.resolveRef as jest.Mock).mockResolvedValue({ + absolutePath: '/path/to/document', + document, + refNode: { + $ref: '#/TestComponentCircular', + }, + pointer: '/TestComponentCircular', + }); + + await processDocument( + { + absolutePath: '/path/to/document', + document: document as unknown as Document, + }, + refResolver, + [] + ); + + expect(document).toBeDefined(); + }); + + it('handles recursive references', async () => { + const document: Record = { + node: { + $ref: '#/TestComponentCircular', + }, + TestComponentCircular: { + $ref: '#/AnotherTestComponentCircular', + }, + AnotherTestComponentCircular: { + $ref: '#/TestComponentCircular', + }, + }; + const refResolver = new RefResolver(); + + (refResolver.resolveRef as jest.Mock).mockImplementation((_, pointer) => ({ + absolutePath: '/path/to/document', + document, + refNode: document[pointer.slice(1)], + pointer, + })); + + await processDocument( + { + absolutePath: '/path/to/document', + document: document as unknown as Document, + }, + refResolver, + [] + ); + + expect(document).toBeDefined(); + }); + + describe('processor', () => { + describe('node', () => { + it('gets a root node', async () => { + const resolvedDocument = { + absolutePath: '/path/to/document', + document: {} as Document, + }; + + expect.assertions(3); + + const processor: DocumentNodeProcessor = { + shouldRemove(node) { + expect(node).toBe(resolvedDocument.document); + + return false; + }, + onNodeEnter(node) { + expect(node).toBe(resolvedDocument.document); + }, + onNodeLeave(node) { + expect(node).toBe(resolvedDocument.document); + }, + }; + + await processDocument(resolvedDocument, new RefResolver(), [processor]); + }); + + it('gets a child node', async () => { + const childNode = { + childNode: true, + }; + const resolvedDocument = { + absolutePath: '/path/to/document', + document: { + child: childNode, + } as Document, + }; + + expect.assertions(3); + + const processor: DocumentNodeProcessor = { + shouldRemove(node) { + if (!('childNode' in node)) { + return false; + } + + expect(node).toBe(childNode); + + return false; + }, + onNodeEnter(node) { + if (!('childNode' in node)) { + return; + } + + expect(node).toBe(childNode); + }, + onNodeLeave(node) { + if (!('childNode' in node)) { + return false; + } + + expect(node).toBe(childNode); + }, + }; + + await processDocument(resolvedDocument, new RefResolver(), [processor]); + }); + + it('gets a ref node', async () => { + const referencingNode = { + $ref: '#/refNode', + }; + const referencedNode = { + refNode: true, + }; + const resolvedDocument = { + absolutePath: '/path/to/document', + document: { + node: referencingNode, + refNode: referencedNode, + } as Document, + }; + + const refResolver = new RefResolver(); + + (refResolver.resolveRef as jest.Mock).mockImplementation((_, pointer) => ({ + absolutePath: '/path/to/document', + document: resolvedDocument.document, + refNode: resolvedDocument.document[pointer.slice(1)], + pointer, + })); + + expect.assertions(1); + + const processor: DocumentNodeProcessor = { + onRefNodeLeave(node, resolvedRef) { + expect(node).toBe(referencingNode); + }, + }; + + await processDocument(resolvedDocument, refResolver, [processor]); + }); + + it('gets a resolved ref', async () => { + const referencingNode = { + $ref: '#/refNode', + }; + const referencedNode = { + refNode: true, + }; + const resolvedDocument = { + absolutePath: '/path/to/document', + document: { + node: referencingNode, + refNode: referencedNode, + } as Document, + }; + + const refResolver = new RefResolver(); + + (refResolver.resolveRef as jest.Mock).mockImplementation((_, pointer) => ({ + absolutePath: '/path/to/document', + document: resolvedDocument.document, + refNode: resolvedDocument.document[pointer.slice(1)], + pointer, + })); + + expect.assertions(1); + + const processor: DocumentNodeProcessor = { + onRefNodeLeave(_, resolvedRef) { + expect(resolvedRef).toEqual({ + absolutePath: '/path/to/document', + document: resolvedDocument.document, + refNode: referencedNode, + pointer: '/refNode', + }); + }, + }; + + await processDocument(resolvedDocument, refResolver, [processor]); + }); + }); + + describe('context', () => { + it('gets a root node context', async () => { + const resolvedDocument = { + absolutePath: '/path/to/document', + document: {} as Document, + }; + + expect.assertions(3); + + const processor: DocumentNodeProcessor = { + shouldRemove(_, context) { + expect(context).toEqual({ + resolvedDocument, + isRootNode: true, + parentKey: '', + parentNode: resolvedDocument.document, + }); + + return false; + }, + onNodeEnter(_, context) { + expect(context).toEqual({ + resolvedDocument, + isRootNode: true, + parentKey: '', + parentNode: resolvedDocument.document, + }); + }, + onNodeLeave(_, context) { + expect(context).toEqual({ + resolvedDocument, + isRootNode: true, + parentKey: '', + parentNode: resolvedDocument.document, + }); + }, + }; + + await processDocument(resolvedDocument, new RefResolver(), [processor]); + }); + + it('gets a child node context', async () => { + const resolvedDocument = { + absolutePath: '/path/to/document', + document: { + childNode: {}, + } as Document, + }; + + expect.assertions(3); + + const processor: DocumentNodeProcessor = { + shouldRemove(_, context) { + if (context.isRootNode === true) { + return false; + } + + expect(context).toEqual({ + resolvedDocument, + isRootNode: false, + parentKey: 'childNode', + parentNode: resolvedDocument.document, + }); + + return false; + }, + onNodeEnter(_, context) { + if (context.isRootNode === true) { + return false; + } + + expect(context).toEqual({ + resolvedDocument, + isRootNode: false, + parentKey: 'childNode', + parentNode: resolvedDocument.document, + }); + }, + onNodeLeave(_, context) { + if (context.isRootNode === true) { + return false; + } + + expect(context).toEqual({ + resolvedDocument, + isRootNode: false, + parentKey: 'childNode', + parentNode: resolvedDocument.document, + }); + }, + }; + + await processDocument(resolvedDocument, new RefResolver(), [processor]); + }); + + it('gets a ref node context', async () => { + const referencingNode = { + $ref: '#/refNode', + }; + const referencedNode = { + refNode: true, + }; + const resolvedDocument = { + absolutePath: '/path/to/document', + document: { + node: referencingNode, + refNode: referencedNode, + } as Document, + }; + + const refResolver = new RefResolver(); + + (refResolver.resolveRef as jest.Mock).mockImplementation((_, pointer) => ({ + absolutePath: '/path/to/document', + document: resolvedDocument.document, + refNode: resolvedDocument.document[pointer.slice(1)], + pointer, + })); + + expect.assertions(1); + + const processor: DocumentNodeProcessor = { + onRefNodeLeave(_, __, context) { + expect(context).toEqual({ + resolvedDocument, + isRootNode: false, + parentKey: 'node', + parentNode: resolvedDocument.document, + }); + }, + }; + + await processDocument(resolvedDocument, refResolver, [processor]); + }); + }); + }); +}); + +interface NodeWithId { + id?: string; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/process_document.ts similarity index 80% rename from packages/kbn-openapi-bundler/src/bundler/process_document.ts rename to packages/kbn-openapi-bundler/src/bundler/process_document/process_document.ts index 29344fa4aa7c50..907c42ebf6ea46 100644 --- a/packages/kbn-openapi-bundler/src/bundler/process_document.ts +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/process_document.ts @@ -8,32 +8,17 @@ import { dirname } from 'path'; import { isPlainObject } from 'lodash'; -import { IRefResolver } from './ref_resolver'; -import { - DocumentNode, - ResolvedDocument, - TraverseDocumentContext, - ResolvedRef, - DocumentNodeProcessor, - RefNode, - PlainObjectNode, -} from './types'; -import { parseRef } from '../utils/parse_ref'; -import { toAbsolutePath } from '../utils/to_absolute_path'; -import { isPlainObjectType } from '../utils/is_plain_object_type'; +import { IRefResolver } from '../ref_resolver/ref_resolver'; +import { ResolvedDocument } from '../ref_resolver/resolved_document'; +import { parseRef } from '../../utils/parse_ref'; +import { toAbsolutePath } from '../../utils/to_absolute_path'; +import { isPlainObjectType } from '../../utils/is_plain_object_type'; import { isChildContext } from './is_child_context'; - -interface TraverseItem { - node: DocumentNode; - context: TraverseDocumentContext; - /** - * Keeps track of visited nodes to be able to detect circular references - */ - visitedDocumentNodes: Set; - parentNode: DocumentNode; - parentKey: string | number; - resolvedRef?: ResolvedRef; -} +import { TraverseItem } from './traverse_item'; +import { createNodeContext } from './transform_traverse_item_to_node_context'; +import { DocumentNodeProcessor } from './document_processors/types/document_node_processor'; +import { DocumentNode, PlainObjectNode, RefNode } from './types/node'; +import { TraverseDocumentContext } from './types/context'; export async function processDocument( resolvedDocument: ResolvedDocument, @@ -95,7 +80,7 @@ export async function processDocument( resolvedRef, parentContext: traverseItem.context, followedRef: absoluteRef, - }; + } as const; traverseItem.resolvedRef = resolvedRef; @@ -143,17 +128,15 @@ export async function processDocument( const traverseItem = postOrderTraversalStack[i]; for (const processor of processors) { + const context = createNodeContext(traverseItem); + // If ref has been inlined by one of the processors it's not a ref node anymore // so we can skip the following processors if (isRefNode(traverseItem.node) && traverseItem.resolvedRef) { - processor.onRefNodeLeave?.( - traverseItem.node as RefNode, - traverseItem.resolvedRef, - traverseItem.context - ); + processor.onRefNodeLeave?.(traverseItem.node as RefNode, traverseItem.resolvedRef, context); } - processor.onNodeLeave?.(traverseItem.node, traverseItem.context); + processor.onNodeLeave?.(traverseItem.node, context); } } } @@ -171,12 +154,10 @@ function applyEnterProcessors( traverseItem: TraverseItem, processors: DocumentNodeProcessor[] ): void { + const context = createNodeContext(traverseItem); + for (const processor of processors) { - processor.onNodeEnter?.(traverseItem.node, { - ...traverseItem.context, - parentNode: traverseItem.parentNode, - parentKey: traverseItem.parentKey, - }); + processor.onNodeEnter?.(traverseItem.node, context); } } @@ -187,13 +168,9 @@ function shouldRemoveSubTree( traverseItem: TraverseItem, processors: DocumentNodeProcessor[] ): boolean { - return processors.some((p) => - p.shouldRemove?.(traverseItem.node, { - ...traverseItem.context, - parentNode: traverseItem.parentNode, - parentKey: traverseItem.parentKey, - }) - ); + const context = createNodeContext(traverseItem); + + return processors.some((p) => p.shouldRemove?.(traverseItem.node, context)); } function removeNode(traverseItem: TraverseItem): void { diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/transform_traverse_item_to_node_context.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/transform_traverse_item_to_node_context.ts new file mode 100644 index 00000000000000..bdc328681422e5 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/transform_traverse_item_to_node_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 { TraverseDocumentNodeContext } from './document_processors/types/traverse_document_node_context'; +import { TraverseItem } from './traverse_item'; + +export function createNodeContext(traverseItem: TraverseItem): TraverseDocumentNodeContext { + return { + ...traverseItem.context, + isRootNode: traverseItem.node === traverseItem.parentNode, + parentNode: traverseItem.parentNode, + parentKey: traverseItem.parentKey, + }; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/traverse_item.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/traverse_item.ts new file mode 100644 index 00000000000000..199b0b5a65374e --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/traverse_item.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 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 { ResolvedRef } from '../ref_resolver/resolved_ref'; +import { TraverseDocumentContext } from './types/context'; +import { DocumentNode } from './types/node'; + +export interface TraverseItem { + node: DocumentNode; + context: TraverseDocumentContext; + /** + * Keeps track of visited nodes to be able to detect circular references + */ + visitedDocumentNodes: Set; + parentNode: DocumentNode; + parentKey: string | number; + resolvedRef?: ResolvedRef; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/types/context.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/types/context.ts new file mode 100644 index 00000000000000..a845b65e295210 --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/types/context.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ResolvedDocument } from '../../ref_resolver/resolved_document'; +import { ResolvedRef } from '../../ref_resolver/resolved_ref'; + +export interface TraverseRootDocumentContext { + /** + * Root document + */ + resolvedDocument: ResolvedDocument; + + parentContext?: undefined; + followedRef?: undefined; +} + +export interface TraverseChildDocumentContext { + /** + * Current document after resolving $ref property + */ + resolvedRef: ResolvedRef; + + /** + * Context of the parent document the current one in `document` field was referenced via $ref. Empty if it's the root document. + */ + parentContext: TraverseDocumentContext; + + /** + * Reference used to resolve the current document + */ + followedRef: string; +} + +/** + * Traverse context storing additional information related to the currently traversed node + */ +export type TraverseDocumentContext = TraverseRootDocumentContext | TraverseChildDocumentContext; diff --git a/packages/kbn-openapi-bundler/src/bundler/process_document/types/node.ts b/packages/kbn-openapi-bundler/src/bundler/process_document/types/node.ts new file mode 100644 index 00000000000000..aeb540a54d345b --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/process_document/types/node.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 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. + */ + +/** + * A plain object node not containing `$ref` property + */ +export type PlainObjectNode = Record; + +/** + * An array node + */ +export type ArrayNode = unknown[]; + +/** + * A ref node containing `$ref` property besides the others + */ +export interface RefNode extends PlainObjectNode { + $ref: string; +} + +/** + * An abstract OpenAPI entry node. Content besides $ref isn't important. + */ +export type DocumentNode = PlainObjectNode | ArrayNode | RefNode; diff --git a/packages/kbn-openapi-bundler/src/bundler/__mocks__/ref_resolver.ts b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/__mocks__/ref_resolver.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/bundler/__mocks__/ref_resolver.ts rename to packages/kbn-openapi-bundler/src/bundler/ref_resolver/__mocks__/ref_resolver.ts diff --git a/packages/kbn-openapi-bundler/src/bundler/ref_resolver/index.ts b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/index.ts new file mode 100644 index 00000000000000..cea5fccd2e3b2d --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 * from './ref_resolver'; diff --git a/packages/kbn-openapi-bundler/src/bundler/ref_resolver.ts b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/ref_resolver.ts similarity index 88% rename from packages/kbn-openapi-bundler/src/bundler/ref_resolver.ts rename to packages/kbn-openapi-bundler/src/bundler/ref_resolver/ref_resolver.ts index 92b17c19c1b609..38ce43cf1d5937 100644 --- a/packages/kbn-openapi-bundler/src/bundler/ref_resolver.ts +++ b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/ref_resolver.ts @@ -7,9 +7,10 @@ */ import path from 'path'; -import { extractByJsonPointer } from '../utils/extract_by_json_pointer'; -import { readYamlDocument } from '../utils/read_yaml_document'; -import { ResolvedDocument, ResolvedRef } from './types'; +import { extractByJsonPointer } from '../../utils/extract_by_json_pointer'; +import { readYamlDocument } from '../../utils/read_yaml_document'; +import { ResolvedRef } from './resolved_ref'; +import { ResolvedDocument } from './resolved_document'; export interface IRefResolver { resolveRef(refDocumentAbsolutePath: string, pointer: string): Promise; diff --git a/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_document.ts b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_document.ts new file mode 100644 index 00000000000000..7e02aa6858767b --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_document.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 { Document } from '../document'; + +export interface ResolvedDocument { + /** + * Document's absolute path + */ + absolutePath: string; + /** + * Document's root + */ + document: Document; +} diff --git a/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_ref.ts b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_ref.ts new file mode 100644 index 00000000000000..f7beb71f25a73a --- /dev/null +++ b/packages/kbn-openapi-bundler/src/bundler/ref_resolver/resolved_ref.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 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 { DocumentNode } from '../process_document/types/node'; +import { ResolvedDocument } from './resolved_document'; + +export interface ResolvedRef extends ResolvedDocument { + /** + * Parsed pointer without leading hash symbol (e.g. `/components/schemas/MySchema`) + */ + pointer: string; + + /** + * Resolved ref's node pointer points to + */ + refNode: DocumentNode; +} diff --git a/packages/kbn-openapi-bundler/src/openapi_bundler.ts b/packages/kbn-openapi-bundler/src/openapi_bundler.ts index aa542a28b0a325..856f9aaeb9b98c 100644 --- a/packages/kbn-openapi-bundler/src/openapi_bundler.ts +++ b/packages/kbn-openapi-bundler/src/openapi_bundler.ts @@ -21,13 +21,18 @@ import { createBlankOpenApiDocument } from './bundler/merge_documents/create_bla export interface BundlerConfig { sourceGlob: string; outputFilePath: string; + options?: BundleOptions; +} + +interface BundleOptions { + includeLabels?: string[]; specInfo?: Omit, 'version'>; } export const bundle = async ({ sourceGlob, outputFilePath = 'bundled-{version}.schema.yaml', - specInfo, + options, }: BundlerConfig) => { logger.debug(chalk.bold(`Bundling API route schemas`)); logger.debug(`👀 Searching for source files in ${chalk.underline(sourceGlob)}`); @@ -46,20 +51,20 @@ export const bundle = async ({ logger.debug(`Processing schemas...`); - const resolvedDocuments = await resolveDocuments(schemaFilePaths); + const resolvedDocuments = await resolveDocuments(schemaFilePaths, options); logger.success(`Processed ${resolvedDocuments.length} schemas`); const blankOasFactory = (oasVersion: string, apiVersion: string) => createBlankOpenApiDocument(oasVersion, { version: apiVersion, - title: specInfo?.title ?? 'Bundled OpenAPI specs', + title: options?.specInfo?.title ?? 'Bundled OpenAPI specs', ...omitBy( { - description: specInfo?.description, - termsOfService: specInfo?.termsOfService, - contact: specInfo?.contact, - license: specInfo?.license, + description: options?.specInfo?.description, + termsOfService: options?.specInfo?.termsOfService, + contact: options?.specInfo?.contact, + license: options?.specInfo?.license, }, isUndefined ), @@ -75,11 +80,16 @@ function logSchemas(schemaFilePaths: string[]): void { } } -async function resolveDocuments(schemaFilePaths: string[]): Promise { +async function resolveDocuments( + schemaFilePaths: string[], + options?: BundleOptions +): Promise { const resolvedDocuments = await Promise.all( schemaFilePaths.map(async (schemaFilePath) => { try { - const resolvedDocument = await bundleDocument(schemaFilePath); + const resolvedDocument = await bundleDocument(schemaFilePath, { + includeLabels: options?.includeLabels, + }); logger.debug(`Processed ${chalk.bold(basename(schemaFilePath))}`); diff --git a/packages/kbn-openapi-bundler/src/utils/has_prop.ts b/packages/kbn-openapi-bundler/src/utils/has_prop.ts index aa38041b8178d1..b10e0824eed90d 100644 --- a/packages/kbn-openapi-bundler/src/utils/has_prop.ts +++ b/packages/kbn-openapi-bundler/src/utils/has_prop.ts @@ -8,7 +8,7 @@ import { isPlainObjectType } from './is_plain_object_type'; -export function hasProp( +export function hasProp( node: unknown, propName: Property, propValue?: Value diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts b/packages/kbn-openapi-bundler/tests/bundle_refs.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/bundle_refs.test.ts rename to packages/kbn-openapi-bundler/tests/bundle_refs.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts b/packages/kbn-openapi-bundler/tests/bundle_simple_specs.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/bundle_simple_specs.test.ts rename to packages/kbn-openapi-bundler/tests/bundle_simple_specs.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts b/packages/kbn-openapi-bundler/tests/bundle_specs.ts similarity index 86% rename from packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts rename to packages/kbn-openapi-bundler/tests/bundle_specs.ts index 599f81c0e4c85b..0eaf7d3e1a9749 100644 --- a/packages/kbn-openapi-bundler/src/__test__/bundle_specs.ts +++ b/packages/kbn-openapi-bundler/tests/bundle_specs.ts @@ -18,12 +18,16 @@ import { } from 'fs'; import { dump, load } from 'js-yaml'; import { OpenAPIV3 } from 'openapi-types'; -import { bundle } from '../openapi_bundler'; +import { bundle, BundlerConfig } from '../src/openapi_bundler'; -const ROOT_PATH = join(__dirname, '..', '..'); +const ROOT_PATH = join(__dirname, '..'); + +// Suppress bundler logging via mocking the logger +jest.mock('../src/logger'); export async function bundleSpecs( - oasSpecs: Record + oasSpecs: Record, + options?: BundlerConfig['options'] ): Promise> { const randomStr = (Math.random() + 1).toString(36).substring(7); const folderToBundlePath = join(ROOT_PATH, 'target', 'oas-test', randomStr); @@ -32,7 +36,7 @@ export async function bundleSpecs( dumpSpecs(folderToBundlePath, oasSpecs); - await bundleFolder(folderToBundlePath, bundledFilePathTemplate); + await bundleFolder(folderToBundlePath, bundledFilePathTemplate, options); return readBundledSpecs(resultFolderPath); } @@ -70,10 +74,12 @@ export function readBundledSpecs(folderPath: string): Record { await bundle({ sourceGlob: join(folderToBundlePath, '*.schema.yaml'), outputFilePath: bundledFilePathTemplate, + options, }); } diff --git a/packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts b/packages/kbn-openapi-bundler/tests/bundle_specs_with_multiple_modifications.test.ts similarity index 96% rename from packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts rename to packages/kbn-openapi-bundler/tests/bundle_specs_with_multiple_modifications.test.ts index ed57d745f2ee45..f042596c56433c 100644 --- a/packages/kbn-openapi-bundler/src/__test__/bundle_specs_with_multiple_modifications.test.ts +++ b/packages/kbn-openapi-bundler/tests/bundle_specs_with_multiple_modifications.test.ts @@ -19,7 +19,9 @@ describe('OpenAPI Bundler - specs with multiple modifications', () => { const outputFolderPath = join(ROOT_PATH, 'target', 'complex_specs_test'); const bundledFilePathTemplate = join(outputFolderPath, 'oas-test-bundle-{version}.yaml'); - await bundleFolder(folderToBundlePath, bundledFilePathTemplate); + await bundleFolder(folderToBundlePath, bundledFilePathTemplate, { + includeLabels: ['include'], + }); const [bundledSpec] = Object.values(readBundledSpecs(outputFolderPath)); diff --git a/packages/kbn-openapi-bundler/src/__test__/circular.test.ts b/packages/kbn-openapi-bundler/tests/circular.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/circular.test.ts rename to packages/kbn-openapi-bundler/tests/circular.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/common.schema.yaml similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/complex_specs/common.schema.yaml rename to packages/kbn-openapi-bundler/tests/complex_specs/common.schema.yaml diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/expected.yaml similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/complex_specs/expected.yaml rename to packages/kbn-openapi-bundler/tests/complex_specs/expected.yaml diff --git a/packages/kbn-openapi-bundler/tests/complex_specs/invalid_labels.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/invalid_labels.schema.yaml new file mode 100644 index 00000000000000..67cc5b616c6849 --- /dev/null +++ b/packages/kbn-openapi-bundler/tests/complex_specs/invalid_labels.schema.yaml @@ -0,0 +1,17 @@ +openapi: 3.0.3 +info: + title: Test endpoint + version: '2023-10-31' +paths: + /api/another_api: + get: + x-labels: 10 + operationId: AnotherTestEndpointGet + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: './common.schema.yaml#/components/schemas/SharedSchema' + x-modify: partial diff --git a/packages/kbn-openapi-bundler/tests/complex_specs/missing_labels.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/missing_labels.schema.yaml new file mode 100644 index 00000000000000..0ad484323beaec --- /dev/null +++ b/packages/kbn-openapi-bundler/tests/complex_specs/missing_labels.schema.yaml @@ -0,0 +1,16 @@ +openapi: 3.0.3 +info: + title: Test endpoint + version: '2023-10-31' +paths: + /api/missing_label_should_not_be_in_bundle: + post: + operationId: AnotherTestEndpointPost + responses: + '200': + description: Successful response + content: + application/json: + schema: + $ref: './common.schema.yaml#/components/schemas/SharedSchema' + x-modify: partial diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/spec1.schema.yaml similarity index 93% rename from packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml rename to packages/kbn-openapi-bundler/tests/complex_specs/spec1.schema.yaml index 0d6656fde5b680..c634ba56ccee75 100644 --- a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec1.schema.yaml +++ b/packages/kbn-openapi-bundler/tests/complex_specs/spec1.schema.yaml @@ -5,6 +5,7 @@ info: paths: /api/some_api: get: + x-labels: [include] operationId: TestEndpointGet responses: '200': diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/spec2.schema.yaml similarity index 95% rename from packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml rename to packages/kbn-openapi-bundler/tests/complex_specs/spec2.schema.yaml index a79a78f94950d6..eb573089568489 100644 --- a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec2.schema.yaml +++ b/packages/kbn-openapi-bundler/tests/complex_specs/spec2.schema.yaml @@ -5,6 +5,7 @@ info: paths: /api/some_api: post: + x-labels: [include, labelA] operationId: TestEndpointPost responses: '200': diff --git a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml b/packages/kbn-openapi-bundler/tests/complex_specs/spec3.schema.yaml similarity index 96% rename from packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml rename to packages/kbn-openapi-bundler/tests/complex_specs/spec3.schema.yaml index d249210fff2d24..20423eaa96207b 100644 --- a/packages/kbn-openapi-bundler/src/__test__/complex_specs/spec3.schema.yaml +++ b/packages/kbn-openapi-bundler/tests/complex_specs/spec3.schema.yaml @@ -5,6 +5,7 @@ info: paths: /api/some_api: put: + x-labels: [include, labelA, labelB] x-codegen-enabled: true operationId: TestEndpointPut responses: diff --git a/packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts b/packages/kbn-openapi-bundler/tests/create_oas_document.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/create_oas_document.ts rename to packages/kbn-openapi-bundler/tests/create_oas_document.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts b/packages/kbn-openapi-bundler/tests/different_endpoint_versions.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/different_endpoint_versions.test.ts rename to packages/kbn-openapi-bundler/tests/different_endpoint_versions.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts b/packages/kbn-openapi-bundler/tests/different_oas_versions.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/different_oas_versions.test.ts rename to packages/kbn-openapi-bundler/tests/different_oas_versions.test.ts diff --git a/packages/kbn-openapi-bundler/tests/include_labels.test.ts b/packages/kbn-openapi-bundler/tests/include_labels.test.ts new file mode 100644 index 00000000000000..8456afdd00c3e9 --- /dev/null +++ b/packages/kbn-openapi-bundler/tests/include_labels.test.ts @@ -0,0 +1,370 @@ +/* + * Copyright 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 { bundleSpecs } from './bundle_specs'; +import { createOASDocument } from './create_oas_document'; + +describe('OpenAPI Bundler - include labeled operations', () => { + it.each([ + { + label: 'labelA', + expectedPathObjects: { '/api/some_api': ['post'], '/api/another_api': ['get'] }, + }, + { label: 'labelB', expectedPathObjects: { '/api/some_api': ['get'] } }, + ])('includes operation objects with "$label" label', async ({ label, expectedPathObjects }) => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelB'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + post: { + 'x-labels': ['labelA'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + '/api/another_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelA'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: [label], + } + ) + ); + + expect(Object.keys(bundledSpec.paths)).toEqual( + expect.arrayContaining(Object.keys(expectedPathObjects)) + ); + + for (const [path, verbs] of Object.entries(expectedPathObjects)) { + expect(Object.keys(bundledSpec.paths[path]!)).toEqual(expect.arrayContaining(verbs)); + } + }); + + it('includes operation objects with multiple labels', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelA', 'labelB'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: ['labelA', 'labelB'], + } + ) + ); + + expect(bundledSpec.paths).toEqual({ + '/api/some_api': { + get: expect.anything(), + }, + }); + }); + + it('does NOT include operation objects with incomplete labels set', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelA', 'labelB', 'labelC'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + put: { + 'x-labels': ['labelA', 'labelC'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: ['labelA', 'labelB'], + } + ) + ); + + expect(bundledSpec.paths).toEqual({ + '/api/some_api': { + get: expect.anything(), + }, + }); + }); + + it('does NOT include operation objects without labels', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelA'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + '/api/missing_label_should_not_be_in_bundle': { + put: { + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: ['labelA'], + } + ) + ); + + expect(bundledSpec.paths).toEqual({ + '/api/some_api': { + get: expect.anything(), + }, + }); + }); + + it('does NOT include operation objects when labels are not an array', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': 10, + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + put: { + 'x-labels': ['labelA'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: ['labelA'], + } + ) + ); + + expect(bundledSpec.paths).toEqual({ + '/api/some_api': { + put: expect.anything(), + }, + }); + }); + + it('removes path items without HTTP verbs defined', async () => { + const spec = createOASDocument({ + paths: { + '/api/some_api': { + get: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelA'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + '/api/to_be_removed': { + summary: 'Some API PUT method OAS definition', + put: { + // @ts-expect-error custom property is unexpected here + 'x-labels': ['labelB'], + responses: { + '200': { + description: 'Successful response', + content: { + 'application/json': { + schema: { + type: 'string', + }, + }, + }, + }, + }, + }, + }, + }, + }); + + const [bundledSpec] = Object.values( + await bundleSpecs( + { + 1: spec, + }, + { + includeLabels: ['labelA'], + } + ) + ); + + expect(bundledSpec.paths).toEqual({ + '/api/some_api': { + get: expect.anything(), + }, + }); + }); +}); diff --git a/packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts b/packages/kbn-openapi-bundler/tests/inline_ref.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/inline_ref.test.ts rename to packages/kbn-openapi-bundler/tests/inline_ref.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts b/packages/kbn-openapi-bundler/tests/omit_unused_schemas.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/omit_unused_schemas.test.ts rename to packages/kbn-openapi-bundler/tests/omit_unused_schemas.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/produce_stable_bundle.test.ts b/packages/kbn-openapi-bundler/tests/produce_stable_bundle.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/produce_stable_bundle.test.ts rename to packages/kbn-openapi-bundler/tests/produce_stable_bundle.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts b/packages/kbn-openapi-bundler/tests/reduce_all_of.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/reduce_all_of.test.ts rename to packages/kbn-openapi-bundler/tests/reduce_all_of.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/remove_props.test.ts b/packages/kbn-openapi-bundler/tests/remove_props.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/remove_props.test.ts rename to packages/kbn-openapi-bundler/tests/remove_props.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts b/packages/kbn-openapi-bundler/tests/skip_nodes.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/skip_nodes.test.ts rename to packages/kbn-openapi-bundler/tests/skip_nodes.test.ts diff --git a/packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts b/packages/kbn-openapi-bundler/tests/x_modify.test.ts similarity index 100% rename from packages/kbn-openapi-bundler/src/__test__/x_modify.test.ts rename to packages/kbn-openapi-bundler/tests/x_modify.test.ts diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index c3616140cabe8d..a7ec0e03f3dda4 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -42,6 +42,7 @@ pageLoadAssetSize: embeddable: 87309 embeddableEnhanced: 22107 enterpriseSearch: 50858 + esqlDataGrid: 24598 esUiShared: 326654 eventAnnotation: 30000 eventAnnotationListing: 25841 @@ -82,6 +83,7 @@ pageLoadAssetSize: inputControlVis: 172675 inspector: 148711 interactiveSetup: 80000 + investigate: 17970 kibanaOverview: 56279 kibanaReact: 74422 kibanaUsageCollection: 16463 diff --git a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap index 2c6186ff569847..fee1a8534a7ec7 100644 --- a/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap +++ b/packages/kbn-router-to-openapispec/src/__snapshots__/generate_oas.test.ts.snap @@ -26,6 +26,7 @@ Object { "paths": Object { "/foo/{id}": Object { "get": Object { + "description": undefined, "operationId": "/foo/{id}#0", "parameters": Array [ Object { @@ -85,7 +86,6 @@ Object { }, }, }, - "description": "No description", }, }, "summary": "", @@ -133,6 +133,7 @@ Object { "paths": Object { "/bar": Object { "get": Object { + "description": undefined, "operationId": "/bar#0", "parameters": Array [ Object { @@ -221,6 +222,7 @@ Object { }, "/foo/{id}/{path*}": Object { "get": Object { + "description": "route description", "operationId": "/foo/{id}/{path*}#0", "parameters": Array [ Object { @@ -357,15 +359,15 @@ Object { }, }, }, - "description": "route", }, }, - "summary": "route", + "summary": "route summary", "tags": Array [ "bar", ], }, "post": Object { + "description": "route description", "operationId": "/foo/{id}/{path*}#1", "parameters": Array [ Object { @@ -502,10 +504,9 @@ Object { }, }, }, - "description": "route", }, }, - "summary": "route", + "summary": "route summary", "tags": Array [ "bar", ], @@ -576,6 +577,7 @@ Object { "paths": Object { "/recursive": Object { "get": Object { + "description": undefined, "operationId": "/recursive#0", "parameters": Array [ Object { @@ -611,7 +613,6 @@ Object { }, }, }, - "description": "No description", }, }, "summary": "", @@ -659,6 +660,7 @@ Object { "paths": Object { "/foo/{id}": Object { "get": Object { + "description": undefined, "operationId": "/foo/{id}#0", "parameters": Array [ Object { @@ -688,7 +690,6 @@ Object { "schema": Object {}, }, }, - "description": "No description", }, }, "summary": "", @@ -697,6 +698,7 @@ Object { }, "/test": Object { "get": Object { + "description": undefined, "operationId": "/test#0", "parameters": Array [ Object { diff --git a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts index b4e273b3a5b7b7..bed7d10c51d8e4 100644 --- a/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts +++ b/packages/kbn-router-to-openapispec/src/generate_oas.test.util.ts @@ -55,7 +55,8 @@ export const getRouterDefaults = () => ({ method: 'get', options: { tags: ['foo', 'oas-tag:bar'], - description: 'route', + summary: 'route summary', + description: 'route description', }, validationSchemas: { request: { @@ -82,7 +83,7 @@ export const getVersionedRouterDefaults = () => ({ method: 'get', path: '/bar', options: { - description: 'versioned route', + summary: 'versioned route', access: 'public', options: { tags: ['ignore-me', 'oas-tag:versioned'], diff --git a/packages/kbn-router-to-openapispec/src/process_router.test.ts b/packages/kbn-router-to-openapispec/src/process_router.test.ts index 32888cfe1dd47e..41850b31c5d46f 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.test.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.test.ts @@ -45,7 +45,6 @@ describe('extractResponses', () => { }; expect(extractResponses(route, oasConverter)).toEqual({ 200: { - description: 'No description', content: { 'application/test+json; Elastic-Api-Version=2023-10-31': { schema: { @@ -60,7 +59,6 @@ describe('extractResponses', () => { }, }, 404: { - description: 'No description', content: { 'application/test2+json; Elastic-Api-Version=2023-10-31': { schema: { diff --git a/packages/kbn-router-to-openapispec/src/process_router.ts b/packages/kbn-router-to-openapispec/src/process_router.ts index ce9486b140dc47..393b745b6aab31 100644 --- a/packages/kbn-router-to-openapispec/src/process_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_router.ts @@ -60,7 +60,8 @@ export const processRouter = ( } const operation: OpenAPIV3.OperationObject = { - summary: route.options.description ?? '', + summary: route.options.summary ?? '', + description: route.options.description, tags: route.options.tags ? extractTags(route.options.tags) : [], requestBody: !!validationSchemas?.body ? { @@ -103,7 +104,6 @@ export const extractResponses = (route: InternalRouterRoute, converter: OasConve const oasSchema = converter.convert(schema.body()); acc[statusCode] = { ...acc[statusCode], - description: route.options.description ?? 'No description', content: { ...((acc[statusCode] ?? {}) as OpenAPIV3.ResponseObject).content, [getVersionedContentTypeString( diff --git a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts index 85246a5164306f..cc873b26835cf3 100644 --- a/packages/kbn-router-to-openapispec/src/process_versioned_router.ts +++ b/packages/kbn-router-to-openapispec/src/process_versioned_router.ts @@ -84,7 +84,8 @@ export const processVersionedRouter = ( const contentType = extractContentType(route.options.options?.body); const hasVersionFilter = Boolean(filters?.version); const operation: OpenAPIV3.OperationObject = { - summary: route.options.description ?? '', + summary: route.options.summary ?? '', + description: route.options.description, tags: route.options.options?.tags ? extractTags(route.options.options.tags) : [], requestBody: hasBody ? { diff --git a/packages/kbn-search-connectors/lib/create_connector.test.ts b/packages/kbn-search-connectors/lib/create_connector.test.ts new file mode 100644 index 00000000000000..66d8ce226c1a85 --- /dev/null +++ b/packages/kbn-search-connectors/lib/create_connector.test.ts @@ -0,0 +1,198 @@ +/* + * Copyright 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 { errors } from '@elastic/elasticsearch'; + +import { ElasticsearchClient } from '@kbn/core/server'; +import { FeatureName } from '../types'; + +import { createConnector } from './create_connector'; + +const notFoundError = new errors.ResponseError({ + statusCode: 404, + body: { + error: { + type: `document_missing_exception`, + }, + }, +} as any); + +describe('createConnector lib', () => { + const mockClient = { + transport: { + request: jest.fn(), + }, + }; + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should create connector with _connector API endpoint', async () => { + const connectorId = 'connectorId'; + const mockConnector = { + id: connectorId, + index_name: 'indexName', + language: 'en', + is_native: true, + }; + mockClient.transport.request + .mockResolvedValueOnce({ id: connectorId }) + .mockResolvedValueOnce(mockConnector); + + await expect( + createConnector(mockClient as unknown as ElasticsearchClient, { + isNative: true, + indexName: mockConnector.index_name, + language: mockConnector.language, + }) + ).resolves.toEqual(mockConnector); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: `/_connector`, + body: { + index_name: 'indexName', + language: 'en', + is_native: true, + name: '', + }, + }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'GET', + path: `/_connector/${connectorId}`, + }); + }); + + it('should update pipeline params if provided', async () => { + const connectorId = 'connectorId'; + const mockConnector = { + id: connectorId, + index_name: 'indexName', + language: 'en', + is_native: true, + }; + + const mockPipeline = { + extract_binary_content: true, + name: 'test', + reduce_whitespace: true, + run_ml_inference: true, + }; + + mockClient.transport.request + .mockResolvedValueOnce({ id: connectorId }) + .mockResolvedValueOnce({ result: 'updated' }) + .mockResolvedValueOnce(mockConnector); + + await expect( + createConnector(mockClient as unknown as ElasticsearchClient, { + isNative: true, + indexName: 'indexName', + language: 'en', + pipeline: mockPipeline, + }) + ).resolves.toEqual(mockConnector); + + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: `/_connector`, + body: { + index_name: 'indexName', + language: 'en', + is_native: true, + name: '', + }, + }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'PUT', + path: `/_connector/${connectorId}/_pipeline`, + body: { pipeline: mockPipeline }, + }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'GET', + path: `/_connector/${connectorId}`, + }); + }); + + it('should update connector features if provided', async () => { + const connectorId = 'connectorId'; + const mockConnector = { + id: connectorId, + index_name: 'indexName', + language: 'en', + is_native: true, + }; + + const mockFeatures = { + [FeatureName.FILTERING_ADVANCED_CONFIG]: true, + [FeatureName.FILTERING_RULES]: true, + [FeatureName.SYNC_RULES]: { + advanced: { enabled: true }, + basic: { enabled: true }, + }, + }; + + mockClient.transport.request + .mockResolvedValueOnce({ id: connectorId }) + .mockResolvedValueOnce({ result: 'updated' }) + .mockResolvedValueOnce(mockConnector); + + await expect( + createConnector(mockClient as unknown as ElasticsearchClient, { + isNative: true, + indexName: 'indexName', + language: 'en', + features: mockFeatures, + }) + ).resolves.toEqual(mockConnector); + + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: `/_connector`, + body: { + index_name: 'indexName', + language: 'en', + is_native: true, + name: '', + }, + }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'PUT', + path: `/_connector/${connectorId}/_features`, + body: { features: mockFeatures }, + }); + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'GET', + path: `/_connector/${connectorId}`, + }); + }); + + it('should throw an error if connector doc is not found', async () => { + mockClient.transport.request + .mockResolvedValueOnce({ id: 'connectorId' }) + .mockRejectedValueOnce(notFoundError); + + await expect( + createConnector(mockClient as unknown as ElasticsearchClient, { + isNative: true, + indexName: 'some-index', + language: 'somelang', + }) + ).rejects.toEqual(new Error('Could not retrieve the created connector')); + + expect(mockClient.transport.request).toHaveBeenCalledWith({ + method: 'POST', + path: `/_connector`, + body: { + index_name: 'some-index', + is_native: true, + language: 'somelang', + name: '', + }, + }); + }); +}); diff --git a/packages/kbn-search-connectors/lib/create_connector.ts b/packages/kbn-search-connectors/lib/create_connector.ts index 524fc3c195eac8..666011e50f3416 100644 --- a/packages/kbn-search-connectors/lib/create_connector.ts +++ b/packages/kbn-search-connectors/lib/create_connector.ts @@ -7,10 +7,10 @@ */ import { ElasticsearchClient } from '@kbn/core/server'; -import { CURRENT_CONNECTORS_INDEX } from '..'; +import { i18n } from '@kbn/i18n'; +import { fetchConnectorById } from '..'; import { Connector, ConnectorConfiguration, IngestPipelineParams } from '../types/connectors'; -import { createConnectorDocument } from './create_connector_document'; export const createConnector = async ( client: ElasticsearchClient, @@ -23,19 +23,46 @@ export const createConnector = async ( name?: string; pipeline?: IngestPipelineParams; serviceType?: string | null; - instant_response?: boolean; } ): Promise => { - const document = createConnectorDocument({ - ...input, - serviceType: input.serviceType || null, + const { id: connectorId } = await client.transport.request<{ id: string }>({ + method: 'POST', + path: `/_connector`, + body: { + ...(input.indexName && { index_name: input.indexName }), + is_native: input.isNative, + ...(input.language && { language: input.language }), + name: input.name || '', + ...(input.serviceType && { service_type: input.serviceType }), + }, }); - const result = await client.index({ - document, - index: CURRENT_CONNECTORS_INDEX, - refresh: input.instant_response ? false : 'wait_for', - }); + if (input.pipeline) { + await client.transport.request({ + method: 'PUT', + path: `/_connector/${connectorId}/_pipeline`, + body: { pipeline: input.pipeline }, + }); + } + + if (input.features) { + await client.transport.request({ + method: 'PUT', + path: `/_connector/${connectorId}/_features`, + body: { features: input.features }, + }); + } + + // createConnector function expects to return a Connector doc, so we fetch it from the index + const connector = await fetchConnectorById(client, connectorId); + + if (!connector) { + throw new Error( + i18n.translate('searchConnectors.server.connectors.not_found_error', { + defaultMessage: 'Could not retrieve the created connector', + }) + ); + } - return { ...document, id: result._id }; + return connector; }; diff --git a/packages/kbn-storybook/src/lib/decorators.tsx b/packages/kbn-storybook/src/lib/decorators.tsx index 8693d55faac61e..ff10c78fe4589e 100644 --- a/packages/kbn-storybook/src/lib/decorators.tsx +++ b/packages/kbn-storybook/src/lib/decorators.tsx @@ -18,10 +18,11 @@ import { CoreTheme } from '@kbn/core-theme-browser'; import { I18nStart } from '@kbn/core-i18n-browser'; import type { AnalyticsServiceStart } from '@kbn/core-analytics-browser'; import { KibanaRootContextProvider } from '@kbn/react-kibana-context-root'; +import { i18n } from '@kbn/i18n'; const theme$ = new BehaviorSubject({ darkMode: false }); -const i18n: I18nStart = { +const i18nStart: I18nStart = { Context: ({ children }) => {children}, }; @@ -36,6 +37,8 @@ const analytics: AnalyticsServiceStart = { * `globals` provided by the Storybook theme switcher to set the `colorMode`. */ const KibanaContextDecorator: DecoratorFn = (storyFn, { globals }) => { + // TODO: Add a switcher to see components in other locales or pseudo locale + i18n.init({ locale: 'en', messages: {} }); const colorMode = globals.euiTheme === 'v8.dark' ? 'dark' : 'light'; useEffect(() => { @@ -43,7 +46,7 @@ const KibanaContextDecorator: DecoratorFn = (storyFn, { globals }) => { }, [colorMode]); return ( - + {storyFn()} ); diff --git a/packages/kbn-storybook/tsconfig.json b/packages/kbn-storybook/tsconfig.json index 97d423551115d9..ab513c1d02c0c4 100644 --- a/packages/kbn-storybook/tsconfig.json +++ b/packages/kbn-storybook/tsconfig.json @@ -17,6 +17,7 @@ "@kbn/repo-info", "@kbn/dev-cli-runner", "@kbn/core-theme-browser", + "@kbn/i18n", "@kbn/i18n-react", "@kbn/core-i18n-browser", "@kbn/react-kibana-context-root", diff --git a/packages/kbn-text-based-editor/src/editor_footer.tsx b/packages/kbn-text-based-editor/src/editor_footer.tsx index 88524bbeb43789..697563ebc404cb 100644 --- a/packages/kbn-text-based-editor/src/editor_footer.tsx +++ b/packages/kbn-text-based-editor/src/editor_footer.tsx @@ -107,7 +107,7 @@ interface EditorFooterProps { updateQuery: (qs: string) => void; isHistoryOpen: boolean; setIsHistoryOpen: (status: boolean) => void; - containerWidth: number; + measuredContainerWidth: number; hideRunQueryText?: boolean; disableSubmitAction?: boolean; editorIsInline?: boolean; @@ -138,12 +138,12 @@ export const EditorFooter = memo(function EditorFooter({ allowQueryCancellation, hideTimeFilterInfo, isHistoryOpen, - containerWidth, setIsHistoryOpen, hideQueryHistory, refetchHistoryItems, isInCompactMode, queryHasChanged, + measuredContainerWidth, }: EditorFooterProps) { const { euiTheme } = useEuiTheme(); const [isErrorPopoverOpen, setIsErrorPopoverOpen] = useState(false); @@ -172,7 +172,7 @@ export const EditorFooter = memo(function EditorFooter({ responsive={false} direction="column" css={css` - width: ${containerWidth}px; + width: 100%; box-shadow: ${shadowStyle}; `} > @@ -373,7 +373,7 @@ export const EditorFooter = memo(function EditorFooter({ diff --git a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx index 84dfcde890d66f..24d621e0d3750f 100644 --- a/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx +++ b/packages/kbn-text-based-editor/src/esql_documentation_sections.tsx @@ -172,6 +172,7 @@ The \`SHOW \` source command returns information about the deployment and * Use \`SHOW INFO\` to return the deployment's version, build date and hash. * Use \`SHOW FUNCTIONS\` to return a list of all supported functions and a synopsis of each function. `, + ignoreTag: true, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', } @@ -214,9 +215,9 @@ Refer to the [dissect processor documentation](https://www.elastic.co/guide/en/e \`\`\` ROW a = "1953-01-23T12:15:00Z - some text - 127.0.0.1" -| DISSECT a "%\\{Y\\}-%\\{M\\}-%\\{D\\}T%\\{h\\}:%\\{m\\}:%\\{s\\}Z - %\\{msg\\} - %\\{ip\\}" -\`\`\` - `, +| DISSECT a "%'\{Y\}-%\{M\}-%\{D\}T%\{h\}:%\{m\}:%\{s\}Z - %\{msg\} - %\{ip\}'" +\`\`\` `, + ignoreTag: true, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', } @@ -308,6 +309,7 @@ By default (if no \`WITH\` is defined), \`ENRICH\` will add all the enrich field In case of name collisions, the newly created fields will override the existing fields. `, + ignoreTag: true, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', } @@ -376,7 +378,7 @@ Refer to the [grok processor documentation](https://www.elastic.co/guide/en/elas \`\`\` ROW a = "12 15.5 15.6 true" -| GROK a "%\\{NUMBER:b:int\\} %\\{NUMBER:c:float\\} %\\{NUMBER:d:double\\} %\\{WORD:e:boolean\\}" +| GROK a "%'{NUMBER:b:int}' %'{NUMBER:c:float}' %'{NUMBER:d:double}' %'{WORD:e:boolean}'" \`\`\` `, description: @@ -523,6 +525,7 @@ FROM employees | RENAME first_name AS fn, last_name AS ln \`\`\` `, + ignoreTag: true, description: 'Text is in markdown. Do not translate function names, special characters, or field names like sum(bytes)', } diff --git a/packages/kbn-text-based-editor/src/overwrite.scss b/packages/kbn-text-based-editor/src/overwrite.scss index dc46eeebc17a93..e24fd604d7268f 100644 --- a/packages/kbn-text-based-editor/src/overwrite.scss +++ b/packages/kbn-text-based-editor/src/overwrite.scss @@ -42,4 +42,4 @@ .TextBasedLangEditor_errorMessage { @include euiTextBreakWord; -} \ No newline at end of file +} diff --git a/packages/kbn-text-based-editor/src/query_history.tsx b/packages/kbn-text-based-editor/src/query_history.tsx index 0759c7fd7e8161..d7272e8d59e12d 100644 --- a/packages/kbn-text-based-editor/src/query_history.tsx +++ b/packages/kbn-text-based-editor/src/query_history.tsx @@ -66,7 +66,7 @@ export function QueryHistoryAction({ } > {isHistoryOpen @@ -347,9 +347,8 @@ export function QueryHistory({ }, }; const { euiTheme } = theme; - const extraStyling = isOnReducedSpaceLayout - ? getReducedSpaceStyling() - : `width: ${containerWidth}px`; + const extraStyling = isOnReducedSpaceLayout ? getReducedSpaceStyling() : ''; + const tableStyling = css` .euiTable { background-color: ${euiTheme.colors.lightestShade}; diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts b/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts index 8e5fbb1974a55a..39a02a35516ab6 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.styles.ts @@ -22,16 +22,23 @@ export const textBasedLanguageEditorStyles = ( isCodeEditorExpandedFocused: boolean, hasReference: boolean, editorIsInline: boolean, - historyIsOpen: boolean + historyIsOpen: boolean, + hideHeaderWhenExpanded: boolean ) => { - let position = isCompactFocused ? ('absolute' as 'absolute') : ('relative' as 'relative'); // cast string to type 'relative' | 'absolute' + const bottomContainerBorderColor = hasErrors ? euiTheme.colors.danger : euiTheme.colors.primary; + + const showHeader = hideHeaderWhenExpanded === true && isCodeEditorExpanded; + + let position = isCompactFocused ? ('absolute' as const) : ('relative' as const); if (isCodeEditorExpanded) { - position = 'relative' as 'relative'; + position = 'relative'; } - const bottomContainerBorderColor = hasErrors ? euiTheme.colors.danger : euiTheme.colors.primary; + return { editorContainer: { position, + left: 0, + right: 0, zIndex: isCompactFocused ? 4 : 0, height: `${editorHeight}px`, border: isCompactFocused ? euiTheme.border.thin : 'none', @@ -49,20 +56,22 @@ export const textBasedLanguageEditorStyles = ( width: isCodeEditorExpanded ? '100%' : `calc(100% - ${hasReference ? 80 : 40}px)`, alignItems: isCompactFocused ? 'flex-start' : 'center', border: !isCompactFocused ? euiTheme.border.thin : 'none', - borderTopLeftRadius: euiTheme.border.radius.medium, - borderBottomLeftRadius: euiTheme.border.radius.medium, + borderTopLeftRadius: isCodeEditorExpanded ? 0 : euiTheme.border.radius.medium, + borderBottomLeftRadius: isCodeEditorExpanded ? 0 : euiTheme.border.radius.medium, borderBottomWidth: hasErrors ? '2px' : '1px', borderBottomColor: hasErrors ? euiTheme.colors.danger : euiTheme.colors.lightShade, + borderRight: isCodeEditorExpanded ? euiTheme.border.thin : 'none', + ...(isCodeEditorExpanded && { overflow: 'hidden' }), }, linesBadge: { - position: 'absolute' as 'absolute', // cast string to type 'absolute', + position: 'absolute' as const, zIndex: 1, right: hasErrors || hasWarning ? '60px' : '12px', top: '50%', transform: 'translate(0, -50%)', }, errorsBadge: { - position: 'absolute' as 'absolute', // cast string to type 'absolute', + position: 'absolute' as const, zIndex: 1, right: '12px', top: '50%', @@ -77,15 +86,16 @@ export const textBasedLanguageEditorStyles = ( ? `2px solid ${euiTheme.colors.danger}` : euiTheme.border.thin : `2px solid ${bottomContainerBorderColor}`, + borderBottom: editorIsInline ? 'none' : euiTheme.border.thin, backgroundColor: euiTheme.colors.lightestShade, paddingLeft: euiTheme.size.base, paddingRight: euiTheme.size.base, paddingTop: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, paddingBottom: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, - width: 'calc(100% + 2px)', - position: 'relative' as 'relative', // cast string to type 'relative', + width: isCodeEditorExpanded ? '100%' : 'calc(100% + 2px)', + position: 'relative' as const, marginTop: 0, - marginLeft: 0, + marginLeft: isCodeEditorExpanded ? 0 : -1, marginBottom: 0, borderBottomLeftRadius: editorIsInline || historyIsOpen ? 0 : euiTheme.border.radius.medium, borderBottomRightRadius: editorIsInline || historyIsOpen ? 0 : euiTheme.border.radius.medium, @@ -96,8 +106,8 @@ export const textBasedLanguageEditorStyles = ( borderLeft: editorIsInline ? 'none' : euiTheme.border.thin, borderRight: editorIsInline ? 'none' : euiTheme.border.thin, backgroundColor: euiTheme.colors.lightestShade, - width: 'calc(100% + 2px)', - position: 'relative' as 'relative', // cast string to type 'relative', + width: '100%', + position: 'relative' as const, marginTop: 0, marginLeft: 0, marginBottom: 0, @@ -109,14 +119,15 @@ export const textBasedLanguageEditorStyles = ( borderTopLeftRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, borderTopRightRadius: editorIsInline ? 0 : euiTheme.border.radius.medium, backgroundColor: euiTheme.colors.lightestShade, - paddingLeft: euiTheme.size.base, - paddingRight: euiTheme.size.base, - paddingTop: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, - paddingBottom: editorIsInline ? euiTheme.size.s : euiTheme.size.xs, - width: 'calc(100% + 2px)', - position: 'relative' as 'relative', // cast string to type 'relative', + paddingLeft: euiTheme.size.xs, + paddingRight: euiTheme.size.xs, + paddingTop: showHeader ? euiTheme.size.s : euiTheme.size.xs, + paddingBottom: showHeader ? euiTheme.size.s : euiTheme.size.xs, + width: '100%', + position: 'relative' as const, marginLeft: 0, marginTop: editorIsInline ? 0 : euiTheme.size.s, + borderBottom: 'none', }, dragResizeContainer: { width: '100%', diff --git a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx index 72dcbc5709a471..65516e498ba15f 100644 --- a/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx +++ b/packages/kbn-text-based-editor/src/text_based_languages_editor.tsx @@ -6,58 +6,56 @@ * Side Public License, v 1. */ -import React, { useRef, memo, useEffect, useState, useCallback, useMemo } from 'react'; -import classNames from 'classnames'; -import memoize from 'lodash/memoize'; -import { monaco, ESQL_LANG_ID, ESQL_THEME_ID, ESQLLang, type ESQLCallbacks } from '@kbn/monaco'; -import type { AggregateQuery } from '@kbn/es-query'; -import { getAggregateQueryMode, getLanguageDisplayName } from '@kbn/es-query'; -import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; -import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; -import type { CoreStart } from '@kbn/core/public'; -import type { IndexManagementPluginSetup } from '@kbn/index-management'; -import { TooltipWrapper } from '@kbn/visualization-utils'; -import { - type LanguageDocumentationSections, - LanguageDocumentationPopover, -} from '@kbn/language-documentation-popover'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { i18n } from '@kbn/i18n'; import { EuiBadge, - useEuiTheme, + EuiButtonIcon, EuiFlexGroup, EuiFlexItem, - EuiButtonIcon, - EuiResizeObserver, EuiOutsideClickDetector, EuiToolTip, + useEuiTheme, } from '@elastic/eui'; import { CodeEditor, CodeEditorProps } from '@kbn/code-editor'; - +import type { CoreStart } from '@kbn/core/public'; +import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import type { AggregateQuery } from '@kbn/es-query'; +import { getAggregateQueryMode, getLanguageDisplayName } from '@kbn/es-query'; +import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; +import { i18n } from '@kbn/i18n'; +import type { IndexManagementPluginSetup } from '@kbn/index-management'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; import { - textBasedLanguageEditorStyles, - EDITOR_INITIAL_HEIGHT, - EDITOR_INITIAL_HEIGHT_EXPANDED, - EDITOR_MAX_HEIGHT, - EDITOR_MIN_HEIGHT, -} from './text_based_languages_editor.styles'; + LanguageDocumentationPopover, + type LanguageDocumentationSections, +} from '@kbn/language-documentation-popover'; +import { ESQLLang, ESQL_LANG_ID, ESQL_THEME_ID, monaco, type ESQLCallbacks } from '@kbn/monaco'; +import classNames from 'classnames'; +import memoize from 'lodash/memoize'; +import React, { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import { css } from '@emotion/react'; +import { EditorFooter } from './editor_footer'; +import { ErrorsWarningsCompactViewPopover } from './errors_warnings_popover'; +import { fetchFieldsFromESQL } from './fetch_fields_from_esql'; import { - useDebounceWithOptions, - parseWarning, - getInlineEditorText, + clearCacheWhenOld, getDocumentationSections, - type MonacoMessage, + getESQLSources, + getInlineEditorText, getWrappedInPipesCode, parseErrors, - clearCacheWhenOld, - getESQLSources, + parseWarning, + useDebounceWithOptions, + type MonacoMessage, } from './helpers'; -import { EditorFooter } from './editor_footer'; -import { ResizableButton } from './resizable_button'; -import { fetchFieldsFromESQL } from './fetch_fields_from_esql'; -import { ErrorsWarningsCompactViewPopover } from './errors_warnings_popover'; import { addQueriesToCache, updateCachedQueries } from './history_local_storage'; +import { ResizableButton } from './resizable_button'; +import { + EDITOR_INITIAL_HEIGHT, + EDITOR_INITIAL_HEIGHT_EXPANDED, + EDITOR_MAX_HEIGHT, + EDITOR_MIN_HEIGHT, + textBasedLanguageEditorStyles, +} from './text_based_languages_editor.styles'; import './overwrite.scss'; @@ -115,6 +113,9 @@ export interface TextBasedLanguagesEditorProps { /** hide query history **/ hideQueryHistory?: boolean; + + /** hide header buttons when editor is expanded */ + hideHeaderWhenExpanded?: boolean; } interface TextBasedEditorDeps { @@ -160,6 +161,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ allowQueryCancellation, hideTimeFilterInfo, hideQueryHistory, + hideHeaderWhenExpanded, }: TextBasedLanguagesEditorProps) { const { euiTheme } = useEuiTheme(); const language = getAggregateQueryMode(query); @@ -175,8 +177,12 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [editorHeight, setEditorHeight] = useState( isCodeEditorExpanded ? EDITOR_INITIAL_HEIGHT_EXPANDED : EDITOR_INITIAL_HEIGHT ); - const [isSpaceReduced, setIsSpaceReduced] = useState(false); - const [editorWidth, setEditorWidth] = useState(0); + + const [measuredEditorWidth, setMeasuredEditorWidth] = useState(0); + const [measuredContentWidth, setMeasuredContentWidth] = useState(0); + + const isSpaceReduced = Boolean(editorIsInline) && measuredEditorWidth < BREAKPOINT_WIDTH; + const [isHistoryOpen, setIsHistoryOpen] = useState(false); const [showLineNumbers, setShowLineNumbers] = useState(isCodeEditorExpanded); const [isCompactFocused, setIsCompactFocused] = useState(isCodeEditorExpanded); @@ -231,6 +237,28 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [language, onTextLangQuerySubmit, abortController, isQueryLoading, allowQueryCancellation]); + const onCommentLine = useCallback(() => { + const currentPosition = editor1.current?.getPosition(); + const lineNumber = currentPosition?.lineNumber; + if (lineNumber) { + const lineContent = editorModel.current?.getLineContent(lineNumber) ?? ''; + const hasComment = lineContent?.startsWith('//'); + const commentedLine = hasComment ? lineContent?.replace('//', '') : `//${lineContent}`; + // executeEdits allows to keep edit in history + editor1.current?.executeEdits('comment', [ + { + range: { + startLineNumber: lineNumber, + startColumn: 0, + endLineNumber: lineNumber, + endColumn: (lineContent?.length ?? 0) + 1, + }, + text: commentedLine, + }, + ]); + } + }, []); + useEffect(() => { if (!isLoading) setIsQueryLoading(false); }, [isLoading]); @@ -238,8 +266,6 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const [documentationSections, setDocumentationSections] = useState(); - const codeRef = useRef(code); - const toggleHistory = useCallback((status: boolean) => { setIsHistoryOpen(status); }, []); @@ -263,7 +289,8 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ isCodeEditorExpandedFocused, Boolean(documentationSections), Boolean(editorIsInline), - isHistoryOpen + isHistoryOpen, + !!hideHeaderWhenExpanded ); const isDark = isDarkMode; const editorModel = useRef(); @@ -431,6 +458,12 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ }; }, [esqlCallbacks, queryString]); + const clientParserStatus = clientParserMessages.errors?.length + ? 'error' + : clientParserMessages.warnings.length + ? 'warning' + : 'success'; + useEffect(() => { const validateQuery = async () => { if (editorModel?.current) { @@ -451,16 +484,12 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } else { updateCachedQueries({ queryString, - status: clientParserMessages.errors?.length - ? 'error' - : clientParserMessages.warnings.length - ? 'warning' - : 'success', + status: clientParserStatus, }); setRefetchHistoryItems(true); } - }, [clientParserMessages, isLoading, isQueryLoading, parseMessages, queryString, timeZone]); + }, [clientParserStatus, isLoading, isQueryLoading, parseMessages, queryString, timeZone]); const queryValidation = useCallback( async ({ active }: { active: boolean }) => { @@ -578,6 +607,28 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ [isCompactFocused, queryString, editorMessages] ); + // When the layout changes, and the editor is not focused, we want to + // recalculate the visible code so it fills up the available space. We + // use a ref because editorDidMount is only called once, and the reference + // to the state becomes stale after re-renders. + const onLayoutChange = (layoutInfoEvent: monaco.editor.EditorLayoutInfo) => { + if (layoutInfoEvent.contentWidth !== measuredContentWidth) { + const nextMeasuredWidth = layoutInfoEvent.contentWidth; + setMeasuredContentWidth(nextMeasuredWidth); + if (!isCodeEditorExpandedFocused && !isCompactFocused) { + calculateVisibleCode(nextMeasuredWidth, true); + } + } + + if (layoutInfoEvent.width !== measuredEditorWidth) { + setMeasuredEditorWidth(layoutInfoEvent.width); + } + }; + + const onLayoutChangeRef = useRef(onLayoutChange); + + onLayoutChangeRef.current = onLayoutChange; + useEffect(() => { if (editor1.current && !isCompactFocused) { if (code !== queryString) { @@ -594,24 +645,12 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ } }, [isCodeEditorExpanded, queryString]); - const linesBreaksButtonsStatus = useMemo(() => { + const isWrappedInPipes = useMemo(() => { const pipes = code?.split('|'); const pipesWithNewLine = code?.split('\n|'); - return { - addLineBreaksDisabled: pipes?.length === pipesWithNewLine?.length, - removeLineBreaksDisabled: pipesWithNewLine?.length === 1, - }; + return pipes?.length === pipesWithNewLine?.length; }, [code]); - const onResize = ({ width }: { width: number }) => { - setIsSpaceReduced(Boolean(editorIsInline && width < BREAKPOINT_WIDTH)); - calculateVisibleCode(width); - setEditorWidth(width); - if (editor1.current) { - editor1.current.layout({ width, height: editorHeight }); - } - }; - useEffect(() => { async function getDocumentation() { const sections = await getDocumentationSections(language); @@ -623,7 +662,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ }, [language, documentationSections]); const codeEditorOptions: CodeEditorProps['options'] = { - automaticLayout: false, + automaticLayout: true, accessibilitySupport: 'off', folding: false, fontSize: 14, @@ -667,7 +706,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ const editorPanel = ( <> - {isCodeEditorExpanded && ( + {isCodeEditorExpanded && !hideHeaderWhenExpanded && ( - { - const updatedCode = getWrappedInPipesCode(code, false); - if (code !== updatedCode) { - setCode(updatedCode); - onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); - } - }} - /> - - - - - { - const updatedCode = getWrappedInPipesCode(code, true); + const updatedCode = getWrappedInPipesCode(code, isWrappedInPipes); if (code !== updatedCode) { setCode(updatedCode); onTextLangQueryChange({ [language]: updatedCode } as AggregateQuery); } }} /> - + @@ -803,171 +827,159 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ )} - - - {(resizeRef) => ( - { - restoreInitialMode(); - }} + + { + restoreInitialMode(); + }} + > +
+ -
- -
- {!isCompactFocused && ( - - {i18n.translate( - 'textBasedEditor.query.textBasedLanguagesEditor.lineCount', - { - defaultMessage: '{count} {count, plural, one {line} other {lines}}', - values: { count: lines }, - } - )} - - )} - {!isCompactFocused && editorMessages.errors.length > 0 && ( - - )} - {!isCompactFocused && - editorMessages.warnings.length > 0 && - editorMessages.errors.length === 0 && ( - - )} - { - if (isCompactFocused || !hoverProvider?.provideHover) { - return { contents: [] }; - } - return hoverProvider?.provideHover(model, position, token); - }, - }} - codeActions={codeActionProvider} - onChange={onQueryUpdate} - editorDidMount={(editor) => { - editor1.current = editor; - const model = editor.getModel(); - if (model) { - editorModel.current = model; - } - if (isCodeEditorExpanded) { - lines = model?.getLineCount() || 1; - } +
+ {!isCompactFocused && ( + + {i18n.translate('textBasedEditor.query.textBasedLanguagesEditor.lineCount', { + defaultMessage: '{count} {count, plural, one {line} other {lines}}', + values: { count: lines }, + })} + + )} + {!isCompactFocused && editorMessages.errors.length > 0 && ( + + )} + {!isCompactFocused && + editorMessages.warnings.length > 0 && + editorMessages.errors.length === 0 && ( + + )} + { + if (isCompactFocused || !hoverProvider?.provideHover) { + return { contents: [] }; + } + return hoverProvider?.provideHover(model, position, token); + }, + }} + codeActions={codeActionProvider} + onChange={onQueryUpdate} + editorDidMount={(editor) => { + editor1.current = editor; + const model = editor.getModel(); + if (model) { + editorModel.current = model; + } + if (isCodeEditorExpanded) { + lines = model?.getLineCount() || 1; + } - editor.onDidChangeModelContent((e) => { - if (updateLinesFromModel) { - lines = model?.getLineCount() || 1; - } - const currentPosition = editor.getPosition(); - const content = editorModel.current?.getValueInRange({ - startLineNumber: 0, - startColumn: 0, - endLineNumber: currentPosition?.lineNumber ?? 1, - endColumn: currentPosition?.column ?? 1, - }); - if (content) { - codeRef.current = content || editor.getValue(); - } - }); - - // this is fixing a bug between the EUIPopover and the monaco editor - // when the user clicks the editor, we force it to focus and the onDidFocusEditorText - // to fire, the timeout is needed because otherwise it refocuses on the popover icon - // and the user needs to click again the editor. - // IMPORTANT: The popover needs to be wrapped with the EuiOutsideClickDetector component. - editor.onMouseDown(() => { - setTimeout(() => { - editor.focus(); - }, 100); - }); - - editor.onDidFocusEditorText(() => { - onEditorFocus(); - }); - - editor.onKeyDown(() => { - onEditorFocus(); - }); - - // on CMD/CTRL + Enter submit the query - editor.addCommand( - // eslint-disable-next-line no-bitwise - monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, - onQuerySubmit - ); - - if (!isCodeEditorExpanded) { - editor.onDidContentSizeChange((e) => { - // @ts-expect-error the property _oldContentHeight exists on the event object received but - // is not available on the type definition - if (e.contentHeight !== e._oldContentHeight) { - updateHeight(editor); - } - }); + // this is fixing a bug between the EUIPopover and the monaco editor + // when the user clicks the editor, we force it to focus and the onDidFocusEditorText + // to fire, the timeout is needed because otherwise it refocuses on the popover icon + // and the user needs to click again the editor. + // IMPORTANT: The popover needs to be wrapped with the EuiOutsideClickDetector component. + editor.onMouseDown(() => { + setTimeout(() => { + editor.focus(); + }, 100); + }); + + editor.onDidFocusEditorText(() => { + onEditorFocus(); + }); + + editor.onKeyDown(() => { + onEditorFocus(); + }); + + // on CMD/CTRL + Enter submit the query + editor.addCommand( + // eslint-disable-next-line no-bitwise + monaco.KeyMod.CtrlCmd | monaco.KeyCode.Enter, + onQuerySubmit + ); + + // on CMD/CTRL + / comment out the entire line + editor.addCommand( + // eslint-disable-next-line no-bitwise + monaco.KeyMod.CtrlCmd | monaco.KeyCode.Slash, + onCommentLine + ); + + setMeasuredEditorWidth(editor.getLayoutInfo().width); + setMeasuredContentWidth(editor.getContentWidth()); + + editor.onDidLayoutChange((layoutInfoEvent) => { + onLayoutChangeRef.current(layoutInfoEvent); + }); + + if (!isCodeEditorExpanded) { + editor.onDidContentSizeChange((e) => { + if (e.contentHeightChanged) { + updateHeight(editor); } - }} - /> - {isCompactFocused && !isCodeEditorExpanded && ( - - )} -
- + }); + } + }} + /> + {isCompactFocused && !isCodeEditorExpanded && ( + + )}
- - )} - +
+
+ {!isCodeEditorExpanded && ( @@ -1055,7 +1067,7 @@ export const TextBasedLanguagesEditor = memo(function TextBasedLanguagesEditor({ {...editorMessages} isHistoryOpen={isHistoryOpen} setIsHistoryOpen={toggleHistory} - containerWidth={editorWidth} + measuredContainerWidth={measuredEditorWidth} hideQueryHistory={hideHistoryComponent} refetchHistoryItems={refetchHistoryItems} queryHasChanged={code !== codeWhenSubmitted} diff --git a/packages/kbn-text-based-editor/tsconfig.json b/packages/kbn-text-based-editor/tsconfig.json index 78cee94bd68c8a..fcb296d4d086cf 100644 --- a/packages/kbn-text-based-editor/tsconfig.json +++ b/packages/kbn-text-based-editor/tsconfig.json @@ -24,7 +24,6 @@ "@kbn/expressions-plugin", "@kbn/data-views-plugin", "@kbn/index-management", - "@kbn/visualization-utils", "@kbn/code-editor", "@kbn/shared-ux-markdown", ], diff --git a/packages/kbn-unified-data-table/index.ts b/packages/kbn-unified-data-table/index.ts index 26095d948cb8ae..0929c33208fa09 100644 --- a/packages/kbn-unified-data-table/index.ts +++ b/packages/kbn-unified-data-table/index.ts @@ -7,7 +7,7 @@ */ export { UnifiedDataTable, DataLoadingState } from './src/components/data_table'; -export type { UnifiedDataTableProps } from './src/components/data_table'; +export type { UnifiedDataTableProps, SortOrder } from './src/components/data_table'; export { RowHeightSettings, type RowHeightSettingsProps, diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index a6496151521ec2..3a64947fe39cad 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -267,7 +267,7 @@ export interface UnifiedDataTableProps { theme: ThemeServiceStart; fieldFormats: FieldFormatsStart; uiSettings: IUiSettingsClient; - dataViewFieldEditor: DataViewFieldEditorStart; + dataViewFieldEditor?: DataViewFieldEditorStart; toastNotifications: ToastsStart; storage: Storage; data: DataPublicPluginStart; @@ -611,7 +611,7 @@ export const UnifiedDataTable = ({ useNewFieldsApi, shouldShowFieldHandler, closePopover: () => dataGridRef.current?.closeCellPopover(), - fieldFormats: services.fieldFormats, + fieldFormats, maxEntries: maxDocFieldsDisplayed, externalCustomRenderers, isPlainRecord, @@ -622,7 +622,7 @@ export const UnifiedDataTable = ({ useNewFieldsApi, shouldShowFieldHandler, maxDocFieldsDisplayed, - services.fieldFormats, + fieldFormats, externalCustomRenderers, isPlainRecord, ] @@ -651,18 +651,20 @@ export const UnifiedDataTable = ({ () => onFieldEdited ? (fieldName: string) => { - closeFieldEditor.current = services.dataViewFieldEditor.openEditor({ - ctx: { - dataView, - }, - fieldName, - onSave: async () => { - await onFieldEdited(); - }, - }); + closeFieldEditor.current = + onFieldEdited && + services?.dataViewFieldEditor?.openEditor({ + ctx: { + dataView, + }, + fieldName, + onSave: async () => { + await onFieldEdited(); + }, + }); } : undefined, - [dataView, onFieldEdited, services.dataViewFieldEditor] + [dataView, onFieldEdited, services?.dataViewFieldEditor] ); const timeFieldName = dataView.timeFieldName; @@ -756,7 +758,8 @@ export const UnifiedDataTable = ({ uiSettings, toastNotifications, }, - hasEditDataViewPermission: () => dataViewFieldEditor.userPermissions.editIndexPattern(), + hasEditDataViewPermission: () => + Boolean(dataViewFieldEditor?.userPermissions?.editIndexPattern()), valueToStringConverter, onFilter, editField, diff --git a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts index 4a194b9c4978f8..806a787ba139ce 100644 --- a/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts +++ b/packages/kbn-unified-field-list/src/services/field_stats_text_based/field_stats_utils_text_based.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { ESQLSearchReponse } from '@kbn/es-types'; +import type { ESQLSearchResponse } from '@kbn/es-types'; import { appendToESQLQuery } from '@kbn/esql-utils'; import type { DataViewField } from '@kbn/data-views-plugin/common'; import type { FieldStatsResponse } from '../../types'; @@ -22,7 +22,7 @@ import { } from '../../utils/can_provide_stats'; import { getFieldExampleBuckets } from '../field_examples_calculator'; -export type SearchHandlerTextBased = ({ query }: { query: string }) => Promise; +export type SearchHandlerTextBased = ({ query }: { query: string }) => Promise; export function buildSearchFilter({ timeFieldName, diff --git a/packages/kbn-unsaved-changes-prompt/README.md b/packages/kbn-unsaved-changes-prompt/README.md new file mode 100644 index 00000000000000..b5bdf1c361e37a --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/README.md @@ -0,0 +1,30 @@ +# @kbn/unsaved-changes-prompt + +The useUnsavedChangesPrompt function is a custom React hook that prompts users with +a confirmation dialog when they try to leave a page with unsaved changes. It blocks +navigation and shows a dialog using the provided openConfirm function. If the user +confirms, it navigates away; otherwise, it cancels the navigation, ensuring unsaved +changes are not lost. + + +```typescript +import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; + +export const SampleForm = ({ servicesForUnsavedChangesPrompt }) => { + const { form } = useForm(); + const isFormDirty = useFormIsModified({ form }); + + useUnsavedChangesPrompt({ + hasUnsavedChanges: isFormDirty, + ...servicesForUnsavedChangesPrompt, + }); + + return ( + <> +
+ .... +
+ + ); +}; +``` \ No newline at end of file diff --git a/packages/kbn-unsaved-changes-prompt/index.ts b/packages/kbn-unsaved-changes-prompt/index.ts new file mode 100644 index 00000000000000..0e572e40f86a4e --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 { useUnsavedChangesPrompt } from './src/unsaved_changes_prompt'; diff --git a/packages/kbn-unsaved-changes-prompt/jest.config.js b/packages/kbn-unsaved-changes-prompt/jest.config.js new file mode 100644 index 00000000000000..0db09e6ffcb0bf --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/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-unsaved-changes-prompt'], +}; diff --git a/packages/kbn-unsaved-changes-prompt/kibana.jsonc b/packages/kbn-unsaved-changes-prompt/kibana.jsonc new file mode 100644 index 00000000000000..3d3f2f6199dd6b --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/unsaved-changes-prompt", + "owner": "@elastic/kibana-management" +} diff --git a/packages/kbn-unsaved-changes-prompt/package.json b/packages/kbn-unsaved-changes-prompt/package.json new file mode 100644 index 00000000000000..250b1068ab373a --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/unsaved-changes-prompt", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file diff --git a/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/index.ts b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/index.ts new file mode 100644 index 00000000000000..75206075193895 --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 { useUnsavedChangesPrompt } from './unsaved_changes_prompt'; diff --git a/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx new file mode 100644 index 00000000000000..bbd14526a0ac3c --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.test.tsx @@ -0,0 +1,65 @@ +/* + * Copyright 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 { createMemoryHistory } from 'history'; +import { renderHook, act } from '@testing-library/react-hooks'; + +import { coreMock } from '@kbn/core/public/mocks'; +import { CoreScopedHistory } from '@kbn/core/public'; + +import { useUnsavedChangesPrompt } from './unsaved_changes_prompt'; + +const basePath = '/mock'; +const memoryHistory = createMemoryHistory({ initialEntries: [basePath] }); +const history = new CoreScopedHistory(memoryHistory, basePath); +const coreStart = coreMock.createStart(); +const navigateToUrl = jest.fn().mockImplementation(async (url) => { + history.push(url); +}); + +describe('useUnsavedChangesPrompt', () => { + it('should not block if not edited', () => { + renderHook(() => + useUnsavedChangesPrompt({ + hasUnsavedChanges: false, + http: coreStart.http, + openConfirm: coreStart.overlays.openConfirm, + history, + navigateToUrl, + }) + ); + + act(() => history.push('/test')); + + expect(history.location.pathname).toBe('/test'); + expect(history.location.search).toBe(''); + expect(coreStart.overlays.openConfirm).not.toBeCalled(); + }); + + it('should block if edited', async () => { + coreStart.overlays.openConfirm.mockResolvedValue(true); + + renderHook(() => + useUnsavedChangesPrompt({ + hasUnsavedChanges: true, + http: coreStart.http, + openConfirm: coreStart.overlays.openConfirm, + history, + navigateToUrl, + }) + ); + + act(() => history.push('/test')); + + // needed because we have an async useEffect + await act(() => new Promise((resolve) => resolve())); + + expect(navigateToUrl).toBeCalledWith('/mock/test', expect.anything()); + expect(coreStart.overlays.openConfirm).toBeCalled(); + }); +}); diff --git a/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.tsx b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.tsx new file mode 100644 index 00000000000000..20d815cffd8b37 --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/src/unsaved_changes_prompt/unsaved_changes_prompt.tsx @@ -0,0 +1,96 @@ +/* + * Copyright 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 { useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; + +import { ApplicationStart, ScopedHistory, OverlayStart, HttpStart } from '@kbn/core/public'; + +const DEFAULT_BODY_TEXT = i18n.translate('unsavedChangesPrompt.defaultModalText', { + defaultMessage: `The data will be lost if you leave this page without saving the changes.`, +}); + +const DEFAULT_TITLE_TEXT = i18n.translate('unsavedChangesPrompt.defaultModalTitle', { + defaultMessage: 'Discard unsaved changes?', +}); + +const DEFAULT_CANCEL_BUTTON = i18n.translate('unsavedChangesPrompt.defaultModalCancel', { + defaultMessage: 'Keep editing', +}); + +const DEFAULT_CONFIRM_BUTTON = i18n.translate('unsavedChangesPrompt.defaultModalConfirm', { + defaultMessage: 'Leave page', +}); + +interface Props { + hasUnsavedChanges: boolean; + http: HttpStart; + openConfirm: OverlayStart['openConfirm']; + history: ScopedHistory; + navigateToUrl: ApplicationStart['navigateToUrl']; + titleText?: string; + messageText?: string; + cancelButtonText?: string; + confirmButtonText?: string; +} + +export const useUnsavedChangesPrompt = ({ + hasUnsavedChanges, + openConfirm, + history, + http, + navigateToUrl, + // Provide overrides for confirm dialog + messageText = DEFAULT_BODY_TEXT, + titleText = DEFAULT_TITLE_TEXT, + confirmButtonText = DEFAULT_CONFIRM_BUTTON, + cancelButtonText = DEFAULT_CANCEL_BUTTON, +}: Props) => { + useEffect(() => { + if (!hasUnsavedChanges) { + return; + } + + const unblock = history.block((state) => { + async function confirmAsync() { + const confirmResponse = await openConfirm(messageText, { + title: titleText, + cancelButtonText, + confirmButtonText, + 'data-test-subj': 'navigationBlockConfirmModal', + }); + + if (confirmResponse) { + // Compute the URL we want to redirect to + const url = http.basePath.prepend(state.pathname) + state.hash + state.search; + // Unload history block + unblock(); + // Navigate away + navigateToUrl(url, { + state: state.state, + }); + } + } + + confirmAsync(); + return false; + }); + + return unblock; + }, [ + history, + hasUnsavedChanges, + openConfirm, + navigateToUrl, + http.basePath, + titleText, + cancelButtonText, + confirmButtonText, + messageText, + ]); +}; diff --git a/packages/kbn-unsaved-changes-prompt/tsconfig.json b/packages/kbn-unsaved-changes-prompt/tsconfig.json new file mode 100644 index 00000000000000..a8d349af93f84a --- /dev/null +++ b/packages/kbn-unsaved-changes-prompt/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": ["*.ts", "src/**/*"], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/i18n", + "@kbn/core" + ] +} diff --git a/packages/presentation/presentation_containers/index.ts b/packages/presentation/presentation_containers/index.ts index 0c55ae715eb982..06c1d7c04ee9cf 100644 --- a/packages/presentation/presentation_containers/index.ts +++ b/packages/presentation/presentation_containers/index.ts @@ -27,6 +27,7 @@ export { apiIsPresentationContainer, getContainerParentFromAPI, listenForCompatibleApi, + combineCompatibleChildrenApis, type PanelPackage, type PresentationContainer, } from './interfaces/presentation_container'; diff --git a/packages/presentation/presentation_containers/interfaces/presentation_container.ts b/packages/presentation/presentation_containers/interfaces/presentation_container.ts index be39c1a5c8be38..d201a0d346132f 100644 --- a/packages/presentation/presentation_containers/interfaces/presentation_container.ts +++ b/packages/presentation/presentation_containers/interfaces/presentation_container.ts @@ -6,23 +6,16 @@ * Side Public License, v 1. */ -import { - apiHasParentApi, - apiHasUniqueId, - PublishesViewMode, - PublishingSubject, -} from '@kbn/presentation-publishing'; +import { apiHasParentApi, apiHasUniqueId, PublishingSubject } from '@kbn/presentation-publishing'; +import { BehaviorSubject, combineLatest, isObservable, map, Observable, of, switchMap } from 'rxjs'; import { apiCanAddNewPanel, CanAddNewPanel } from './can_add_new_panel'; -import { PublishesSettings } from './publishes_settings'; export interface PanelPackage { panelType: string; initialState?: SerializedState; } -export interface PresentationContainer - extends Partial, - CanAddNewPanel { +export interface PresentationContainer extends CanAddNewPanel { /** * Removes a panel from the container. */ @@ -101,3 +94,34 @@ export const listenForCompatibleApi = ( lastCleanupFunction?.(); }; }; + +export const combineCompatibleChildrenApis = ( + api: unknown, + observableKey: keyof ApiType, + isCompatible: (api: unknown) => api is ApiType, + emptyState: PublishingSubjectType, + flattenMethod?: (array: PublishingSubjectType[]) => PublishingSubjectType +): Observable => { + if (!api || !apiIsPresentationContainer(api)) return of(); + + return api.children$.pipe( + switchMap((children) => { + const compatibleChildren: Array> = []; + for (const child of Object.values(children)) { + if (isCompatible(child) && isObservable(child[observableKey])) + compatibleChildren.push(child[observableKey] as BehaviorSubject); + } + + if (compatibleChildren.length === 0) return of(emptyState); + + return combineLatest(compatibleChildren).pipe( + map( + flattenMethod + ? flattenMethod + : (nextCompatible) => + nextCompatible.flat().filter((value) => Boolean(value)) as PublishingSubjectType + ) + ); + }) + ); +}; diff --git a/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts index 975f6f3863de14..e3136215f3d40c 100644 --- a/packages/presentation/presentation_publishing/index.ts +++ b/packages/presentation/presentation_publishing/index.ts @@ -36,13 +36,16 @@ export { } from './interfaces/fetch/initialize_time_range'; export { apiPublishesPartialUnifiedSearch, + apiPublishesFilters, apiPublishesTimeRange, apiPublishesUnifiedSearch, apiPublishesWritableUnifiedSearch, useSearchApi, type PublishesTimeRange, + type PublishesFilters, type PublishesUnifiedSearch, type PublishesWritableUnifiedSearch, + type PublishesTimeslice, } from './interfaces/fetch/publishes_unified_search'; export { apiHasAppContext, diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts index 5f349665fa36b5..f426859cc29b3d 100644 --- a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts @@ -6,26 +6,33 @@ * Side Public License, v 1. */ -import { BehaviorSubject } from 'rxjs'; -import { TimeRange, Filter, Query, AggregateQuery } from '@kbn/es-query'; +import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; import { useEffect, useMemo } from 'react'; +import { BehaviorSubject } from 'rxjs'; import { PublishingSubject } from '../../publishing_subject'; -export interface PublishesTimeRange { +export interface PublishesTimeslice { + timeslice$?: PublishingSubject<[number, number] | undefined>; +} + +export interface PublishesTimeRange extends PublishesTimeslice { timeRange$: PublishingSubject; timeRestore$?: PublishingSubject; - timeslice$?: PublishingSubject<[number, number] | undefined>; } export type PublishesWritableTimeRange = PublishesTimeRange & { setTimeRange: (timeRange: TimeRange | undefined) => void; }; -export type PublishesUnifiedSearch = PublishesTimeRange & { - isCompatibleWithUnifiedSearch?: () => boolean; +export interface PublishesFilters { filters$: PublishingSubject; - query$: PublishingSubject; -}; +} + +export type PublishesUnifiedSearch = PublishesTimeRange & + PublishesFilters & { + isCompatibleWithUnifiedSearch?: () => boolean; + query$: PublishingSubject; + }; export type PublishesWritableUnifiedSearch = PublishesUnifiedSearch & PublishesWritableTimeRange & { @@ -39,6 +46,10 @@ export const apiPublishesTimeRange = ( return Boolean(unknownApi && (unknownApi as PublishesTimeRange)?.timeRange$ !== undefined); }; +export const apiPublishesFilters = (unknownApi: unknown): unknownApi is PublishesFilters => { + return Boolean(unknownApi && (unknownApi as PublishesFilters)?.filters$ !== undefined); +}; + export const apiPublishesUnifiedSearch = ( unknownApi: null | unknown ): unknownApi is PublishesUnifiedSearch => { diff --git a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx index 37297e3f25c0e7..3d549cf663703d 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/components/navigation_section_ui.tsx @@ -6,14 +6,12 @@ * Side Public License, v 1. */ -import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; -import classNames from 'classnames'; +import React, { type FC, useMemo, useEffect, useState, useCallback } from 'react'; import { css } from '@emotion/css'; import { EuiTitle, EuiCollapsibleNavItem, EuiSpacer, - type EuiAccordionProps, type EuiCollapsibleNavItemProps, type EuiCollapsibleNavSubItemProps, } from '@elastic/eui'; @@ -22,36 +20,31 @@ import classnames from 'classnames'; import type { EuiThemeSize, RenderAs } from '@kbn/core-chrome-browser/src/project_navigation'; import { useNavigation as useServices } from '../../services'; -import { isAbsoluteLink, isActiveFromUrl } from '../../utils'; +import { isAbsoluteLink, isActiveFromUrl, isAccordionNode } from '../../utils'; import type { NavigateToUrlFn } from '../../types'; import { useNavigation } from '../navigation'; +import { useAccordionState } from '../hooks'; +import { + DEFAULT_IS_COLLAPSIBLE, + DEFAULT_RENDER_AS, + DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS, +} from '../constants'; +import type { EuiCollapsibleNavSubItemPropsEnhanced } from '../types'; import { PanelContext, usePanel } from './panel'; import { NavigationItemOpenPanel } from './navigation_item_open_panel'; -type EuiCollapsibleNavSubItemPropsEnhanced = EuiCollapsibleNavSubItemProps & { path?: string }; - -const DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS: EuiThemeSize = 'm'; -const DEFAULT_IS_COLLAPSED = true; -const DEFAULT_IS_COLLAPSIBLE = true; -const DEFAULT_RENDER_AS: RenderAs = 'block'; - const nodeHasLink = (navNode: ChromeProjectNavigationNode) => Boolean(navNode.deepLink) || Boolean(navNode.href); const nodeHasChildren = (navNode: ChromeProjectNavigationNode) => Boolean(navNode.children?.length); -/** - * Predicate to determine if a node should be visible in the main side nav. - * If it is not visible it will be filtered out and not rendered. - */ +/** Predicate to determine if a node should be visible in the main side nav.*/ const itemIsVisible = (item: ChromeProjectNavigationNode) => { if (item.sideNavStatus === 'hidden') return false; if (item.renderItem) return true; - if (nodeHasLink(item)) { - return true; - } + if (nodeHasLink(item)) return true; if (nodeHasChildren(item)) { return item.renderAs === 'item' ? true : item.children!.some(itemIsVisible); @@ -75,17 +68,10 @@ const getTestSubj = (navNode: ChromeProjectNavigationNode, isActive = false): st }); }; -const filterChildren = ( - children?: ChromeProjectNavigationNode[] -): ChromeProjectNavigationNode[] | undefined => { - if (!children) return undefined; - return children.filter(itemIsVisible); -}; - const serializeNavNode = (navNode: ChromeProjectNavigationNode) => { const serialized: ChromeProjectNavigationNode = { ...navNode, - children: filterChildren(navNode.children), + children: navNode.children?.filter(itemIsVisible), }; serialized.renderAs = getRenderAs(serialized); @@ -94,7 +80,7 @@ const serializeNavNode = (navNode: ChromeProjectNavigationNode) => { navNode: serialized, hasChildren: nodeHasChildren(serialized), hasLink: nodeHasLink(serialized), - isItem: serialized.renderAs === 'item' || serialized.children === undefined, + isItem: serialized.renderAs === 'item', }; }; @@ -156,58 +142,69 @@ const renderGroup = ( return [itemPrepend, ...groupItems]; }; -const isAccordionNode = ( - node: Pick -) => - node.renderAs === 'accordion' || - ['defaultIsCollapsed', 'isCollapsible'].some((prop) => node.hasOwnProperty(prop)); - -// Generate the EuiCollapsible props for both the root component (EuiCollapsibleNavItem) and its -// "items" props. Both are compatible with the exception of "renderItem" which is only used for -// sub items. -const nodeToEuiCollapsibleNavProps = ( - _navNode: ChromeProjectNavigationNode, +const renderPanelOpener = ( + navGroup: ChromeProjectNavigationNode, { + spaceBefore, navigateToUrl, - openPanel, - closePanel, - isSideNavCollapsed, - treeDepth, - itemsAccordionState, activeNodes, }: { + spaceBefore?: EuiThemeSize | null; + navigateToUrl: NavigateToUrlFn; + activeNodes: ChromeProjectNavigationNode[][]; + } +): Required['items'] => { + const items: EuiCollapsibleNavSubItemPropsEnhanced[] = [ + { + renderItem: () => ( + + ), + }, + ]; + + if (spaceBefore) { + items.unshift({ + renderItem: () => , + }); + } + + return items; +}; + +const getEuiProps = ( + _navNode: ChromeProjectNavigationNode, + deps: { navigateToUrl: NavigateToUrlFn; - openPanel: PanelContext['open']; closePanel: PanelContext['close']; - isSideNavCollapsed: boolean; treeDepth: number; - itemsAccordionState: AccordionItemsState; + getIsCollapsed: (path: string) => boolean; activeNodes: ChromeProjectNavigationNode[][]; } ): { - items: Array; - isVisible: boolean; -} => { + navNode: ChromeProjectNavigationNode; + subItems: EuiCollapsibleNavItemProps['items']; + isSelected: boolean; + isItem: boolean; + dataTestSubj: string; + spaceBefore?: EuiThemeSize | null; +} & Pick => { + const { navigateToUrl, closePanel, treeDepth, getIsCollapsed, activeNodes } = deps; const { navNode, isItem, hasChildren, hasLink } = serializeNavNode(_navNode); - const { - id, - path, - href, - renderAs, - onClick: customOnClick, - isCollapsible = DEFAULT_IS_COLLAPSIBLE, - } = navNode; - const isAccordion = isAccordionNode(navNode); + const { path, href, onClick: customOnClick, isCollapsible = DEFAULT_IS_COLLAPSIBLE } = navNode; + const isAccordion = isAccordionNode(navNode); // If the node is an accordion and it is not collapsible, we only want to mark it as active // if it is the highest match in the URL, not if one of its children is also active. const onlyIfHighestMatch = isAccordion && !isCollapsible; const isActive = isActiveFromUrl(navNode.path, activeNodes, onlyIfHighestMatch); const isExternal = Boolean(href) && !navNode.isElasticInternalLink && isAbsoluteLink(href!); - const isAccordionExpanded = - (itemsAccordionState[path]?.isCollapsed ?? DEFAULT_IS_COLLAPSED) === false; - let isSelected = isActive; + const isAccordionExpanded = !getIsCollapsed(path); + let isSelected = isActive; if (isAccordion && isAccordionExpanded) { // For accordions that are collapsible, we don't want to mark the parent button as selected // when it is expanded. If the accordion is **not** collapsible then we do. @@ -223,56 +220,12 @@ const nodeToEuiCollapsibleNavProps = ( spaceBefore = DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS; } - if (renderAs === 'panelOpener') { - const items: EuiCollapsibleNavSubItemPropsEnhanced[] = [ - { - renderItem: () => ( - - ), - }, - ]; - if (spaceBefore) { - items.unshift({ - renderItem: () => , - }); - } - return { items, isVisible: true }; - } - - const onClick = (e: React.MouseEvent) => { - if (customOnClick) { - customOnClick(e); - return; - } - - // Do not navigate if it is a collapsible accordion, link will be used in the breadcrumb - if (isAccordion && isCollapsible) return; - - if (href !== undefined) { - e.preventDefault(); - navigateToUrl(href); - closePanel(); - return; - } - }; - const subItems: EuiCollapsibleNavItemProps['items'] | undefined = isItem ? undefined : navNode.children ?.map((child) => - nodeToEuiCollapsibleNavProps(child, { - navigateToUrl, - openPanel, - closePanel, - isSideNavCollapsed, - treeDepth: treeDepth + 1, - itemsAccordionState, - activeNodes, - }) + // Recursively convert the children to EuiCollapsibleNavSubItemProps + nodeToEuiCollapsibleNavProps(child, { ...deps, treeDepth: treeDepth + 1 }) ) .filter(({ isVisible }) => isVisible) .map((res) => { @@ -299,25 +252,81 @@ const nodeToEuiCollapsibleNavProps = ( } : undefined; - if (renderAs === 'block' && treeDepth > 0 && subItems) { - // Render as a group block (bold title + list of links underneath) + const onClick = (e: React.MouseEvent) => { + if (customOnClick) { + customOnClick(e); + return; + } + + // Do not navigate if it is a collapsible accordion, if there is a "link" defined it + // will be used in the breadcrumb navigation. + if (isAccordion && isCollapsible) return; + + if (href !== undefined) { + e.preventDefault(); + navigateToUrl(href); + closePanel(); + return; + } + }; + + return { + navNode, + subItems, + isSelected, + isItem, + spaceBefore, + dataTestSubj, + linkProps, + onClick, + }; +}; + +// Generate the EuiCollapsible props for the root component (EuiCollapsibleNavItem) and its +// "items" props (recursively). Both are compatible with the exception of `renderItem` which +// can only be used for sub items (not top level). +function nodeToEuiCollapsibleNavProps( + _navNode: ChromeProjectNavigationNode, + deps: { + navigateToUrl: NavigateToUrlFn; + closePanel: PanelContext['close']; + treeDepth: number; + getIsCollapsed: (path: string) => boolean; + activeNodes: ChromeProjectNavigationNode[][]; + } +): { + items: Array; + isVisible: boolean; +} { + const { navNode, subItems, dataTestSubj, isSelected, isItem, spaceBefore, linkProps, onClick } = + getEuiProps(_navNode, deps); + const { id, path, href, renderAs, isCollapsible } = navNode; + + if (navNode.renderItem) { + // Leave the rendering to the consumer return { - items: [...renderGroup(navNode, subItems, { spaceBefore: spaceBefore ?? null })], - isVisible: subItems.length > 0, + items: [{ renderItem: navNode.renderItem }], + isVisible: true, }; } - if (navNode.renderItem) { + if (renderAs === 'panelOpener') { + // Render as a panel opener (button to open a panel as a second navigation) return { - items: [ - { - renderItem: navNode.renderItem, - }, - ], + items: [...renderPanelOpener(navNode, deps)], isVisible: true, }; } + if (renderAs === 'block' && deps.treeDepth > 0 && subItems) { + // Render as a group block (bold title + list of links underneath) + return { + items: [...renderGroup(navNode, subItems, { spaceBefore: spaceBefore ?? null })], + isVisible: subItems.length > 0, + }; + } + + // Render as a link or an accordion const items: Array = [ { id, @@ -327,12 +336,12 @@ const nodeToEuiCollapsibleNavProps = ( icon: navNode.icon, title: navNode.title, ['data-test-subj']: dataTestSubj, - iconProps: { size: treeDepth === 0 ? 'm' : 's' }, + iconProps: { size: deps.treeDepth === 0 ? 'm' : 's' }, // Render as an accordion or a link (handled by EUI) depending if // "items" is undefined or not. If it is undefined --> a link, otherwise an // accordion is rendered. - ...(subItems ? { items: subItems } : { href, linkProps }), + ...(subItems ? { items: subItems, isCollapsible } : { href, linkProps }), }, ]; @@ -346,7 +355,7 @@ const nodeToEuiCollapsibleNavProps = ( } return { items, isVisible }; -}; +} const className = css` .euiAccordion__childWrapper { @@ -354,204 +363,46 @@ const className = css` } `; -interface AccordionItemsState { - [navNodeId: string]: { - isCollapsible: boolean; - isCollapsed: boolean; - // We want to auto expand the group automatically if the node is active (URL match) - // but once the user manually expand a group we don't want to close it afterward automatically. - doCollapseFromActiveState: boolean; - }; -} - interface Props { navNode: ChromeProjectNavigationNode; } export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) => { const { activeNodes } = useNavigation(); - const { navigateToUrl, isSideNavCollapsed } = useServices(); + const { navigateToUrl } = useServices(); + const [items, setItems] = useState(); const { navNode } = useMemo( () => serializeNavNode({ - renderAs: 'accordion', // Top level nodes are always rendered as accordion + renderAs: _navNode.children ? 'accordion' : 'item', // Top level nodes are either item or accordion ..._navNode, }), [_navNode] ); - const { open: openPanel, close: closePanel } = usePanel(); + const { close: closePanel } = usePanel(); - const navNodesById = useMemo(() => { - const byId = { - [navNode.path]: navNode, - }; + const { getIsCollapsed, getAccordionProps } = useAccordionState({ navNode }); - const parse = (navNodes?: ChromeProjectNavigationNode[]) => { - if (!navNodes) return; - navNodes.forEach((childNode) => { - byId[childNode.path] = childNode; - parse(childNode.children); - }); - }; - parse(navNode.children); - - return byId; - }, [navNode]); - - const [itemsAccordionState, setItemsAccordionState] = useState(() => { - return Object.entries(navNodesById).reduce((acc, [_id, node]) => { - if (isAccordionNode(node)) { - let isCollapsed = DEFAULT_IS_COLLAPSED; - let doCollapseFromActiveState = true; - - if (node.defaultIsCollapsed !== undefined) { - isCollapsed = node.defaultIsCollapsed; - doCollapseFromActiveState = false; - } - - acc[_id] = { - isCollapsed, - isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, - doCollapseFromActiveState, - }; - } - - return acc; - }, {}); - }); - - const [subItems, setSubItems] = useState(); - - const toggleAccordion = useCallback((id: string) => { - setItemsAccordionState((prev) => { - const prevState = prev[id]; - const prevValue = prevState?.isCollapsed ?? DEFAULT_IS_COLLAPSED; - const { isCollapsible } = prevState; - return { - ...prev, - [id]: { - ...prev[id], - isCollapsed: !prevValue, - doCollapseFromActiveState: isCollapsible - ? // if the accordion is collapsible & the user has interacted with the accordion - // we don't want to auto-close it when URL changes to not interfere with the user's choice - false - : // if the accordion is **not** collapsible we do want to auto-close it when the URL changes - prevState.doCollapseFromActiveState, - }, - }; - }); - }, []); - - const getAccordionProps = useCallback( - ( - id: string, - _accordionProps?: Partial - ): Partial | undefined => { - const isCollapsed = itemsAccordionState[id]?.isCollapsed; - const isCollapsible = itemsAccordionState[id]?.isCollapsible; - - if (isCollapsed === undefined) return _accordionProps; // No state set yet - - let forceState: EuiAccordionProps['forceState'] = isCollapsed ? 'closed' : 'open'; - if (!isCollapsible) forceState = 'open'; // Allways open if the accordion is not collapsible - - const arrowProps: EuiAccordionProps['arrowProps'] = { - css: isCollapsible ? undefined : { display: 'none' }, - 'data-test-subj': classNames(`accordionArrow`, `accordionArrow-${id}`), - }; - - const updated: Partial = { - ..._accordionProps, - arrowProps, - isCollapsible, - forceState, - onToggle: isCollapsible - ? () => { - toggleAccordion(id); - } - : undefined, - }; - - return updated; - }, - [itemsAccordionState, toggleAccordion] - ); - - const { items, isVisible } = useMemo(() => { + const { + items: [props], + isVisible, + } = useMemo(() => { return nodeToEuiCollapsibleNavProps(navNode, { navigateToUrl, - openPanel, closePanel, - isSideNavCollapsed, treeDepth: 0, - itemsAccordionState, + getIsCollapsed, activeNodes, }); - }, [ - navNode, - navigateToUrl, - openPanel, - closePanel, - isSideNavCollapsed, - itemsAccordionState, - activeNodes, - ]); - - const [props] = items; - const { items: accordionItems } = props; - - if (!isEuiCollapsibleNavItemProps(props)) { - throw new Error(`Invalid EuiCollapsibleNavItem props for node ${props.id}`); - } + }, [navNode, navigateToUrl, closePanel, getIsCollapsed, activeNodes]); - /** - * Effect to set the internal state of each of the accordions (isCollapsed) based on the - * "isActive" state of the navNode or if its path matches the URL location - */ - useEffect(() => { - setItemsAccordionState((prev) => { - return Object.entries(navNodesById).reduce( - (acc, [_id, node]) => { - const prevState = prev[_id]; - - if ( - isAccordionNode(node) && - (!prevState || prevState.doCollapseFromActiveState === true) - ) { - let nextIsActive = false; - let doCollapseFromActiveState = true; - - if (!prevState && node.defaultIsCollapsed !== undefined) { - nextIsActive = !node.defaultIsCollapsed; - doCollapseFromActiveState = false; - } else { - if (prevState?.doCollapseFromActiveState !== false) { - nextIsActive = isActiveFromUrl(node.path, activeNodes); - } else if (nextIsActive === undefined) { - nextIsActive = !DEFAULT_IS_COLLAPSED; - } - } - - acc[_id] = { - ...prevState, - isCollapsed: !nextIsActive, - isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, - doCollapseFromActiveState, - }; - } - return acc; - }, - { ...prev } - ); - }); - }, [navNodesById, activeNodes]); + const { items: topLevelItems } = props; - useEffect(() => { - // Serializer to add recursively the accordionProps to each of the items - // that will control its "open"/"closed" state + handler to toggle the state. - const serializeAccordionItems = ( + // Serializer to add recursively the accordionProps to each of the items + // that will control its "open"/"closed" state + handler to toggle the state. + const serializeAccordionItems = useCallback( + ( _items?: EuiCollapsibleNavSubItemPropsEnhanced[] ): EuiCollapsibleNavSubItemProps[] | undefined => { if (!_items) return; @@ -561,12 +412,12 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) return item; } - const itemsSerialized: EuiCollapsibleNavSubItemProps['items'] = serializeAccordionItems( + const subItems: EuiCollapsibleNavSubItemProps['items'] = serializeAccordionItems( item.items ); const accordionProps = - itemsSerialized === undefined + subItems === undefined ? undefined : getAccordionProps(path ?? item.id!, { onClick: item.onClick, @@ -584,10 +435,10 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) ...rest } = item; - const parsed: EuiCollapsibleNavSubItemProps = itemsSerialized + const parsed: EuiCollapsibleNavSubItemProps = subItems ? { ...rest, - items: itemsSerialized, + items: subItems, accordionProps, isCollapsible, } @@ -599,27 +450,35 @@ export const NavigationSectionUI: FC = React.memo(({ navNode: _navNode }) return parsed; }); - }; + }, + [getAccordionProps] + ); - setSubItems(serializeAccordionItems(accordionItems)); - }, [accordionItems, getAccordionProps]); + useEffect(() => { + setItems(serializeAccordionItems(topLevelItems)); + }, [topLevelItems, serializeAccordionItems]); + + if (!isEuiCollapsibleNavItemProps(props)) { + throw new Error(`Invalid EuiCollapsibleNavItem props for node ${props.id}`); + } if (!isVisible) { return null; } - if (!subItems) { + + if (!items) { return ; } + // Item type ExclusiveUnion - accordions should not contain links + const { href, linkProps, ...rest } = props; + return ( ); }); diff --git a/packages/shared-ux/chrome/navigation/src/ui/constants.ts b/packages/shared-ux/chrome/navigation/src/ui/constants.ts new file mode 100644 index 00000000000000..4a6a85bba00ae4 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/constants.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import type { EuiThemeSize, RenderAs } from '@kbn/core-chrome-browser'; + +export const DEFAULT_SPACE_BETWEEN_LEVEL_1_GROUPS: EuiThemeSize = 'm'; +export const DEFAULT_IS_COLLAPSED = true; +export const DEFAULT_IS_COLLAPSIBLE = true; +export const DEFAULT_RENDER_AS: RenderAs = 'block'; diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts b/packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts new file mode 100644 index 00000000000000..acfda4ab1bd2e1 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/hooks/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 { useAccordionState, type AccordionItemsState } from './use_accordion_state'; diff --git a/packages/shared-ux/chrome/navigation/src/ui/hooks/use_accordion_state.ts b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_accordion_state.ts new file mode 100644 index 00000000000000..782d93464df15b --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/hooks/use_accordion_state.ts @@ -0,0 +1,181 @@ +/* + * Copyright 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 { useCallback, useMemo, useState, useEffect } from 'react'; +import classNames from 'classnames'; +import { type EuiAccordionProps } from '@elastic/eui'; +import type { ChromeProjectNavigationNode } from '@kbn/core-chrome-browser'; + +import { isAccordionNode, isActiveFromUrl } from '../../utils'; +import { DEFAULT_IS_COLLAPSED, DEFAULT_IS_COLLAPSIBLE } from '../constants'; +import { useNavigation } from '../navigation'; + +export interface AccordionItemsState { + [navNodeId: string]: { + isCollapsible: boolean; + isCollapsed: boolean; + // We want to auto expand the group automatically if the node is active (URL match) + // but once the user manually expand a group we don't want to close it afterward automatically. + doCollapseFromActiveState: boolean; + }; +} + +export const useAccordionState = ({ navNode }: { navNode: ChromeProjectNavigationNode }) => { + const { activeNodes } = useNavigation(); + + const navNodesById = useMemo(() => { + const byId = { + [navNode.path]: navNode, + }; + + const parse = (navNodes?: ChromeProjectNavigationNode[]) => { + if (!navNodes) return; + navNodes.forEach((childNode) => { + byId[childNode.path] = childNode; + parse(childNode.children); + }); + }; + parse(navNode.children); + + return byId; + }, [navNode]); + + const [accordionStateById, setAccordionStateById] = useState(() => { + return Object.entries(navNodesById).reduce((acc, [_id, node]) => { + if (isAccordionNode(node)) { + let isCollapsed = DEFAULT_IS_COLLAPSED; + let doCollapseFromActiveState = true; + + if (node.defaultIsCollapsed !== undefined) { + isCollapsed = node.defaultIsCollapsed; + doCollapseFromActiveState = false; + } + + acc[_id] = { + isCollapsed, + isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, + doCollapseFromActiveState, + }; + } + + return acc; + }, {}); + }); + + const toggleAccordion = useCallback((path: string) => { + setAccordionStateById((prev) => { + const prevState = prev[path]; + const prevValue = prevState?.isCollapsed ?? DEFAULT_IS_COLLAPSED; + const { isCollapsible } = prevState; + return { + ...prev, + [path]: { + ...prev[path], + isCollapsed: !prevValue, + doCollapseFromActiveState: isCollapsible + ? // if the accordion is collapsible & the user has interacted with the accordion + // we don't want to auto-close it when URL changes to not interfere with the user's choice + false + : // if the accordion is **not** collapsible we do want to auto-close it when the URL changes + prevState.doCollapseFromActiveState, + }, + }; + }); + }, []); + + const getAccordionProps = useCallback( + ( + path: string, + _accordionProps?: Partial + ): Partial | undefined => { + const isCollapsed = accordionStateById[path]?.isCollapsed; + const isCollapsible = accordionStateById[path]?.isCollapsible; + + if (isCollapsed === undefined) return _accordionProps; // No state set yet + + let forceState: EuiAccordionProps['forceState'] = isCollapsed ? 'closed' : 'open'; + if (!isCollapsible) forceState = 'open'; // Allways open if the accordion is not collapsible + + const arrowProps: EuiAccordionProps['arrowProps'] = { + css: isCollapsible ? undefined : { display: 'none' }, + 'data-test-subj': classNames(`accordionArrow`, `accordionArrow-${path}`), + }; + + const updated: Partial = { + ..._accordionProps, + arrowProps, + isCollapsible, + forceState, + onToggle: isCollapsible + ? () => { + toggleAccordion(path); + } + : undefined, + }; + + return updated; + }, + [accordionStateById, toggleAccordion] + ); + + const getIsCollapsed = useCallback( + (path: string) => { + return accordionStateById[path]?.isCollapsed ?? DEFAULT_IS_COLLAPSED; + }, + [accordionStateById] + ); + + /** + * Effect to set the internal state of each of the accordions (isCollapsed) based on the + * "isActive" state of the navNode or if its path matches the URL location + */ + useEffect(() => { + setAccordionStateById((prev) => { + return Object.entries(navNodesById).reduce( + (acc, [_id, node]) => { + const prevState = prev[_id]; + + if ( + isAccordionNode(node) && + (!prevState || prevState.doCollapseFromActiveState === true) + ) { + let nextIsActive = false; + let doCollapseFromActiveState = true; + + if (!prevState && node.defaultIsCollapsed !== undefined) { + nextIsActive = !node.defaultIsCollapsed; + doCollapseFromActiveState = false; + } else { + if (prevState?.doCollapseFromActiveState !== false) { + nextIsActive = isActiveFromUrl(node.path, activeNodes); + } else if (nextIsActive === undefined) { + nextIsActive = !DEFAULT_IS_COLLAPSED; + } + } + + acc[_id] = { + ...prevState, + isCollapsed: !nextIsActive, + isCollapsible: node.isCollapsible ?? DEFAULT_IS_COLLAPSIBLE, + doCollapseFromActiveState, + }; + } + return acc; + }, + { ...prev } + ); + }); + }, [navNodesById, activeNodes]); + + return { + /** Get the EUI accordion props for the node at a specific path */ + getAccordionProps, + /** Get the isCollapsed state for a node at a specific path */ + getIsCollapsed, + }; +}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/types.ts b/packages/shared-ux/chrome/navigation/src/ui/types.ts index 10b1b7630b20cd..ec01773b422db8 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/types.ts +++ b/packages/shared-ux/chrome/navigation/src/ui/types.ts @@ -5,53 +5,8 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { ReactNode } from 'react'; +import { type EuiCollapsibleNavSubItemProps } from '@elastic/eui'; -import type { - AppDeepLinkId, - ChromeProjectNavigationNode, - NodeDefinition, -} from '@kbn/core-chrome-browser'; - -/** - * @public - * - * A navigation node definition with its unique id, title, path in the tree and optional deep link. - * Those are the props that can be passed to the Navigation.Group and Navigation.Item components. - */ -export interface NodeProps< - LinkId extends AppDeepLinkId = AppDeepLinkId, - Id extends string = string, - ChildrenId extends string = Id -> extends Omit, 'children'> { - /** - * Children of the node. For Navigation.Item (only) it allows a function to be set. - * This function will receive the ChromeProjectNavigationNode object - */ - children?: ReactNode; - /** @internal - Prop internally controlled, don't use it. */ - parentNodePath?: string; - /** @internal - Prop internally controlled, don't use it. */ - rootIndex?: number; - /** @internal - Prop internally controlled, don't use it. */ - treeDepth?: number; - /** @internal - Prop internally controlled, don't use it. */ - index?: number; -} - -/** - * @internal - * - * Function to unregister a navigation node from its parent. - */ -export type UnRegisterFunction = () => void; - -/** - * @internal - * - * A function to register a navigation node on its parent. - */ -export type RegisterFunction = ( - navNode: ChromeProjectNavigationNode, - order?: number -) => UnRegisterFunction; +export type EuiCollapsibleNavSubItemPropsEnhanced = EuiCollapsibleNavSubItemProps & { + path?: string; +}; diff --git a/packages/shared-ux/chrome/navigation/src/utils.ts b/packages/shared-ux/chrome/navigation/src/utils.ts index 5b070c55176f03..f63ff518a18d41 100644 --- a/packages/shared-ux/chrome/navigation/src/utils.ts +++ b/packages/shared-ux/chrome/navigation/src/utils.ts @@ -39,3 +39,9 @@ export function isActiveFromUrl( : nodesBranch.some((branch) => isSamePath(branch.path, nodePath)); }, false); } + +export const isAccordionNode = ( + node: Pick +) => + node.renderAs === 'accordion' || + ['defaultIsCollapsed', 'isCollapsible'].some((prop) => node.hasOwnProperty(prop)); diff --git a/renovate.json b/renovate.json index db3141fb3d3bda..d7ac439ca06917 100644 --- a/renovate.json +++ b/renovate.json @@ -1,19 +1,9 @@ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": [ - "config:base" - ], - "ignorePaths": [ - "**/__fixtures__/**", - "**/fixtures/**" - ], - "enabledManagers": [ - "npm" - ], - "baseBranches": [ - "main", - "7.17" - ], + "extends": ["config:recommended"], + "ignorePaths": ["**/__fixtures__/**", "**/fixtures/**"], + "enabledManagers": ["npm"], + "baseBranches": ["main", "7.17"], "prConcurrentLimit": 0, "prHourlyLimit": 0, "separateMajorMinor": false, @@ -27,307 +17,156 @@ }, "packageRules": [ { - "matchPackagePatterns": [ - ".*" - ], - "enabled": false, - "prCreation": "not-pending", - "stabilityDays": 7 + "matchDepPatterns": [".*"], + "enabled": false }, { "groupName": "@elastic/charts", - "matchPackageNames": [ - "@elastic/charts" - ], - "reviewers": [ - "team:visualizations", - "markov00", - "nickofthyme" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "Team:Visualizations" - ], - "draftPR": true, - "enabled": true, - "assignAutomerge": true, - "prCreation": "immediate" + "matchDepNames": ["@elastic/charts"], + "reviewers": ["team:visualizations", "markov00", "nickofthyme"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "Team:Visualizations"], + "enabled": true }, { "groupName": "@elastic/elasticsearch", - "matchPackageNames": [ - "@elastic/elasticsearch" - ], - "reviewers": [ - "team:kibana-operations", - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "Team:Operations", - "Team:Core" - ], + "matchDepNames": ["@elastic/elasticsearch"], + "reviewers": ["team:kibana-operations", "team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "Team:Operations", "Team:Core"], "enabled": true }, { "groupName": "@elastic/elasticsearch", - "matchPackageNames": [ - "@elastic/elasticsearch" - ], - "reviewers": [ - "team:kibana-operations", - "team:kibana-core" - ], - "matchBaseBranches": [ - "7.17" - ], - "labels": [ - "release_note:skip", - "Team:Operations", - "Team:Core", - "backport:skip" - ], + "matchDepNames": ["@elastic/elasticsearch"], + "reviewers": ["team:kibana-operations", "team:kibana-core"], + "matchBaseBranches": ["7.17"], + "labels": ["release_note:skip", "Team:Operations", "Team:Core", "backport:skip"], "enabled": true }, { "groupName": "LaunchDarkly", - "matchPackageNames": [ - "launchdarkly-js-client-sdk", - "launchdarkly-node-server-sdk" - ], - "reviewers": [ - "team:kibana-security", - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "Team:Security", - "Team:Core", - "backport:prev-minor" - ], + "matchDepNames": ["launchdarkly-js-client-sdk", "launchdarkly-node-server-sdk"], + "reviewers": ["team:kibana-security", "team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Security", "Team:Core", "backport:prev-minor"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "APM", - "matchPackageNames": [ - "elastic-apm-node", - "@elastic/apm-rum", - "@elastic/apm-rum-react" - ], - "reviewers": [ - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "Team:Core", - "backport:skip" - ], - "enabled": true, - "prCreation": "immediate" + "matchDepNames": ["elastic-apm-node", "@elastic/apm-rum", "@elastic/apm-rum-react"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "enabled": true }, { "groupName": "ansi-regex", - "matchPackageNames": [ - "ansi-regex" - ], - "reviewers": [ - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "Team:Core", - "backport:skip" - ], + "matchDepNames": ["ansi-regex"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "OpenAPI Spec", - "matchPackageNames": [ - "@redocly/cli" - ], - "reviewers": [ - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "Team:Core", - "backport:all-open" - ], + "matchDepNames": ["@redocly/cli"], + "reviewers": ["team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "Team:Core", "backport:all-open"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "babel", - "matchPackageNames": [ - "@types/babel__core" - ], - "matchPackagePatterns": [ - "^@babel", - "^babel-plugin" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "matchDepNames": ["@types/babel__core"], + "matchDepPatterns": ["^@babel", "^babel-plugin"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "typescript", - "matchPackageNames": [ - "typescript", - "prettier", - "@types/jsdom" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "matchDepNames": ["typescript", "prettier", "@types/jsdom"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "typescript-eslint", - "matchPackagePatterns": [ - "^@typescript-eslint" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "matchDepPatterns": ["^@typescript-eslint"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "polyfills", - "matchPackageNames": [ - "core-js" - ], - "matchPackagePatterns": [ - "polyfill" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "matchDepNames": ["core-js"], + "matchDepPatterns": ["polyfill"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "CLI tooling", - "matchPackageNames": [ - "listr2" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "backport:all-open", - "release_note:skip" - ], + "matchDepNames": ["listr2"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "backport:all-open", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "vega related modules", - "matchPackageNames": [ - "vega", - "vega-lite", - "vega-schema-url-parser", - "vega-tooltip" - ], - "reviewers": [ - "team:kibana-visualizations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Feature:Vega", - "Team:Visualizations" - ], + "matchDepNames": ["vega", "vega-lite", "vega-schema-url-parser", "vega-tooltip"], + "reviewers": ["team:kibana-visualizations"], + "matchBaseBranches": ["main"], + "labels": ["Feature:Vega", "Team:Visualizations"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "cypress", - "matchPackagePatterns": [ - "cypress" - ], - "reviewers": [ - "Team:apm", - "Team: SecuritySolution" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "buildkite-ci", - "ci:all-cypress-suites" - ], + "matchDepPatterns": ["cypress"], + "reviewers": ["Team:apm", "Team: SecuritySolution"], + "matchBaseBranches": ["main"], + "labels": ["buildkite-ci", "ci:all-cypress-suites"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "security solution modules", - "matchPackageNames": [ - "zod", - "langchain" - ], - "reviewers": [ - "Team: SecuritySolution" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team: SecuritySolution" - ], + "matchDepNames": ["zod", "langchain"], + "reviewers": ["Team: SecuritySolution"], + "matchBaseBranches": ["main"], + "labels": ["Team: SecuritySolution"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "platform security modules", - "matchPackageNames": [ + "matchDepNames": [ "css.escape", "node-forge", "formik", @@ -339,22 +178,16 @@ "@types/xml-crypto", "@kayahr/text-encoding" ], - "reviewers": [ - "team:kibana-security" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Security", - "release_note:skip", - "backport:all-open" - ], + "reviewers": ["team:kibana-security"], + "matchBaseBranches": ["main"], + "labels": ["Team:Security", "release_note:skip", "backport:all-open"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "ftr", - "packageNames": [ + "matchDepNames": [ "@types/chromedriver", "@types/selenium-webdriver", "chromedriver", @@ -362,57 +195,36 @@ "ms-chromium-edge-driver", "selenium-webdriver" ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "scss", - "packageNames": [ - "sass-embedded" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip", - "backport:all-open" - ], + "matchDepNames": ["sass-embedded"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip", "backport:all-open"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "minify", - "packageNames": [ - "gulp-terser", - "terser" - ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "matchDepNames": ["gulp-terser", "terser"], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "@testing-library", - "packageNames": [ + "matchDepNames": [ "@testing-library/dom", "@testing-library/jest-dom", "@testing-library/react", @@ -420,21 +232,16 @@ "@testing-library/user-event", "@types/testing-library__jest-dom" ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "jest", - "packageNames": [ + "matchDepNames": [ "@jest/console", "@jest/reporters", "@jest/types", @@ -450,67 +257,39 @@ "jest-runtime", "jest-snapshot" ], - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Operations", - "release_note:skip" - ], + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "labels": ["Team:Operations", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "@storybook", - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "matchPackagePatterns": [ - "^@storybook" - ], - "excludePackageNames": [ - "@storybook/testing-react" - ], - "labels": [ - "Team:Operations", - "release_note:skip", - "ci:build-storybooks", - "backport:skip" - ], - "enabled": true, - "allowedVersions": "<7.0" + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "matchDepPatterns": ["^@storybook"], + "excludeDepNames": ["@storybook/testing-react"], + "labels": ["Team:Operations", "release_note:skip", "ci:build-storybooks", "backport:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", + "allowedVersions": "<7.0", + "enabled": true }, { "groupName": "@storybook/testing-react", - "reviewers": [ - "team:kibana-operations" - ], - "matchBaseBranches": [ - "main" - ], - "matchPackageNames": [ - "@storybook/testing-react" - ], - "labels": [ - "Team:Operations", - "release_note:skip", - "ci:build-storybooks", - "backport:skip" - ], - "enabled": true, - "allowedVersions": "<2.0" + "reviewers": ["team:kibana-operations"], + "matchBaseBranches": ["main"], + "matchDepNames": ["@storybook/testing-react"], + "labels": ["Team:Operations", "release_note:skip", "ci:build-storybooks", "backport:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", + "allowedVersions": "<2.0", + "enabled": true }, { "groupName": "react-query", - "packageNames": [ - "@tanstack/react-query", - "@tanstack/react-query-devtools" - ], + "matchDepNames": ["@tanstack/react-query", "@tanstack/react-query-devtools"], "reviewers": [ "team:response-ops", "team:kibana-cloud-security-posture", @@ -519,41 +298,25 @@ "team:awp-platform", "team:security-onboarding-and-lifecycle-mgt" ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "ci:all-cypress-suites" - ], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "react-hook-form", - "packageNames": [ - "react-hook-form" - ], - "reviewers": [ - "team:security-asset-management", - "team:uptime" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "ci:all-cypress-suites" - ], + "matchDepNames": ["react-hook-form"], + "reviewers": ["team:security-asset-management", "team:uptime"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "redux", - "packageNames": [ - "redux", - "react-redux" - ], + "matchDepNames": ["redux", "react-redux"], "reviewers": [ "team:search-kibana", "team:kibana-presentation", @@ -562,199 +325,107 @@ "team:kibana-gis", "team:security-solution" ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "ci:all-cypress-suites" - ], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "ci:all-cypress-suites"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "Profiling", - "matchPackageNames": [ - "peggy", - "@types/dagre" - ], - "reviewers": [ - "team:profiling-ui" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip" - ], - "enabled": true, - "prCreation": "immediate" + "matchDepNames": ["peggy", "@types/dagre"], + "reviewers": ["team:profiling-ui"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip"], + "minimumReleaseAge": "7 days", + "enabled": true }, { "groupName": "TTY Output", - "matchPackageNames": [ - "xterm", - "byte-size", - "@types/byte-size" - ], - "reviewers": [ - "team:sec-cloudnative-integrations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team: AWP: Visualization", - "release_note:skip", - "backport:skip" - ], - "enabled": true, - "prCreation": "immediate" + "matchDepNames": ["xterm", "byte-size", "@types/byte-size"], + "reviewers": ["team:sec-cloudnative-integrations"], + "matchBaseBranches": ["main"], + "labels": ["Team: AWP: Visualization", "release_note:skip", "backport:skip"], + "minimumReleaseAge": "7 days", + "enabled": true }, { "groupName": "Cloud Defend", - "matchPackageNames": [ - "monaco-yaml" - ], - "reviewers": [ - "team:sec-cloudnative-integrations" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team: Cloud Native Integrations", - "release_note:skip", - "backport:skip" - ], - "enabled": true, - "prCreation": "immediate" + "matchDepNames": ["monaco-yaml"], + "reviewers": ["team:sec-cloudnative-integrations"], + "matchBaseBranches": ["main"], + "labels": ["Team: Cloud Native Integrations", "release_note:skip", "backport:skip"], + "minimumReleaseAge": "7 days", + "enabled": true }, { "groupName": "JSON Web Token", - "matchPackageNames": [ - "jsonwebtoken" - ], - "reviewers": [ - "team:response-ops", - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:all-open" - ], + "matchDepNames": ["jsonwebtoken"], + "reviewers": ["team:response-ops", "team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:all-open"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "XState", - "matchPackageNames": [ - "xstate" - ], - "matchPackagePrefixes": [ - "@xstate/" - ], - "reviewers": [ - "team:obs-ux-logs" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Obs UX Logs", - "release_note:skip" - ], - "enabled": true, - "prCreation": "immediate" + "matchDepNames": ["xstate"], + "matchDepPrefixes": ["@xstate/"], + "reviewers": ["team:obs-ux-logs"], + "matchBaseBranches": ["main"], + "labels": ["Team:Obs UX Logs", "release_note:skip"], + "minimumReleaseAge": "7 days", + "enabled": true }, { "groupName": "OpenTelemetry modules", - "matchPackagePrefixes": [ - "@opentelemetry/" - ], - "reviewers": [ - "team:monitoring" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:Monitoring" - ], + "matchDepPrefixes": ["@opentelemetry/"], + "reviewers": ["team:monitoring"], + "matchBaseBranches": ["main"], + "labels": ["Team:Monitoring"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "csp", - "packageNames": [ - "content-security-policy-parser" - ], - "reviewers": [ - "team:kibana-security", - "team:kibana-core" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:skip", - "ci:serverless-test-all" - ], + "matchDepNames": ["content-security-policy-parser"], + "reviewers": ["team:kibana-security", "team:kibana-core"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:skip", "ci:serverless-test-all"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "AlertingEmails", - "matchPackageNames": [ - "nodemailer" - ], - "reviewers": [ - "team:response-ops" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "release_note:skip", - "backport:prev-minor" - ], + "matchDepNames": ["nodemailer"], + "reviewers": ["team:response-ops"], + "matchBaseBranches": ["main"], + "labels": ["release_note:skip", "backport:prev-minor"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "machine learning modules", - "matchPackageNames": [ - "apidoc-markdown" - ], - "reviewers": [ - "team:ml-ui" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:ML", - "release_note:skip", - "backport:all-open" - ], + "matchDepNames": ["apidoc-markdown"], + "reviewers": ["team:ml-ui"], + "matchBaseBranches": ["main"], + "labels": ["Team:ML", "release_note:skip", "backport:all-open"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true }, { "groupName": "Kibana ES|QL Team", - "matchPackageNames": [ - "recast" - ], - "reviewers": [ - "team:kibana-esql" - ], - "matchBaseBranches": [ - "main" - ], - "labels": [ - "Team:ESQL", - "release_note:skip" - ], + "matchDepNames": ["recast"], + "reviewers": ["team:kibana-esql"], + "matchBaseBranches": ["main"], + "labels": ["Team:ESQL", "release_note:skip"], + "prCreation": "not-pending", + "minimumReleaseAge": "7 days", "enabled": true } ] diff --git a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts index 10d71344a0a2b2..169fd6fa5cf669 100644 --- a/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts +++ b/src/core/server/integration_tests/ci_checks/saved_objects/check_registered_types.test.ts @@ -129,7 +129,7 @@ describe('checking migration metadata changes on all registered SO types', () => "ml-module": "94f210e60504fe0cc8241d867af97f8130250359", "ml-trained-model": "482195cefd6b04920e539d34d7356d22cb68e4f3", "monitoring-telemetry": "5d91bf75787d9d4dd2fae954d0b3f76d33d2e559", - "observability-onboarding-state": "b16064c516aac64ae699c737d7d10b6e199bfded", + "observability-onboarding-state": "34eef666124a9e4ad1c607d0097cc25128764681", "osquery-manager-usage-metric": "983bcbc3b7dda0aad29b20907db233abba709bcc", "osquery-pack": "702e86b1a936153b39f65b0781bdc136e186e123", "osquery-pack-asset": "cd140bc2e4b092e93692b587bf6e38051ef94c75", diff --git a/src/dev/build/args.test.ts b/src/dev/build/args.test.ts index 85f799daa8a0d0..5d1aabc85a7f62 100644 --- a/src/dev/build/args.test.ts +++ b/src/dev/build/args.test.ts @@ -53,6 +53,7 @@ it('build default and oss dist for current platform, without packages, by defaul "initialize": true, "isRelease": false, "targetAllPlatforms": false, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -94,6 +95,7 @@ it('builds packages if --all-platforms is passed', () => { "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -135,6 +137,7 @@ it('limits packages if --rpm passed with --all-platforms', () => { "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -176,6 +179,7 @@ it('limits packages if --deb passed with --all-platforms', () => { "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -218,6 +222,7 @@ it('limits packages if --docker passed with --all-platforms', () => { "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -267,6 +272,7 @@ it('limits packages if --docker passed with --skip-docker-ubi and --all-platform "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -309,6 +315,7 @@ it('limits packages if --all-platforms passed with --skip-docker-ubuntu', () => "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, @@ -351,6 +358,7 @@ it('limits packages if --all-platforms passed with --skip-docker-fips', () => { "initialize": true, "isRelease": false, "targetAllPlatforms": true, + "targetServerlessPlatforms": false, "versionQualifier": "", "withExamplePlugins": false, "withTestPlugins": false, diff --git a/src/dev/build/args.ts b/src/dev/build/args.ts index 9526d10eb2ae11..2ffab8ccb17b90 100644 --- a/src/dev/build/args.ts +++ b/src/dev/build/args.ts @@ -48,6 +48,7 @@ export function readCliArgs(argv: string[]) { 'help', 'with-test-plugins', 'with-example-plugins', + 'serverless', ], string: ['docker-namespace', 'epr-registry'], alias: { @@ -144,11 +145,13 @@ export function readCliArgs(argv: string[]) { isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-chainguard']), createDockerCloud: isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-cloud']), createDockerServerless: - isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-serverless']), + (isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-serverless'])) || + Boolean(flags.serverless), createDockerUBI: isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-ubi']), createDockerContexts: !Boolean(flags['skip-docker-contexts']), createDockerFIPS: isOsPackageDesired('docker-images') && !Boolean(flags['skip-docker-fips']), targetAllPlatforms: Boolean(flags['all-platforms']), + targetServerlessPlatforms: Boolean(flags.serverless), eprRegistry: flags['epr-registry'], buildCanvasShareableRuntime: !Boolean(flags['skip-canvas-shareable-runtime']), withExamplePlugins: Boolean(flags['with-example-plugins']), diff --git a/src/dev/build/build_distributables.ts b/src/dev/build/build_distributables.ts index cc23b57530a680..fca37dd46769b1 100644 --- a/src/dev/build/build_distributables.ts +++ b/src/dev/build/build_distributables.ts @@ -38,6 +38,7 @@ export interface BuildOptions { createDockerFIPS: boolean; versionQualifier: string | undefined; targetAllPlatforms: boolean; + targetServerlessPlatforms: boolean; withExamplePlugins: boolean; withTestPlugins: boolean; eprRegistry: 'production' | 'snapshot'; @@ -75,7 +76,6 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions } await run(Tasks.CopyLegacySource); - await run(Tasks.CopyBinScripts); await run(Tasks.CreateEmptyDirsAndFiles); await run(Tasks.CreateReadme); @@ -109,7 +109,7 @@ export async function buildDistributables(log: ToolingLog, options: BuildOptions await run(Tasks.CreateArchivesSources); await run(Tasks.PatchNativeModules); await run(Tasks.InstallChromium); - await run(Tasks.CleanExtraBinScripts); + await run(Tasks.CopyBinScripts); await run(Tasks.CleanNodeBuilds); await run(Tasks.AssertFileTime); diff --git a/src/dev/build/cli.ts b/src/dev/build/cli.ts index 86160988c0f726..105ce366742a5e 100644 --- a/src/dev/build/cli.ts +++ b/src/dev/build/cli.ts @@ -38,6 +38,7 @@ if (showHelp) { --all-platforms {dim Produce archives for all platforms, not just this one} --rpm {dim Only build the rpm packages} --deb {dim Only build the deb packages} + --serverless {dim Only build the serverless packages} --docker-images {dim Only build the Docker images} --docker-context-use-local-artifact {dim Use a local artifact when building the Docker context} --docker-cross-compile {dim Produce arm64 and amd64 Docker images} diff --git a/src/dev/build/lib/build.test.ts b/src/dev/build/lib/build.test.ts index 76fa06b04affa8..bbace15247286d 100644 --- a/src/dev/build/lib/build.test.ts +++ b/src/dev/build/lib/build.test.ts @@ -16,6 +16,7 @@ expect.addSnapshotSerializer(createAbsolutePathSerializer()); const config = new Config( true, + false, { version: '8.0.0', engines: { diff --git a/src/dev/build/lib/build.ts b/src/dev/build/lib/build.ts index c777ad18dc51f0..a888da135f2e30 100644 --- a/src/dev/build/lib/build.ts +++ b/src/dev/build/lib/build.ts @@ -22,19 +22,21 @@ export class Build { } resolvePathForPlatform(platform: Platform, ...args: string[]) { + const variant = platform.getVariant() ? `-${platform.getVariant()}` : ''; return this.config.resolveFromRepo( 'build', 'default', - `kibana-${this.config.getBuildVersion()}-${platform.getBuildName()}`, + `kibana${variant}-${this.config.getBuildVersion()}-${platform.getBuildName()}`, ...args ); } getPlatformArchivePath(platform: Platform) { const ext = platform.isWindows() ? 'zip' : 'tar.gz'; + const variant = platform.getVariant() ? `-${platform.getVariant()}` : ''; return this.config.resolveFromRepo( 'target', - `${this.name}-${this.config.getBuildVersion()}-${platform.getBuildName()}.${ext}` + `${this.name}${variant}-${this.config.getBuildVersion()}-${platform.getBuildName()}.${ext}` ); } diff --git a/src/dev/build/lib/config.test.ts b/src/dev/build/lib/config.test.ts index 72b74c6e168cd2..76a45ddb2e1823 100644 --- a/src/dev/build/lib/config.test.ts +++ b/src/dev/build/lib/config.test.ts @@ -33,6 +33,7 @@ const setup = async ({ return await Config.create({ isRelease, targetAllPlatforms, + targetServerlessPlatforms: false, dockerContextUseLocalArtifact: false, dockerCrossCompile: false, dockerNamespace: null, @@ -123,6 +124,8 @@ describe('#getTargetPlatforms()', () => { "darwin-arm64", "darwin-x64", "linux-arm64", + "linux-arm64", + "linux-x64", "linux-x64", "win32-x64", ] @@ -146,7 +149,15 @@ describe('#getNodePlatforms()', () => { .getTargetPlatforms() .map((p) => p.getNodeArch()) .sort() - ).toEqual(['darwin-arm64', 'darwin-x64', 'linux-arm64', 'linux-x64', 'win32-x64']); + ).toEqual([ + 'darwin-arm64', + 'darwin-x64', + 'linux-arm64', + 'linux-arm64', + 'linux-x64', + 'linux-x64', + 'win32-x64', + ]); }); it('returns this platform and linux, when targetAllPlatforms = false', async () => { diff --git a/src/dev/build/lib/config.ts b/src/dev/build/lib/config.ts index ced8e10afab4b8..1cf8faed7dd6ea 100644 --- a/src/dev/build/lib/config.ts +++ b/src/dev/build/lib/config.ts @@ -19,11 +19,17 @@ import { } from '@kbn/repo-packages'; import { getVersionInfo, VersionInfo } from './version_info'; -import { PlatformName, PlatformArchitecture, ALL_PLATFORMS } from './platform'; +import { + PlatformName, + PlatformArchitecture, + ALL_PLATFORMS, + SERVERLESS_PLATFORMS, +} from './platform'; interface Options { isRelease: boolean; targetAllPlatforms: boolean; + targetServerlessPlatforms: boolean; versionQualifier?: string; dockerContextUseLocalArtifact: boolean | null; dockerCrossCompile: boolean; @@ -45,6 +51,7 @@ export class Config { return new Config( opts.targetAllPlatforms, + opts.targetServerlessPlatforms, kibanaPackageJson, nodeVersion, REPO_ROOT, @@ -72,6 +79,7 @@ export class Config { constructor( private readonly targetAllPlatforms: boolean, + private readonly targetServerlessPlatforms: boolean, private readonly pkg: KibanaPackageJson, private readonly nodeVersion: string, private readonly repoRoot: string, @@ -164,6 +172,9 @@ export class Config { * specified only the platform for this OS will be returned */ getTargetPlatforms() { + if (this.targetServerlessPlatforms) { + return SERVERLESS_PLATFORMS; + } if (this.targetAllPlatforms) { return ALL_PLATFORMS; } @@ -177,6 +188,9 @@ export class Config { * reliably get the LICENSE file, which isn't included in the windows version */ getNodePlatforms() { + if (this.targetServerlessPlatforms) { + return SERVERLESS_PLATFORMS; + } if (this.targetAllPlatforms) { return ALL_PLATFORMS; } diff --git a/src/dev/build/lib/platform.test.ts b/src/dev/build/lib/platform.test.ts index 193579d1a35c1b..facbc0bd1a577c 100644 --- a/src/dev/build/lib/platform.test.ts +++ b/src/dev/build/lib/platform.test.ts @@ -10,45 +10,47 @@ import { Platform } from './platform'; describe('getName()', () => { it('returns the name argument', () => { - expect(new Platform('win32', 'x64', 'foo').getName()).toBe('win32'); + expect(new Platform('win32', 'x64', 'foo', null).getName()).toBe('win32'); }); }); describe('getNodeArch()', () => { it('returns the node arch for the passed name', () => { - expect(new Platform('win32', 'x64', 'foo').getNodeArch()).toBe('win32-x64'); + expect(new Platform('win32', 'x64', 'foo', null).getNodeArch()).toBe('win32-x64'); }); }); describe('getBuildName()', () => { it('returns the build name for the passed name', () => { - expect(new Platform('linux', 'arm64', 'linux-aarch64').getBuildName()).toBe('linux-aarch64'); + expect(new Platform('linux', 'arm64', 'linux-aarch64', null).getBuildName()).toBe( + 'linux-aarch64' + ); }); }); describe('isWindows()', () => { it('returns true if name is win32', () => { - expect(new Platform('win32', 'x64', 'foo').isWindows()).toBe(true); - expect(new Platform('linux', 'x64', 'foo').isWindows()).toBe(false); - expect(new Platform('darwin', 'x64', 'foo').isWindows()).toBe(false); - expect(new Platform('darwin', 'arm64', 'foo').isWindows()).toBe(false); + expect(new Platform('win32', 'x64', 'foo', null).isWindows()).toBe(true); + expect(new Platform('linux', 'x64', 'foo', null).isWindows()).toBe(false); + expect(new Platform('darwin', 'x64', 'foo', null).isWindows()).toBe(false); + expect(new Platform('darwin', 'arm64', 'foo', null).isWindows()).toBe(false); }); }); describe('isLinux()', () => { it('returns true if name is linux', () => { - expect(new Platform('win32', 'x64', 'foo').isLinux()).toBe(false); - expect(new Platform('linux', 'x64', 'foo').isLinux()).toBe(true); - expect(new Platform('darwin', 'x64', 'foo').isLinux()).toBe(false); - expect(new Platform('darwin', 'arm64', 'foo').isLinux()).toBe(false); + expect(new Platform('win32', 'x64', 'foo', null).isLinux()).toBe(false); + expect(new Platform('linux', 'x64', 'foo', null).isLinux()).toBe(true); + expect(new Platform('darwin', 'x64', 'foo', null).isLinux()).toBe(false); + expect(new Platform('darwin', 'arm64', 'foo', null).isLinux()).toBe(false); }); }); describe('isMac()', () => { it('returns true if name is darwin', () => { - expect(new Platform('win32', 'x64', 'foo').isMac()).toBe(false); - expect(new Platform('linux', 'x64', 'foo').isMac()).toBe(false); - expect(new Platform('darwin', 'x64', 'foo').isMac()).toBe(true); - expect(new Platform('darwin', 'arm64', 'foo').isMac()).toBe(true); + expect(new Platform('win32', 'x64', 'foo', null).isMac()).toBe(false); + expect(new Platform('linux', 'x64', 'foo', null).isMac()).toBe(false); + expect(new Platform('darwin', 'x64', 'foo', null).isMac()).toBe(true); + expect(new Platform('darwin', 'arm64', 'foo', null).isMac()).toBe(true); }); }); diff --git a/src/dev/build/lib/platform.ts b/src/dev/build/lib/platform.ts index 4c4ec271318d6a..dc70fb47dcefcd 100644 --- a/src/dev/build/lib/platform.ts +++ b/src/dev/build/lib/platform.ts @@ -8,12 +8,14 @@ export type PlatformName = 'win32' | 'darwin' | 'linux'; export type PlatformArchitecture = 'x64' | 'arm64'; +export type Variant = 'serverless' | null; export class Platform { constructor( private name: PlatformName, private architecture: PlatformArchitecture, - private buildName: string + private buildName: string, + private variant: Variant ) {} getName() { @@ -32,6 +34,10 @@ export class Platform { return `${this.name}-${this.architecture}`; } + getVariant() { + return this.variant; + } + isWindows() { return this.name === 'win32'; } @@ -43,12 +49,23 @@ export class Platform { isLinux() { return this.name === 'linux'; } + + isServerless() { + return this.variant === 'serverless'; + } } -export const ALL_PLATFORMS = [ - new Platform('linux', 'x64', 'linux-x86_64'), - new Platform('linux', 'arm64', 'linux-aarch64'), - new Platform('darwin', 'x64', 'darwin-x86_64'), - new Platform('darwin', 'arm64', 'darwin-aarch64'), - new Platform('win32', 'x64', 'windows-x86_64'), +export const DOWNLOAD_PLATFORMS = [ + new Platform('linux', 'x64', 'linux-x86_64', null), + new Platform('linux', 'arm64', 'linux-aarch64', null), + new Platform('darwin', 'x64', 'darwin-x86_64', null), + new Platform('darwin', 'arm64', 'darwin-aarch64', null), + new Platform('win32', 'x64', 'windows-x86_64', null), ]; + +export const SERVERLESS_PLATFORMS = [ + new Platform('linux', 'x64', 'linux-x86_64', 'serverless'), + new Platform('linux', 'arm64', 'linux-aarch64', 'serverless'), +]; + +export const ALL_PLATFORMS = [...DOWNLOAD_PLATFORMS, ...SERVERLESS_PLATFORMS]; diff --git a/src/dev/build/lib/runner.test.ts b/src/dev/build/lib/runner.test.ts index a8e62219bd414f..87220d450f63e6 100644 --- a/src/dev/build/lib/runner.test.ts +++ b/src/dev/build/lib/runner.test.ts @@ -45,6 +45,7 @@ const setup = async () => { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, + targetServerlessPlatforms: false, versionQualifier: '-SNAPSHOT', dockerContextUseLocalArtifact: false, dockerCrossCompile: false, diff --git a/src/dev/build/tasks/bin/copy_bin_scripts_task.ts b/src/dev/build/tasks/bin/copy_bin_scripts_task.ts index 5eceb1c346f011..c2faf889a1d296 100644 --- a/src/dev/build/tasks/bin/copy_bin_scripts_task.ts +++ b/src/dev/build/tasks/bin/copy_bin_scripts_task.ts @@ -6,15 +6,43 @@ * Side Public License, v 1. */ +import Mustache from 'mustache'; +import { join } from 'path'; +import { readFileSync, writeFileSync, mkdirSync } from 'fs'; +import globby from 'globby'; import { copyAll, Task } from '../../lib'; export const CopyBinScripts: Task = { - description: 'Copying bin scripts into platform-generic build directory', + description: 'Copying bin scripts into platform-specific build directory', async run(config, log, build) { - await copyAll( - config.resolveFromRepo('src/dev/build/tasks/bin/scripts'), - build.resolvePath('bin') - ); + const scriptsSrc = config.resolveFromRepo('src/dev/build/tasks/bin/scripts'); + for (const platform of config.getTargetPlatforms()) { + const scriptsDest = build.resolvePathForPlatform(platform, 'bin'); + mkdirSync(scriptsDest, { recursive: true }); + + if (platform.isWindows()) { + await copyAll(scriptsSrc, scriptsDest, { + select: ['*.bat'], + }); + } else { + globby + .sync(['*'], { + ignore: ['*.bat'], + cwd: scriptsSrc, + }) + .forEach((script) => { + const template = readFileSync(join(scriptsSrc, script), { encoding: 'utf-8' }); + const output = Mustache.render(template, { + darwin: platform.isMac(), + linux: platform.isLinux(), + serverless: platform.isServerless(), + }); + writeFileSync(join(scriptsDest, script), output, { + mode: '0755', + }); + }); + } + } }, }; diff --git a/src/dev/build/tasks/bin/scripts/kibana b/src/dev/build/tasks/bin/scripts/kibana index 4a27e965dc0372..e0957582897f06 100755 --- a/src/dev/build/tasks/bin/scripts/kibana +++ b/src/dev/build/tasks/bin/scripts/kibana @@ -15,17 +15,32 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" -test -x "$NODE" -if [ ! -x "$NODE" ]; then - echo "unable to find usable node.js executable." - exit 1 -fi + +test_node() { + test -x "$NODE" + if [ ! -x "$NODE" ]; then + echo "unable to find usable node.js executable." + exit 1 + fi +} if [ -f "${CONFIG_DIR}/node.options" ]; then KBN_NODE_OPTS="$(grep -v ^# < ${CONFIG_DIR}/node.options | xargs)" fi +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{#serverless}} +if [ "$KBN_DISABLE_POINTER_COMPRESSION" != 'true' ]; then + NODE="${DIR}/node/pointer-compression/bin/node" +fi +{{/serverless}} +{{/linux}} +test_node + # Enable capturing heap snapshots. See https://nodejs.org/api/cli.html#--heapsnapshot-signalsignal # For now only on POSIX platforms, term signals work differently on Windows. NODE_OPTIONS_HEAPSNAPSHOT_DEFAULT="${NODE_OPTIONS_HEAPSNAPSHOT_DEFAULT:---heapsnapshot-signal=SIGUSR2 --diagnostic-dir=$DIR/data}" diff --git a/src/dev/build/tasks/bin/scripts/kibana-encryption-keys b/src/dev/build/tasks/bin/scripts/kibana-encryption-keys index 0521ca1c39ce75..5f3c5c08c96320 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-encryption-keys +++ b/src/dev/build/tasks/bin/scripts/kibana-encryption-keys @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-encryption-keys.bat b/src/dev/build/tasks/bin/scripts/kibana-encryption-keys.bat index 3ad3c9e8b07972..63bca1df1ce5e1 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-encryption-keys.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-encryption-keys.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/bin/scripts/kibana-health-gateway b/src/dev/build/tasks/bin/scripts/kibana-health-gateway index 6b190ee2d82c45..f2a48c2babdc8b 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-health-gateway +++ b/src/dev/build/tasks/bin/scripts/kibana-health-gateway @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-health-gateway.bat b/src/dev/build/tasks/bin/scripts/kibana-health-gateway.bat index 61c3474427d009..bcbc5cfbd52541 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-health-gateway.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-health-gateway.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/bin/scripts/kibana-keystore b/src/dev/build/tasks/bin/scripts/kibana-keystore index 7f9986b519023d..d69f02a1869b67 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-keystore +++ b/src/dev/build/tasks/bin/scripts/kibana-keystore @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-keystore.bat b/src/dev/build/tasks/bin/scripts/kibana-keystore.bat index 8142d4db15d069..91f183f19db08c 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-keystore.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-keystore.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/bin/scripts/kibana-plugin b/src/dev/build/tasks/bin/scripts/kibana-plugin index 78fdb7702643f6..4c64970775aef8 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-plugin +++ b/src/dev/build/tasks/bin/scripts/kibana-plugin @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-plugin.bat b/src/dev/build/tasks/bin/scripts/kibana-plugin.bat index 1841d1998bba67..a9758fbcbab6ba 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-plugin.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-plugin.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV="production" If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/bin/scripts/kibana-setup b/src/dev/build/tasks/bin/scripts/kibana-setup index db5ecd2db915c0..8ba1ae875263d3 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-setup +++ b/src/dev/build/tasks/bin/scripts/kibana-setup @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-verification-code b/src/dev/build/tasks/bin/scripts/kibana-verification-code index d64b05a5712460..f7085bd7a0460b 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-verification-code +++ b/src/dev/build/tasks/bin/scripts/kibana-verification-code @@ -15,7 +15,12 @@ done DIR="$(dirname "${SCRIPT}")/.." CONFIG_DIR=${KBN_PATH_CONF:-"$DIR/config"} -NODE="${DIR}/node/bin/node" +{{#darwin}} +NODE="${DIR}/node/default/bin/node" +{{/darwin}} +{{#linux}} +NODE="${DIR}/node/glibc-217/bin/node" +{{/linux}} test -x "$NODE" if [ ! -x "$NODE" ]; then echo "unable to find usable node.js executable." diff --git a/src/dev/build/tasks/bin/scripts/kibana-verification-code.bat b/src/dev/build/tasks/bin/scripts/kibana-verification-code.bat index 8eb6cd1773a3d5..76091f1207fd5d 100755 --- a/src/dev/build/tasks/bin/scripts/kibana-verification-code.bat +++ b/src/dev/build/tasks/bin/scripts/kibana-verification-code.bat @@ -5,7 +5,7 @@ SETLOCAL ENABLEDELAYEDEXPANSION set SCRIPT_DIR=%~dp0 for %%I in ("%SCRIPT_DIR%..") do set DIR=%%~dpfI -set NODE=%DIR%\node\node.exe +set NODE=%DIR%\node\default\node.exe set NODE_ENV=production If Not Exist "%NODE%" ( diff --git a/src/dev/build/tasks/build_canvas_shareable_runtime.ts b/src/dev/build/tasks/build_canvas_shareable_runtime.ts index 6eb43b4dc7070f..f84980aa29fcd0 100644 --- a/src/dev/build/tasks/build_canvas_shareable_runtime.ts +++ b/src/dev/build/tasks/build_canvas_shareable_runtime.ts @@ -13,6 +13,11 @@ export const BuildCanvasShareableRuntime: Task = { description: 'Build Canvas shareable runtime', async run(config, log, build) { + const onlyServerless = config.getTargetPlatforms().every((platform) => platform.isServerless()); + if (onlyServerless) { + log.info('Skipping Canvas shareable runtime for serverless builds'); + return; + } await del(config.resolveFromRepo('x-pack/plugins/canvas/shareable_runtime/build')); await exec(log, process.execPath, ['plugins/canvas/scripts/shareable_runtime'], { diff --git a/src/dev/build/tasks/clean_tasks.ts b/src/dev/build/tasks/clean_tasks.ts index a9d10dfc0d3c32..6de7cb9dcd0580 100644 --- a/src/dev/build/tasks/clean_tasks.ts +++ b/src/dev/build/tasks/clean_tasks.ts @@ -192,26 +192,6 @@ export const CleanExtraFilesFromModules: Task = { }, }; -export const CleanExtraBinScripts: Task = { - description: 'Cleaning extra bin/* scripts from platform-specific builds', - - async run(config, log, build) { - for (const platform of config.getNodePlatforms()) { - if (platform.isWindows()) { - await deleteAll( - [ - build.resolvePathForPlatform(platform, 'bin', '*'), - `!${build.resolvePathForPlatform(platform, 'bin', '*.bat')}`, - ], - log - ); - } else { - await deleteAll([build.resolvePathForPlatform(platform, 'bin', '*.bat')], log); - } - } - }, -}; - export const CleanEmptyFolders: Task = { description: 'Cleaning all empty folders recursively', diff --git a/src/dev/build/tasks/create_archives_sources_task.ts b/src/dev/build/tasks/create_archives_sources_task.ts index 9779896ba8cca2..a8c08a2aba4d22 100644 --- a/src/dev/build/tasks/create_archives_sources_task.ts +++ b/src/dev/build/tasks/create_archives_sources_task.ts @@ -6,7 +6,9 @@ * Side Public License, v 1. */ -import { scanCopy, Task } from '../lib'; +import { REPO_ROOT } from '@kbn/repo-info'; +import { resolve } from 'path'; +import { scanCopy, Task, deleteAll, copyAll } from '../lib'; import { getNodeDownloadInfo } from './nodejs'; export const CreateArchivesSources: Task = { @@ -27,12 +29,36 @@ export const CreateArchivesSources: Task = { ); // copy node.js install - await scanCopy({ - source: getNodeDownloadInfo(config, platform).extractDir, - destination: build.resolvePathForPlatform(platform, 'node'), - }); + await Promise.all( + getNodeDownloadInfo(config, platform).map((nodeInfo) => { + return scanCopy({ + source: nodeInfo.extractDir, + destination: build.resolvePathForPlatform(platform, 'node', nodeInfo.variant), + }); + }) + ); log.debug('Node.js copied into', platform.getNodeArch(), 'specific build directory'); + + if (platform.isServerless()) { + await deleteAll( + [ + 'x-pack/plugins/canvas/shareable_runtime/build', + 'node_modules/@kbn/screenshotting-plugin/server/assets', + ].map((path) => build.resolvePathForPlatform(platform, path)), + log + ); + await copyAll( + resolve(REPO_ROOT, 'config'), + build.resolvePathForPlatform(platform, 'config'), + { + select: ['serverless.yml', 'serverless.{es,oblt,security}.yml'], + } + ); + log.debug( + `Serverless adjustments made in serverless-${platform.getNodeArch()} specific build directory` + ); + } }) ); }, diff --git a/src/dev/build/tasks/fetch_agent_versions_list.test.ts b/src/dev/build/tasks/fetch_agent_versions_list.test.ts index e27442beff0b4d..b8ac42d033a6e4 100644 --- a/src/dev/build/tasks/fetch_agent_versions_list.test.ts +++ b/src/dev/build/tasks/fetch_agent_versions_list.test.ts @@ -20,6 +20,7 @@ jest.mock('../lib'); const config = new Config( true, + false, { version: '8.0.0', engines: { diff --git a/src/dev/build/tasks/install_chromium.ts b/src/dev/build/tasks/install_chromium.ts index 968f9f5b474a3f..3ec31f95370ca0 100644 --- a/src/dev/build/tasks/install_chromium.ts +++ b/src/dev/build/tasks/install_chromium.ts @@ -18,9 +18,11 @@ export const InstallChromium: Task = { for (const platform of config.getNodePlatforms()) { const pkg = paths.find(platform.getName(), platform.getArchitecture(), preInstalledPackages); - const target = `${platform.getName()}-${platform.getArchitecture()}`; + const target = `${ + platform.getVariant() || 'default' + }-${platform.getName()}-${platform.getArchitecture()}`; - if (!pkg) { + if (!pkg || platform.isServerless()) { log.info(`Skipping Chromium install for ${target}`); // Unbundled chromium packages (for Darwin): Chromium is downloaded at diff --git a/src/dev/build/tasks/nodejs/clean_node_builds_task.ts b/src/dev/build/tasks/nodejs/clean_node_builds_task.ts index 487cf99cf162cc..6498efdcce19f5 100644 --- a/src/dev/build/tasks/nodejs/clean_node_builds_task.ts +++ b/src/dev/build/tasks/nodejs/clean_node_builds_task.ts @@ -15,12 +15,12 @@ export const CleanNodeBuilds: Task = { for (const platform of config.getTargetPlatforms()) { await deleteAll( [ - build.resolvePathForPlatform(platform, 'node/lib/node_modules'), - build.resolvePathForPlatform(platform, 'node/bin/npm'), - build.resolvePathForPlatform(platform, 'node/bin/npx'), - build.resolvePathForPlatform(platform, 'node/bin/corepack'), - build.resolvePathForPlatform(platform, 'node/CHANGELOG.md'), - build.resolvePathForPlatform(platform, 'node/README.md'), + build.resolvePathForPlatform(platform, '*/node/lib/node_modules'), + build.resolvePathForPlatform(platform, '*/node/bin/npm'), + build.resolvePathForPlatform(platform, '*/node/bin/npx'), + build.resolvePathForPlatform(platform, '*/node/bin/corepack'), + build.resolvePathForPlatform(platform, '*/node/CHANGELOG.md'), + build.resolvePathForPlatform(platform, '*/node/README.md'), ], log ); diff --git a/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts index a67ccb254cb8b9..f873e1648ffaf0 100644 --- a/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/download_node_builds_task.test.ts @@ -36,6 +36,7 @@ async function setup({ failOnUrl }: { failOnUrl?: string } = {}) { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, + targetServerlessPlatforms: false, dockerContextUseLocalArtifact: false, dockerCrossCompile: false, dockerNamespace: null, @@ -48,11 +49,13 @@ async function setup({ failOnUrl }: { failOnUrl?: string } = {}) { }); getNodeDownloadInfo.mockImplementation((_: Config, platform: Platform) => { - return { - url: `${platform.getName()}:url`, - downloadPath: `${platform.getName()}:downloadPath`, - downloadName: `${platform.getName()}:downloadName`, - }; + return [ + { + url: `${platform.getName()}:url`, + downloadPath: `${platform.getName()}:downloadPath`, + downloadName: `${platform.getName()}:downloadName`, + }, + ]; }); getNodeShasums.mockReturnValue({ @@ -87,26 +90,6 @@ it('downloads node builds for each platform', async () => { "url": "linux:url", }, ], - Array [ - Object { - "destination": "linux:downloadPath", - "log": , - "maxAttempts": 3, - "shaAlgorithm": "sha256", - "shaChecksum": "linux:sha256", - "url": "linux:url", - }, - ], - Array [ - Object { - "destination": "darwin:downloadPath", - "log": , - "maxAttempts": 3, - "shaAlgorithm": "sha256", - "shaChecksum": "darwin:sha256", - "url": "darwin:url", - }, - ], Array [ Object { "destination": "darwin:downloadPath", diff --git a/src/dev/build/tasks/nodejs/download_node_builds_task.ts b/src/dev/build/tasks/nodejs/download_node_builds_task.ts index 9bc46def46964d..d630ccff7f4c1d 100644 --- a/src/dev/build/tasks/nodejs/download_node_builds_task.ts +++ b/src/dev/build/tasks/nodejs/download_node_builds_task.ts @@ -14,16 +14,26 @@ export const DownloadNodeBuilds: GlobalTask = { global: true, description: 'Downloading node.js builds for all platforms', async run(config, log) { - const shasums = await getNodeShasums(log, config.getNodeVersion()); + const downloads: Array<{ url: string; destination: string; shaChecksum: string }> = []; + for (const platform of config.getNodePlatforms()) { + for (const nodeInfo of getNodeDownloadInfo(config, platform)) { + const shasums = await getNodeShasums(log, config.getNodeVersion(), nodeInfo.variant); + + if (!downloads.some((download) => download.url === nodeInfo.url)) { + downloads.push({ + url: nodeInfo.url, + destination: nodeInfo.downloadPath, + shaChecksum: shasums[nodeInfo.downloadName], + }); + } + } + } await Promise.all( - config.getNodePlatforms().map(async (platform) => { - const { url, downloadPath, downloadName } = getNodeDownloadInfo(config, platform); - await downloadToDisk({ + downloads.map(function (download) { + return downloadToDisk({ + ...download, log, - url, - shaChecksum: shasums[downloadName], shaAlgorithm: 'sha256', - destination: downloadPath, maxAttempts: 3, }); }) diff --git a/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts index 5ca9fcbe10718a..962cde6c4df4fc 100644 --- a/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/extract_node_builds_task.test.ts @@ -39,6 +39,7 @@ async function setup() { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, + targetServerlessPlatforms: false, dockerContextUseLocalArtifact: false, dockerCrossCompile: false, dockerNamespace: null, @@ -81,8 +82,8 @@ it('runs expected fs operations', async () => { Object { "copy": Array [ Array [ - /.node_binaries//node.exe, - /.node_binaries//win32-x64/node.exe, + /.node_binaries//default/node.exe, + /.node_binaries//default/win32-x64/node.exe, Object { "clone": true, }, @@ -90,29 +91,57 @@ it('runs expected fs operations', async () => { ], "untar": Array [ Array [ - /.node_binaries//node-v-linux-x64.tar.gz, - /.node_binaries//linux-x64, + /.node_binaries//glibc-217/node-v-linux-x64.tar.gz, + /.node_binaries//glibc-217/linux-x64, Object { "strip": 1, }, ], Array [ - /.node_binaries//node-v-linux-arm64.tar.gz, - /.node_binaries//linux-arm64, + /.node_binaries//glibc-217/node-v-linux-arm64.tar.gz, + /.node_binaries//glibc-217/linux-arm64, Object { "strip": 1, }, ], Array [ - /.node_binaries//node-v-darwin-x64.tar.gz, - /.node_binaries//darwin-x64, + /.node_binaries//default/node-v-darwin-x64.tar.gz, + /.node_binaries//default/darwin-x64, Object { "strip": 1, }, ], Array [ - /.node_binaries//node-v-darwin-arm64.tar.gz, - /.node_binaries//darwin-arm64, + /.node_binaries//default/node-v-darwin-arm64.tar.gz, + /.node_binaries//default/darwin-arm64, + Object { + "strip": 1, + }, + ], + Array [ + /.node_binaries//glibc-217/node-v-linux-x64.tar.gz, + /.node_binaries//glibc-217/linux-x64, + Object { + "strip": 1, + }, + ], + Array [ + /.node_binaries//pointer-compression/node-v-linux-x64.tar.gz, + /.node_binaries//pointer-compression/linux-x64, + Object { + "strip": 1, + }, + ], + Array [ + /.node_binaries//glibc-217/node-v-linux-arm64.tar.gz, + /.node_binaries//glibc-217/linux-arm64, + Object { + "strip": 1, + }, + ], + Array [ + /.node_binaries//pointer-compression/node-v-linux-arm64.tar.gz, + /.node_binaries//pointer-compression/linux-arm64, Object { "strip": 1, }, diff --git a/src/dev/build/tasks/nodejs/extract_node_builds_task.ts b/src/dev/build/tasks/nodejs/extract_node_builds_task.ts index 234158d5b5bfd2..d77c7474bc24be 100644 --- a/src/dev/build/tasks/nodejs/extract_node_builds_task.ts +++ b/src/dev/build/tasks/nodejs/extract_node_builds_task.ts @@ -7,7 +7,7 @@ */ import Path from 'path'; - +import Fs from 'fs'; import { untar, GlobalTask, copy } from '../../lib'; import { getNodeDownloadInfo } from './node_download_info'; @@ -17,15 +17,19 @@ export const ExtractNodeBuilds: GlobalTask = { async run(config) { await Promise.all( config.getNodePlatforms().map(async (platform) => { - const { downloadPath, extractDir } = getNodeDownloadInfo(config, platform); - if (platform.isWindows()) { - // windows executable is not extractable, it's just an .exe file - await copy(downloadPath, Path.resolve(extractDir, 'node.exe'), { - clone: true, - }); - } else { - await untar(downloadPath, extractDir, { strip: 1 }); - } + await Promise.all( + getNodeDownloadInfo(config, platform).map((nodeInfo) => { + if (Fs.existsSync(nodeInfo.extractDir)) return; + if (platform.isWindows()) { + // windows executable is not extractable, it's just an .exe file + return copy(nodeInfo.downloadPath, Path.resolve(nodeInfo.extractDir, 'node.exe'), { + clone: true, + }); + } else { + return untar(nodeInfo.downloadPath, nodeInfo.extractDir, { strip: 1 }); + } + }) + ); }) ); }, diff --git a/src/dev/build/tasks/nodejs/node_download_info.ts b/src/dev/build/tasks/nodejs/node_download_info.ts index 821cdb6973ca97..489ff1fc009479 100644 --- a/src/dev/build/tasks/nodejs/node_download_info.ts +++ b/src/dev/build/tasks/nodejs/node_download_info.ts @@ -13,20 +13,35 @@ import { Config, Platform } from '../../lib'; export function getNodeDownloadInfo(config: Config, platform: Platform) { const version = config.getNodeVersion(); const arch = platform.getNodeArch(); + let variants = ['default']; + if (platform.isLinux()) { + variants = ['glibc-217']; + if (platform.isServerless()) variants.push('pointer-compression'); + } - const downloadName = platform.isWindows() - ? 'win-x64/node.exe' - : `node-v${version}-${arch}.tar.gz`; + return variants.map((variant) => { + const downloadName = platform.isWindows() + ? 'win-x64/node.exe' + : `node-v${version}-${arch}.tar.gz`; - const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v${version}/${downloadName}`; - const downloadPath = config.resolveFromRepo('.node_binaries', version, basename(downloadName)); - const extractDir = config.resolveFromRepo('.node_binaries', version, arch); + let variantPath = ''; + if (variant === 'pointer-compression') variantPath = 'node-pointer-compression/'; + const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/${variantPath}dist/v${version}/${downloadName}`; + const downloadPath = config.resolveFromRepo( + '.node_binaries', + version, + variant, + basename(downloadName) + ); + const extractDir = config.resolveFromRepo('.node_binaries', version, variant, arch); - return { - url, - downloadName, - downloadPath, - extractDir, - version, - }; + return { + url, + downloadName, + downloadPath, + extractDir, + variant, + version, + }; + }); } diff --git a/src/dev/build/tasks/nodejs/node_shasums.test.ts b/src/dev/build/tasks/nodejs/node_shasums.test.ts index fc888851946e2d..a1c6e963d4c66e 100644 --- a/src/dev/build/tasks/nodejs/node_shasums.test.ts +++ b/src/dev/build/tasks/nodejs/node_shasums.test.ts @@ -61,7 +61,11 @@ import { getNodeShasums } from './node_shasums'; describe('src/dev/build/tasks/nodejs/node_shasums', () => { it('resolves to an object with shasums for node downloads for version', async () => { - const shasums = await getNodeShasums(new ToolingLog(), '8.9.4'); + const shasums = await getNodeShasums(new ToolingLog(), '8.9.4', { + getTarget() { + return null; + }, + } as any); expect(shasums).toEqual( expect.objectContaining({ 'node-v8.9.4.tar.gz': '729b44b32b2f82ecd5befac4f7518de0c4e3add34e8fe878f745740a66cbbc01', diff --git a/src/dev/build/tasks/nodejs/node_shasums.ts b/src/dev/build/tasks/nodejs/node_shasums.ts index 850e28d5d3eadb..7e25908185eb94 100644 --- a/src/dev/build/tasks/nodejs/node_shasums.ts +++ b/src/dev/build/tasks/nodejs/node_shasums.ts @@ -9,14 +9,22 @@ import { ToolingLog } from '@kbn/tooling-log'; import { downloadToString } from '../../lib/download'; -export async function getNodeShasums(log: ToolingLog, nodeVersion: string) { - const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v${nodeVersion}/SHASUMS256.txt`; +const cache: Record> = {}; + +export async function getNodeShasums(log: ToolingLog, nodeVersion: string, variant: string | null) { + let variantPath = ''; + if (variant === 'pointer-compression') variantPath = 'node-pointer-compression/'; + const url = `https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/${variantPath}dist/v${nodeVersion}/SHASUMS256.txt`; + + if (cache[url]) { + log.debug('Returning cached shasum values for node version', nodeVersion, 'from', url); + return cache[url]; + } log.debug('Downloading shasum values for node version', nodeVersion, 'from', url); const checksum = await downloadToString({ log, url, expectStatus: 200 }); - - return checksum.split('\n').reduce((acc: Record, line: string) => { + const result = checksum.split('\n').reduce((acc: Record, line: string) => { const [sha, platform] = line.split(' '); return { @@ -24,4 +32,6 @@ export async function getNodeShasums(log: ToolingLog, nodeVersion: string) { [platform]: sha, }; }, {}); + cache[url] = result; + return result; } diff --git a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts index 966012a194ab09..995244e9d2b848 100644 --- a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts +++ b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.test.ts @@ -44,6 +44,7 @@ async function setup(actualShaSums?: Record) { const config = await Config.create({ isRelease: true, targetAllPlatforms: true, + targetServerlessPlatforms: false, dockerContextUseLocalArtifact: false, dockerCrossCompile: false, dockerNamespace: null, @@ -58,16 +59,27 @@ async function setup(actualShaSums?: Record) { getNodeShasums.mockReturnValue( Object.fromEntries( config.getTargetPlatforms().map((platform) => { - return [`${platform.getName()}:${platform.getNodeArch()}:downloadName`, 'valid shasum']; + return [ + `${platform.getName()}:${ + platform.getVariant() || 'default' + }:${platform.getNodeArch()}:downloadName`, + 'valid shasum', + ]; }) ) ); getNodeDownloadInfo.mockImplementation((_: Config, platform: Platform) => { - return { - downloadPath: `${platform.getName()}:${platform.getNodeArch()}:downloadPath`, - downloadName: `${platform.getName()}:${platform.getNodeArch()}:downloadName`, - }; + return [ + { + downloadPath: `${platform.getName()}:${ + platform.getVariant() || 'default' + }:${platform.getNodeArch()}:downloadPath`, + downloadName: `${platform.getName()}:${ + platform.getVariant() || 'default' + }:${platform.getNodeArch()}:downloadName`, + }, + ]; }); getFileHash.mockImplementation((downloadPath: string) => { @@ -97,17 +109,122 @@ it('checks shasums for each downloaded node build', async () => { Array [ , "", + undefined, + ], + Array [ + , + "", + undefined, + ], + Array [ + , + "", + undefined, + ], + Array [ + , + "", + undefined, + ], + Array [ + , + "", + undefined, + ], + Array [ + , + "", + undefined, + ], + Array [ + , + "", + undefined, ], ], "results": Array [ Object { "type": "return", "value": Object { - "darwin:darwin-arm64:downloadName": "valid shasum", - "darwin:darwin-x64:downloadName": "valid shasum", - "linux:linux-arm64:downloadName": "valid shasum", - "linux:linux-x64:downloadName": "valid shasum", - "win32:win32-x64:downloadName": "valid shasum", + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", + }, + }, + Object { + "type": "return", + "value": Object { + "darwin:default:darwin-arm64:downloadName": "valid shasum", + "darwin:default:darwin-x64:downloadName": "valid shasum", + "linux:default:linux-arm64:downloadName": "valid shasum", + "linux:default:linux-x64:downloadName": "valid shasum", + "linux:serverless:linux-arm64:downloadName": "valid shasum", + "linux:serverless:linux-x64:downloadName": "valid shasum", + "win32:default:win32-x64:downloadName": "valid shasum", }, }, ], @@ -122,6 +239,7 @@ it('checks shasums for each downloaded node build', async () => { "architecture": "x64", "buildName": "linux-x86_64", "name": "linux", + "variant": null, }, ], Array [ @@ -130,6 +248,7 @@ it('checks shasums for each downloaded node build', async () => { "architecture": "arm64", "buildName": "linux-aarch64", "name": "linux", + "variant": null, }, ], Array [ @@ -138,6 +257,7 @@ it('checks shasums for each downloaded node build', async () => { "architecture": "x64", "buildName": "darwin-x86_64", "name": "darwin", + "variant": null, }, ], Array [ @@ -146,6 +266,7 @@ it('checks shasums for each downloaded node build', async () => { "architecture": "arm64", "buildName": "darwin-aarch64", "name": "darwin", + "variant": null, }, ], Array [ @@ -154,44 +275,91 @@ it('checks shasums for each downloaded node build', async () => { "architecture": "x64", "buildName": "windows-x86_64", "name": "win32", + "variant": null, + }, + ], + Array [ + , + Platform { + "architecture": "x64", + "buildName": "linux-x86_64", + "name": "linux", + "variant": "serverless", + }, + ], + Array [ + , + Platform { + "architecture": "arm64", + "buildName": "linux-aarch64", + "name": "linux", + "variant": "serverless", }, ], ], "results": Array [ Object { "type": "return", - "value": Object { - "downloadName": "linux:linux-x64:downloadName", - "downloadPath": "linux:linux-x64:downloadPath", - }, + "value": Array [ + Object { + "downloadName": "linux:default:linux-x64:downloadName", + "downloadPath": "linux:default:linux-x64:downloadPath", + }, + ], }, Object { "type": "return", - "value": Object { - "downloadName": "linux:linux-arm64:downloadName", - "downloadPath": "linux:linux-arm64:downloadPath", - }, + "value": Array [ + Object { + "downloadName": "linux:default:linux-arm64:downloadName", + "downloadPath": "linux:default:linux-arm64:downloadPath", + }, + ], }, Object { "type": "return", - "value": Object { - "downloadName": "darwin:darwin-x64:downloadName", - "downloadPath": "darwin:darwin-x64:downloadPath", - }, + "value": Array [ + Object { + "downloadName": "darwin:default:darwin-x64:downloadName", + "downloadPath": "darwin:default:darwin-x64:downloadPath", + }, + ], }, Object { "type": "return", - "value": Object { - "downloadName": "darwin:darwin-arm64:downloadName", - "downloadPath": "darwin:darwin-arm64:downloadPath", - }, + "value": Array [ + Object { + "downloadName": "darwin:default:darwin-arm64:downloadName", + "downloadPath": "darwin:default:darwin-arm64:downloadPath", + }, + ], }, Object { "type": "return", - "value": Object { - "downloadName": "win32:win32-x64:downloadName", - "downloadPath": "win32:win32-x64:downloadPath", - }, + "value": Array [ + Object { + "downloadName": "win32:default:win32-x64:downloadName", + "downloadPath": "win32:default:win32-x64:downloadPath", + }, + ], + }, + Object { + "type": "return", + "value": Array [ + Object { + "downloadName": "linux:serverless:linux-x64:downloadName", + "downloadPath": "linux:serverless:linux-x64:downloadPath", + }, + ], + }, + Object { + "type": "return", + "value": Array [ + Object { + "downloadName": "linux:serverless:linux-arm64:downloadName", + "downloadPath": "linux:serverless:linux-arm64:downloadPath", + }, + ], }, ], } @@ -200,23 +368,31 @@ it('checks shasums for each downloaded node build', async () => { [MockFunction] { "calls": Array [ Array [ - "linux:linux-x64:downloadPath", + "linux:default:linux-x64:downloadPath", "sha256", ], Array [ - "linux:linux-arm64:downloadPath", + "linux:default:linux-arm64:downloadPath", "sha256", ], Array [ - "darwin:darwin-x64:downloadPath", + "darwin:default:darwin-x64:downloadPath", "sha256", ], Array [ - "darwin:darwin-arm64:downloadPath", + "darwin:default:darwin-arm64:downloadPath", "sha256", ], Array [ - "win32:win32-x64:downloadPath", + "win32:default:win32-x64:downloadPath", + "sha256", + ], + Array [ + "linux:serverless:linux-x64:downloadPath", + "sha256", + ], + Array [ + "linux:serverless:linux-arm64:downloadPath", "sha256", ], ], @@ -241,6 +417,14 @@ it('checks shasums for each downloaded node build', async () => { "type": "return", "value": "valid shasum", }, + Object { + "type": "return", + "value": "valid shasum", + }, + Object { + "type": "return", + "value": "valid shasum", + }, ], } `); @@ -248,12 +432,12 @@ it('checks shasums for each downloaded node build', async () => { it('rejects if any download has an incorrect sha256', async () => { const { config } = await setup({ - 'linux:linux-arm64:downloadPath': 'invalid shasum', + 'linux:default:linux-arm64:downloadPath': 'invalid shasum', }); await expect( VerifyExistingNodeBuilds.run(config, log, []) ).rejects.toThrowErrorMatchingInlineSnapshot( - `"Download at linux:linux-arm64:downloadPath does not match expected checksum invalid shasum"` + `"Download at linux:default:linux-arm64:downloadPath does not match expected checksum invalid shasum"` ); }); diff --git a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.ts b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.ts index 394e883947eb33..29e86d4ca07b4b 100644 --- a/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.ts +++ b/src/dev/build/tasks/nodejs/verify_existing_node_builds_task.ts @@ -14,18 +14,27 @@ export const VerifyExistingNodeBuilds: GlobalTask = { global: true, description: 'Verifying previously downloaded node.js build for all platforms', async run(config, log) { - const shasums = await getNodeShasums(log, config.getNodeVersion()); + const builds: Array<{ downloadPath: string; shaChecksum: string }> = []; + for (const platform of config.getNodePlatforms()) { + for (const nodeInfo of getNodeDownloadInfo(config, platform)) { + const shasums = await getNodeShasums(log, config.getNodeVersion(), nodeInfo.variant); + if (!builds.some((build) => build.downloadPath === nodeInfo.downloadName)) { + builds.push({ + downloadPath: nodeInfo.downloadPath, + shaChecksum: shasums[nodeInfo.downloadName], + }); + } + } + } await Promise.all( - config.getNodePlatforms().map(async (platform) => { - const { downloadPath, downloadName } = getNodeDownloadInfo(config, platform); - + builds.map(async ({ shaChecksum, downloadPath }) => { const sha256 = await getFileHash(downloadPath, 'sha256'); - if (sha256 !== shasums[downloadName]) { + if (sha256 !== shaChecksum) { throw new Error(`Download at ${downloadPath} does not match expected checksum ${sha256}`); } - log.success(`Download for ${platform.getNodeArch()} matches checksum`); + log.success(`Download at ${downloadPath} matches checksum`); }) ); }, diff --git a/src/dev/build/tasks/notice_file_task.ts b/src/dev/build/tasks/notice_file_task.ts index 2b38e379bc9dac..62847f0076fc70 100644 --- a/src/dev/build/tasks/notice_file_task.ts +++ b/src/dev/build/tasks/notice_file_task.ts @@ -36,7 +36,7 @@ export const CreateNoticeFile: Task = { }); log.info('Generating build notice'); - const { extractDir: nodeDir, version: nodeVersion } = getNodeDownloadInfo( + const [{ extractDir: nodeDir, version: nodeVersion }] = getNodeDownloadInfo( config, config.getPlatform('linux', 'x64') ); diff --git a/src/dev/build/tasks/os_packages/docker_generator/run.ts b/src/dev/build/tasks/os_packages/docker_generator/run.ts index a0aed0a71c1f7e..88de0e92e868f7 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/run.ts +++ b/src/dev/build/tasks/os_packages/docker_generator/run.ts @@ -64,7 +64,9 @@ export async function runDockerGenerator( const imageTag = `docker.elastic.co/${imageNamespace}/kibana`; const version = config.getBuildVersion(); const artifactArchitecture = flags.architecture === 'aarch64' ? 'aarch64' : 'x86_64'; - const artifactPrefix = `kibana-${version}-linux`; + let artifactVariant = ''; + if (flags.serverless) artifactVariant = '-serverless'; + const artifactPrefix = `kibana${artifactVariant}-${version}-linux`; const artifactTarball = `${artifactPrefix}-${artifactArchitecture}.tar.gz`; const beatsArchitecture = flags.architecture === 'aarch64' ? 'arm64' : 'x86_64'; const metricbeatTarball = `metricbeat-${version}-linux-${beatsArchitecture}.tar.gz`; diff --git a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile index d9e67b83893268..e7f515ed3bfe2f 100644 --- a/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile +++ b/src/dev/build/tasks/os_packages/docker_generator/templates/base/Dockerfile @@ -35,11 +35,6 @@ COPY {{artifactTarball}} /tmp/kibana.tar.gz RUN mkdir /usr/share/kibana WORKDIR /usr/share/kibana RUN tar \ -{{#serverless}} -# Exclude serverless.yml disabled assets - --exclude=screenshotting-plugin/chromium \ - --exclude=screenshotting-plugin/server/assets \ -{{/serverless}} --strip-components=1 \ -zxf /tmp/kibana.tar.gz # Ensure that group permissions are the same as user permissions. @@ -173,10 +168,6 @@ ENV PATH=/usr/share/kibana/bin:$PATH # Set some Kibana configuration defaults. COPY --chown=1000:0 config/kibana.yml /usr/share/kibana/config/kibana.yml {{#serverless}} -COPY --chown=1000:0 config/serverless.yml /usr/share/kibana/config/serverless.yml -COPY --chown=1000:0 config/serverless.es.yml /usr/share/kibana/config/serverless.es.yml -COPY --chown=1000:0 config/serverless.oblt.yml /usr/share/kibana/config/serverless.oblt.yml -COPY --chown=1000:0 config/serverless.security.yml /usr/share/kibana/config/serverless.security.yml ENV PROFILER_SIGNAL=SIGUSR1 {{/serverless}} {{^opensslLegacyProvider}} diff --git a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx b/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx index 62687625db86d4..41422212fa08b6 100644 --- a/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx +++ b/src/plugins/ai_assistant_management/selection/public/routes/components/ai_assistant_selection_page.tsx @@ -75,7 +75,7 @@ export function AiAssistantSelectionPage() { Features.', @@ -124,7 +124,7 @@ export function AiAssistantSelectionPage() { Features.', diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx index abdd7c5a5ab960..d7cc6073b56602 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.tsx @@ -289,7 +289,7 @@ function EditorUI({ initialTextValue, setEditorInstance }: EditorProps) { > @@ -297,7 +297,7 @@ function EditorUI({ initialTextValue, setEditorInstance }: EditorProps) { color="primary" onClick={sendCurrentRequest} data-test-subj="sendRequestButton" - aria-label={i18n.translate('console.sendRequestButtonTooltip', { + aria-label={i18n.translate('console.sendRequestButtonTooltipAriaLabel', { defaultMessage: 'Click to send request', })} > diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx index b54e6fa900b6e7..bc9d6cf2ee3c97 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor.tsx @@ -125,7 +125,7 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => { > @@ -133,7 +133,7 @@ export const MonacoEditor = ({ initialTextValue }: EditorProps) => { color="primary" onClick={sendRequestsCallback} data-test-subj="sendRequestButton" - aria-label={i18n.translate('console.sendRequestButtonTooltip', { + aria-label={i18n.translate('console.sendRequestButtonTooltipAriaLabel', { defaultMessage: 'Click to send request', })} > diff --git a/src/plugins/controls/common/index.ts b/src/plugins/controls/common/index.ts index 75b9881b83ea5c..69af581fc5fada 100644 --- a/src/plugins/controls/common/index.ts +++ b/src/plugins/controls/common/index.ts @@ -18,6 +18,7 @@ export { type RawControlGroupAttributes, type PersistableControlGroupInput, type SerializableControlGroupInput, + type ControlGroupChainingSystem, persistableControlGroupInputKeys, } from './control_group/types'; export { @@ -32,6 +33,7 @@ export { } from './control_group/control_group_persistence'; export { + DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH, DEFAULT_CONTROL_STYLE, } from './control_group/control_group_constants'; diff --git a/src/plugins/controls/public/control_group/actions/clear_control_action.tsx b/src/plugins/controls/public/control_group/actions/clear_control_action.tsx index 794a4efdeb4361..58815381280700 100644 --- a/src/plugins/controls/public/control_group/actions/clear_control_action.tsx +++ b/src/plugins/controls/public/control_group/actions/clear_control_action.tsx @@ -9,30 +9,55 @@ import React, { SyntheticEvent } from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import { isErrorEmbeddable } from '@kbn/embeddable-plugin/public'; +import { apiIsPresentationContainer, PresentationContainer } from '@kbn/presentation-containers'; +import { + apiCanAccessViewMode, + apiHasParentApi, + apiHasType, + apiHasUniqueId, + apiIsOfType, + EmbeddableApiContext, + HasParentApi, + HasType, + HasUniqueId, +} from '@kbn/presentation-publishing'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import { ACTION_CLEAR_CONTROL } from '.'; +import { CanClearSelections, isClearableControl } from '../../types'; import { ControlGroupStrings } from '../control_group_strings'; -import { ControlEmbeddable, DataControlInput, isClearableControl } from '../../types'; -import { isControlGroup } from '../embeddable/control_group_helpers'; +import { CONTROL_GROUP_TYPE } from '../types'; -export interface ClearControlActionContext { - embeddable: ControlEmbeddable; -} +export type ClearControlActionApi = HasType & + HasUniqueId & + CanClearSelections & + HasParentApi; + +const isApiCompatible = (api: unknown | null): api is ClearControlActionApi => + Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + isClearableControl(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); -export class ClearControlAction implements Action { +export class ClearControlAction implements Action { public readonly type = ACTION_CLEAR_CONTROL; public readonly id = ACTION_CLEAR_CONTROL; public order = 1; constructor() {} - public readonly MenuItem = ({ context }: { context: ClearControlActionContext }) => { + public readonly MenuItem = ({ context }: { context: EmbeddableApiContext }) => { + if (!isApiCompatible(context.embeddable)) throw new IncompatibleActionError(); + return ( ) => { @@ -45,34 +70,22 @@ export class ClearControlAction implements Action { ); }; - public getDisplayName({ embeddable }: ClearControlActionContext) { - if (!embeddable.parent || !isControlGroup(embeddable.parent)) { - throw new IncompatibleActionError(); - } + public getDisplayName({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return ControlGroupStrings.floatingActions.getClearButtonTitle(); } - public getIconType({ embeddable }: ClearControlActionContext) { - if (!embeddable.parent || !isControlGroup(embeddable.parent)) { - throw new IncompatibleActionError(); - } + public getIconType({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return 'eraser'; } - public async isCompatible({ embeddable }: ClearControlActionContext) { - if (isErrorEmbeddable(embeddable)) return false; - const controlGroup = embeddable.parent; - return Boolean(controlGroup && isControlGroup(controlGroup)) && isClearableControl(embeddable); + public async isCompatible({ embeddable }: EmbeddableApiContext) { + return isApiCompatible(embeddable); } - public async execute({ embeddable }: ClearControlActionContext) { - if ( - !embeddable.parent || - !isControlGroup(embeddable.parent) || - !isClearableControl(embeddable) - ) { - throw new IncompatibleActionError(); - } + public async execute({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); embeddable.clearSelections(); } } diff --git a/src/plugins/controls/public/control_group/actions/delete_control_action.tsx b/src/plugins/controls/public/control_group/actions/delete_control_action.tsx index a519763132a239..1627eab8560c23 100644 --- a/src/plugins/controls/public/control_group/actions/delete_control_action.tsx +++ b/src/plugins/controls/public/control_group/actions/delete_control_action.tsx @@ -9,20 +9,43 @@ import React from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import { ViewMode, isErrorEmbeddable } from '@kbn/embeddable-plugin/public'; +import { ViewMode } from '@kbn/embeddable-plugin/public'; import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { apiIsPresentationContainer, PresentationContainer } from '@kbn/presentation-containers'; +import { + apiCanAccessViewMode, + apiHasParentApi, + apiHasType, + apiHasUniqueId, + apiIsOfType, + EmbeddableApiContext, + getInheritedViewMode, + HasParentApi, + HasType, + HasUniqueId, + PublishesViewMode, +} from '@kbn/presentation-publishing'; import { ACTION_DELETE_CONTROL } from '.'; import { pluginServices } from '../../services'; import { ControlGroupStrings } from '../control_group_strings'; -import { ControlEmbeddable, DataControlInput } from '../../types'; -import { isControlGroup } from '../embeddable/control_group_helpers'; +import { CONTROL_GROUP_TYPE } from '../types'; -export interface DeleteControlActionContext { - embeddable: ControlEmbeddable; -} +export type DeleteControlActionApi = HasType & + HasUniqueId & + HasParentApi; + +const isApiCompatible = (api: unknown | null): api is DeleteControlActionApi => + Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); -export class DeleteControlAction implements Action { +export class DeleteControlAction implements Action { public readonly type = ACTION_DELETE_CONTROL; public readonly id = ACTION_DELETE_CONTROL; public order = 100; // should always be last @@ -35,11 +58,13 @@ export class DeleteControlAction implements Action { } = pluginServices.getServices()); } - public readonly MenuItem = ({ context }: { context: DeleteControlActionContext }) => { + public readonly MenuItem = ({ context }: { context: EmbeddableApiContext }) => { + if (!isApiCompatible(context.embeddable)) throw new IncompatibleActionError(); + return ( this.execute(context)} @@ -49,34 +74,25 @@ export class DeleteControlAction implements Action { ); }; - public getDisplayName({ embeddable }: DeleteControlActionContext) { - if (!embeddable.parent || !isControlGroup(embeddable.parent)) { - throw new IncompatibleActionError(); - } + public getDisplayName({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return ControlGroupStrings.floatingActions.getRemoveButtonTitle(); } - public getIconType({ embeddable }: DeleteControlActionContext) { - if (!embeddable.parent || !isControlGroup(embeddable.parent)) { - throw new IncompatibleActionError(); - } + public getIconType({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); return 'trash'; } - public async isCompatible({ embeddable }: DeleteControlActionContext) { - if (isErrorEmbeddable(embeddable)) return false; - const controlGroup = embeddable.parent; - return Boolean( - controlGroup && - isControlGroup(controlGroup) && - controlGroup.getInput().viewMode === ViewMode.EDIT + public async isCompatible({ embeddable }: EmbeddableApiContext) { + return ( + isApiCompatible(embeddable) && getInheritedViewMode(embeddable.parentApi) === ViewMode.EDIT ); } - public async execute({ embeddable }: DeleteControlActionContext) { - if (!embeddable.parent || !isControlGroup(embeddable.parent)) { - throw new IncompatibleActionError(); - } + public async execute({ embeddable }: EmbeddableApiContext) { + if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); + this.openConfirm(ControlGroupStrings.management.deleteControls.getSubtitle(), { confirmButtonText: ControlGroupStrings.management.deleteControls.getConfirm(), cancelButtonText: ControlGroupStrings.management.deleteControls.getCancel(), @@ -84,7 +100,7 @@ export class DeleteControlAction implements Action { buttonColor: 'danger', }).then((confirmed) => { if (confirmed) { - embeddable.parent?.removeEmbeddable(embeddable.id); + embeddable.parentApi.removePanel(embeddable.uuid); } }); } diff --git a/src/plugins/controls/public/control_group/component/control_frame_component.tsx b/src/plugins/controls/public/control_group/component/control_frame_component.tsx index 771f6d7d9c5968..e4c647737f48c4 100644 --- a/src/plugins/controls/public/control_group/component/control_frame_component.tsx +++ b/src/plugins/controls/public/control_group/component/control_frame_component.tsx @@ -129,7 +129,7 @@ export const ControlFrame = ({ 'controlFrameFloatingActions--oneLine': !usingTwoLineLayout, })} viewMode={viewMode} - embeddable={embeddable} + api={embeddable} disabledActions={disabledActions} isEnabled={embeddable && enableActions} > diff --git a/src/plugins/controls/public/control_group/editor/control_editor.tsx b/src/plugins/controls/public/control_group/editor/control_editor.tsx index 5f39f3c6a16ec1..118b310b49574d 100644 --- a/src/plugins/controls/public/control_group/editor/control_editor.tsx +++ b/src/plugins/controls/public/control_group/editor/control_editor.tsx @@ -6,14 +6,6 @@ * Side Public License, v 1. */ -/* - * Copyright 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 deepEqual from 'fast-deep-equal'; import React, { useEffect, useMemo, useRef, useState } from 'react'; import useAsync from 'react-use/lib/useAsync'; diff --git a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx index 7a0509429f0590..70c57f6f73cfc2 100644 --- a/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx +++ b/src/plugins/controls/public/control_group/embeddable/control_group_container.tsx @@ -11,8 +11,15 @@ import { isEqual, pick } from 'lodash'; import React, { createContext, useContext } from 'react'; import ReactDOM from 'react-dom'; import { batch, Provider, TypedUseSelectorHook, useSelector } from 'react-redux'; -import { BehaviorSubject, merge, Subject, Subscription } from 'rxjs'; -import { debounceTime, distinctUntilChanged, skip } from 'rxjs'; +import { + BehaviorSubject, + debounceTime, + distinctUntilChanged, + merge, + skip, + Subject, + Subscription, +} from 'rxjs'; import { OverlayRef } from '@kbn/core/public'; import { Container, EmbeddableFactory } from '@kbn/embeddable-plugin/public'; @@ -479,6 +486,11 @@ export class ControlGroupContainer extends Container< }; } + public removePanel(id: string): void { + /** TODO: This is a temporary wrapper until the control group refactor is complete */ + super.removeEmbeddable(id); + } + protected onRemoveEmbeddable(idToRemove: string) { const newPanels = super.onRemoveEmbeddable(idToRemove) as ControlsPanels; const childOrderCache = cachedChildEmbeddableOrder(this.getInput().panels); diff --git a/src/plugins/controls/public/index.ts b/src/plugins/controls/public/index.ts index 555b9d4284e891..a9d7e950ee05b3 100644 --- a/src/plugins/controls/public/index.ts +++ b/src/plugins/controls/public/index.ts @@ -15,6 +15,7 @@ export type { ControlEditorProps, CommonControlOutput, IEditableControlFactory, + CanClearSelections, } from './types'; export type { @@ -65,6 +66,9 @@ export { type ControlGroupRendererProps, } from './control_group'; +/** TODO: Remove this once it is no longer needed in the examples plugin */ +export { CONTROL_WIDTH_OPTIONS } from './control_group/editor/editor_constants'; + export function plugin() { return new ControlsPlugin(); } diff --git a/src/plugins/controls/public/options_list/embeddable/options_list_embeddable.tsx b/src/plugins/controls/public/options_list/embeddable/options_list_embeddable.tsx index 31ac406a832074..81dd3ea9c64c98 100644 --- a/src/plugins/controls/public/options_list/embeddable/options_list_embeddable.tsx +++ b/src/plugins/controls/public/options_list/embeddable/options_list_embeddable.tsx @@ -11,8 +11,17 @@ import { isEmpty, isEqual } from 'lodash'; import React, { createContext, useContext } from 'react'; import ReactDOM from 'react-dom'; import { batch } from 'react-redux'; -import { merge, Subject, Subscription, switchMap, tap } from 'rxjs'; -import { debounceTime, distinctUntilChanged, map, skip } from 'rxjs'; +import { + debounceTime, + distinctUntilChanged, + map, + merge, + skip, + Subject, + Subscription, + switchMap, + tap, +} from 'rxjs'; import { DataView, FieldSpec } from '@kbn/data-views-plugin/public'; import { Embeddable, IContainer } from '@kbn/embeddable-plugin/public'; @@ -39,7 +48,7 @@ import { ControlFilterOutput } from '../../control_group/types'; import { pluginServices } from '../../services'; import { ControlsDataViewsService } from '../../services/data_views/types'; import { ControlsOptionsListService } from '../../services/options_list/types'; -import { IClearableControl } from '../../types'; +import { CanClearSelections } from '../../types'; import { OptionsListControl } from '../components/options_list_control'; import { getDefaultComponentState, optionsListReducers } from '../options_list_reducers'; import { MIN_OPTIONS_LIST_REQUEST_SIZE, OptionsListReduxState } from '../types'; @@ -81,7 +90,7 @@ type OptionsListReduxEmbeddableTools = ReduxEmbeddableTools< export class OptionsListEmbeddable extends Embeddable - implements IClearableControl + implements CanClearSelections { public readonly type = OPTIONS_LIST_CONTROL; public deferEmbeddableLoad = true; diff --git a/src/plugins/controls/public/range_slider/embeddable/range_slider_embeddable.tsx b/src/plugins/controls/public/range_slider/embeddable/range_slider_embeddable.tsx index 52e048fbb0898b..2f77f8163ca3e0 100644 --- a/src/plugins/controls/public/range_slider/embeddable/range_slider_embeddable.tsx +++ b/src/plugins/controls/public/range_slider/embeddable/range_slider_embeddable.tsx @@ -38,7 +38,7 @@ import { ControlFilterOutput } from '../../control_group/types'; import { pluginServices } from '../../services'; import { ControlsDataService } from '../../services/data/types'; import { ControlsDataViewsService } from '../../services/data_views/types'; -import { IClearableControl } from '../../types'; +import { CanClearSelections } from '../../types'; import { RangeSliderControl } from '../components/range_slider_control'; import { getDefaultComponentState, rangeSliderReducers } from '../range_slider_reducers'; import { RangeSliderReduxState } from '../types'; @@ -79,7 +79,7 @@ type RangeSliderReduxEmbeddableTools = ReduxEmbeddableTools< export class RangeSliderEmbeddable extends Embeddable - implements IClearableControl + implements CanClearSelections { public readonly type = RANGE_SLIDER_CONTROL; public deferEmbeddableLoad = true; diff --git a/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx b/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx index f29611fedaeed1..1639d3145ed010 100644 --- a/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx +++ b/src/plugins/controls/public/time_slider/embeddable/time_slider_embeddable.tsx @@ -26,7 +26,7 @@ import { ControlTimesliceOutput } from '../../control_group/types'; import { pluginServices } from '../../services'; import { ControlsDataService } from '../../services/data/types'; import { ControlsSettingsService } from '../../services/settings/types'; -import { ControlOutput, IClearableControl } from '../../types'; +import { CanClearSelections, ControlOutput } from '../../types'; import { TimeSlider, TimeSliderPrepend } from '../components'; import { timeSliderReducers } from '../time_slider_reducers'; import { getIsAnchored, getRoundedTimeRangeBounds } from '../time_slider_selectors'; @@ -57,7 +57,7 @@ type TimeSliderReduxEmbeddableTools = ReduxEmbeddableTools< export class TimeSliderControlEmbeddable extends Embeddable - implements IClearableControl + implements CanClearSelections { public readonly type = TIME_SLIDER_CONTROL; public deferEmbeddedLoad = true; diff --git a/src/plugins/controls/public/types.ts b/src/plugins/controls/public/types.ts index bb1bbf87b62e4e..cf9c1a871558c4 100644 --- a/src/plugins/controls/public/types.ts +++ b/src/plugins/controls/public/types.ts @@ -36,25 +36,23 @@ export type ControlFactory = EmbeddableFa ControlEmbeddable >; -export type ControlEmbeddable< +export interface ControlEmbeddable< TControlEmbeddableInput extends ControlInput = ControlInput, TControlEmbeddableOutput extends ControlOutput = ControlOutput -> = IEmbeddable & { +> extends IEmbeddable { isChained?: () => boolean; renderPrepend?: () => ReactNode | undefined; selectionsToFilters?: ( input: Partial ) => Promise; -}; +} -export interface IClearableControl< - TClearableControlEmbeddableInput extends ControlInput = ControlInput -> extends ControlEmbeddable { +export interface CanClearSelections { clearSelections: () => void; } -export const isClearableControl = (control: ControlEmbeddable): control is IClearableControl => { - return Boolean((control as IClearableControl).clearSelections); +export const isClearableControl = (control: unknown): control is CanClearSelections => { + return typeof (control as CanClearSelections).clearSelections === 'function'; }; /** diff --git a/src/plugins/controls/tsconfig.json b/src/plugins/controls/tsconfig.json index db72c59aee7374..3a97d130e29026 100644 --- a/src/plugins/controls/tsconfig.json +++ b/src/plugins/controls/tsconfig.json @@ -39,6 +39,8 @@ "@kbn/react-kibana-mount", "@kbn/shared-ux-markdown", "@kbn/react-kibana-context-render", + "@kbn/presentation-containers", + "@kbn/presentation-publishing", ], "exclude": [ "target/**/*", diff --git a/src/plugins/dashboard/common/index.ts b/src/plugins/dashboard/common/index.ts index 07bf085e7fdedd..1f1bc4da305f00 100644 --- a/src/plugins/dashboard/common/index.ts +++ b/src/plugins/dashboard/common/index.ts @@ -15,7 +15,7 @@ export type { DashboardContainerByReferenceInput, } from './dashboard_container/types'; -export type { DashboardAttributes } from './content_management'; +export type { DashboardAttributes, SavedDashboardPanel } from './content_management'; export { injectReferences, diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx index 7d716528148d16..65b435303ca3ec 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.test.tsx @@ -124,6 +124,20 @@ describe('ShowShareModal', () => { query: { query: 'bye', language: 'kuery' }, } as unknown as DashboardContainerInput; const showModalProps = getPropsAndShare(unsavedDashboardState); + showModalProps.getDashboardState = () => { + return { + panels: { + panel_1: { + type: 'panel_type', + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + panelRefName: 'superPanel', + explicitInput: { + id: 'superPanel', + }, + }, + }, + } as unknown as DashboardContainerInput; + }; ShowShareModal(showModalProps); expect(toggleShareMenuSpy).toHaveBeenCalledTimes(1); const shareLocatorParams = ( @@ -175,6 +189,14 @@ describe('ShowShareModal', () => { changedKey2: 'definitely NOT changed', }, }, + panel_3: { + gridData: { w: 0, h: 0, x: 0, y: 0, i: '0' }, + type: 'superType', + explicitInput: { + id: 'whatever2', + changedKey3: 'should still exist', + }, + }, }, } as unknown as DashboardContainerInput; }; @@ -197,5 +219,6 @@ describe('ShowShareModal', () => { expect(shareLocatorParams.panels).toBeDefined(); expect(shareLocatorParams.panels![0].embeddableConfig.changedKey1).toBe('changed'); expect(shareLocatorParams.panels![1].embeddableConfig.changedKey2).toBe('definitely changed'); + expect(shareLocatorParams.panels![2].embeddableConfig.changedKey3).toBe('should still exist'); }); }); diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx index c9c7891d6b3526..9adebbacd1248a 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/share/show_share_modal.tsx @@ -127,40 +127,50 @@ export function ShowShareModal({ let unsavedStateForLocator: DashboardLocatorParams = {}; - const { dashboardState: unsavedDashboardState, panels: unsavedPanelStates } = + const { dashboardState: unsavedDashboardState, panels: panelModifications } = dashboardBackup.getState(savedObjectId) ?? {}; - const latestPanels = getDashboardState().panels; - const unsavedPanelsMap = unsavedPanelStates - ? Object.entries(unsavedPanelStates).reduce((acc, [panelId, unsavedPanel]) => { - if (unsavedPanel && latestPanels?.[panelId]) { - acc[panelId] = { - ...latestPanels[panelId], - explicitInput: { - ...latestPanels?.[panelId].explicitInput, - ...unsavedPanel, - id: panelId, - }, - }; - } - return acc; - }, {} as DashboardPanelMap) - : {}; - - const allPanels: DashboardPanelMap = { - ...(unsavedDashboardState?.panels ?? {}), - ...unsavedPanelsMap, - }; + const allUnsavedPanels = (() => { + if ( + Object.keys(unsavedDashboardState?.panels ?? {}).length === 0 && + Object.keys(panelModifications ?? {}).length === 0 + ) { + // if this dashboard has no modifications or unsaved panels return early. No overrides needed. + return; + } + + const latestPanels = getDashboardState().panels; + // apply modifications to panels. + const modifiedPanels = panelModifications + ? Object.entries(panelModifications).reduce((acc, [panelId, unsavedPanel]) => { + if (unsavedPanel && latestPanels?.[panelId]) { + acc[panelId] = { + ...latestPanels[panelId], + explicitInput: { + ...latestPanels?.[panelId].explicitInput, + ...unsavedPanel, + id: panelId, + }, + }; + } + return acc; + }, {} as DashboardPanelMap) + : {}; + + // The latest state of panels to share. This will overwrite panels from the saved object on Dashboard load. + const allUnsavedPanelsMap = { + ...latestPanels, + ...modifiedPanels, + }; + return convertPanelMapToSavedPanels(allUnsavedPanelsMap); + })(); if (unsavedDashboardState) { unsavedStateForLocator = { query: unsavedDashboardState.query, filters: unsavedDashboardState.filters, controlGroupInput: unsavedDashboardState.controlGroupInput as SerializableControlGroupInput, - panels: - allPanels && Object.keys(allPanels).length > 0 - ? (convertPanelMapToSavedPanels(allPanels) as DashboardLocatorParams['panels']) - : undefined, + panels: allUnsavedPanels as DashboardLocatorParams['panels'], // options useMargins: unsavedDashboardState?.useMargins, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx index fe2a383291f7ca..049bfaf00e5dde 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/run_save_functions.tsx @@ -268,47 +268,72 @@ export async function runInteractiveSave(this: DashboardContainer, interactionMo } }; - let customModalTitle; - let newTitle = currentState.title; - - if (lastSavedId) { - const [baseTitle, baseCount] = extractTitleAndCount(currentState.title); - newTitle = `${baseTitle} (${baseCount + 1})`; + (async () => { + try { + let customModalTitle; + let newTitle = currentState.title; + + if (lastSavedId) { + const [baseTitle, baseCount] = extractTitleAndCount(newTitle); + let copyCount = baseCount + 1; + newTitle = `${baseTitle} (${copyCount})`; + + // increment count until we find a unique title + while ( + !(await checkForDuplicateDashboardTitle({ + title: newTitle, + lastSavedTitle: currentState.title, + copyOnSave: true, + isTitleDuplicateConfirmed: false, + })) + ) { + copyCount++; + newTitle = `${baseTitle} (${copyCount})`; + } - switch (interactionMode) { - case ViewMode.EDIT: { - customModalTitle = i18n.translate('dashboard.topNav.editModeInteractiveSave.modalTitle', { - defaultMessage: 'Save as new dashboard', - }); - break; - } - case ViewMode.VIEW: { - customModalTitle = i18n.translate('dashboard.topNav.viewModeInteractiveSave.modalTitle', { - defaultMessage: 'Duplicate dashboard', - }); - break; - } - default: { - customModalTitle = undefined; + switch (interactionMode) { + case ViewMode.EDIT: { + customModalTitle = i18n.translate( + 'dashboard.topNav.editModeInteractiveSave.modalTitle', + { + defaultMessage: 'Save as new dashboard', + } + ); + break; + } + case ViewMode.VIEW: { + customModalTitle = i18n.translate( + 'dashboard.topNav.viewModeInteractiveSave.modalTitle', + { + defaultMessage: 'Duplicate dashboard', + } + ); + break; + } + default: { + customModalTitle = undefined; + } + } } - } - } - const dashboardDuplicateModal = ( - resolve(undefined)} - timeRestore={currentState.timeRestore} - showStoreTimeOnSave={!lastSavedId} - description={currentState.description ?? ''} - showCopyOnSave={false} - onSave={onSaveAttempt} - customModalTitle={customModalTitle} - /> - ); - - this.clearOverlays(); - showSaveModal(dashboardDuplicateModal); + const dashboardDuplicateModal = ( + resolve(undefined)} + timeRestore={currentState.timeRestore} + showStoreTimeOnSave={!lastSavedId} + description={currentState.description ?? ''} + showCopyOnSave={false} + onSave={onSaveAttempt} + customModalTitle={customModalTitle} + /> + ); + this.clearOverlays(); + showSaveModal(dashboardDuplicateModal); + } catch (error) { + reject(error); + } + })(); }); } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts index 1f489fdc1a92c0..675ea426345064 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/controls/dashboard_control_group_integration.ts @@ -9,10 +9,11 @@ import { ControlGroupInput } from '@kbn/controls-plugin/common'; import { ControlGroupContainer } from '@kbn/controls-plugin/public'; import { compareFilters, COMPARE_ALL_OPTIONS, type Filter } from '@kbn/es-query'; -import { apiPublishesDataLoading, PublishingSubject } from '@kbn/presentation-publishing'; +import { combineCompatibleChildrenApis } from '@kbn/presentation-containers'; +import { apiPublishesDataLoading, PublishesDataLoading } from '@kbn/presentation-publishing'; import deepEqual from 'fast-deep-equal'; import { isEqual } from 'lodash'; -import { combineLatest, distinctUntilChanged, map, Observable, skip, switchMap } from 'rxjs'; +import { distinctUntilChanged, Observable, skip } from 'rxjs'; import { DashboardContainerInput } from '../../../../../common'; import { DashboardContainer } from '../../dashboard_container'; @@ -96,20 +97,14 @@ export function startSyncingDashboardControlGroup(this: DashboardContainer) { // the Control Group needs to know when any dashboard children are loading in order to know when to move on to the next time slice when playing. this.integrationSubscriptions.add( - this.children$ - .pipe( - switchMap((children) => { - const definedDataLoadingSubjects: Array> = []; - for (const child of Object.values(children)) { - if (apiPublishesDataLoading(child)) { - definedDataLoadingSubjects.push(child.dataLoading); - } - } - return combineLatest(definedDataLoadingSubjects).pipe( - map((values) => values.some(Boolean)) - ); - }) - ) + combineCompatibleChildrenApis( + this, + 'dataLoading', + apiPublishesDataLoading, + false, + (childrenLoading) => childrenLoading.some(Boolean) + ) + .pipe(skip(1)) // skip the initial output of "false" .subscribe((anyChildLoading) => this.controlGroup?.anyControlOutputConsumerLoading$.next(anyChildLoading) ) diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts index 92680d3aa10d43..3fd4c0df233cf9 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/data_views/sync_dashboard_data_views.ts @@ -7,6 +7,7 @@ */ import { DataView } from '@kbn/data-views-plugin/common'; +import { combineCompatibleChildrenApis } from '@kbn/presentation-containers'; import { apiPublishesDataViews, PublishesDataViews } from '@kbn/presentation-publishing'; import { uniqBy } from 'lodash'; import { combineLatest, map, Observable, of, switchMap } from 'rxjs'; @@ -32,18 +33,11 @@ export function startSyncingDashboardDataViews(this: DashboardContainer) { ) : of([]); - const childDataViewsPipe: Observable = this.children$.pipe( - switchMap((children) => { - const childrenThatPublishDataViews: PublishesDataViews[] = []; - for (const child of Object.values(children)) { - if (apiPublishesDataViews(child)) childrenThatPublishDataViews.push(child); - } - if (childrenThatPublishDataViews.length === 0) return of([]); - return combineLatest(childrenThatPublishDataViews.map((child) => child.dataViews)); - }), - map( - (nextDataViews) => nextDataViews.flat().filter((dataView) => Boolean(dataView)) as DataView[] - ) + const childDataViewsPipe = combineCompatibleChildrenApis( + this, + 'dataViews', + apiPublishesDataViews, + [] ); return combineLatest([controlGroupDataViewsPipe, childDataViewsPipe]) diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index a0190b3baee04e..bb49255d41711f 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -15,6 +15,7 @@ import { apiPublishesPanelTitle, apiPublishesUnsavedChanges, getPanelTitle, + PublishesViewMode, } from '@kbn/presentation-publishing'; import { RefreshInterval } from '@kbn/data-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; @@ -52,6 +53,7 @@ import { batch } from 'react-redux'; import { BehaviorSubject, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs'; import { v4 } from 'uuid'; +import { PublishesSettings } from '@kbn/presentation-containers/interfaces/publishes_settings'; import { apiHasSerializableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; import { DashboardContainerInput, DashboardPanelState } from '../../../common'; @@ -129,7 +131,9 @@ export class DashboardContainer TracksQueryPerformance, HasSaveNotification, HasRuntimeChildState, - HasSerializedChildState + HasSerializedChildState, + PublishesSettings, + Partial { public readonly type = DASHBOARD_CONTAINER_TYPE; diff --git a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts index dc3c4996e860f6..4fe3184f619c97 100644 --- a/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/state/diffing/dashboard_diffing_integration.ts @@ -90,7 +90,6 @@ export function startDiffingDashboardState( const reactEmbeddableUnsavedChanges = this.children$.pipe( map((children) => Object.keys(children)), distinctUntilChanged(deepEqual), - debounceTime(CHANGE_CHECK_DEBOUNCE), // children may change, so make sure we subscribe/unsubscribe with switchMap switchMap((newChildIds: string[]) => { @@ -107,6 +106,7 @@ export function startDiffingDashboardState( ) ); }), + debounceTime(CHANGE_CHECK_DEBOUNCE), map((children) => children.filter((child) => Boolean(child.unsavedChanges))) ); @@ -118,18 +118,17 @@ export function startDiffingDashboardState( startWith(null), debounceTime(CHANGE_CHECK_DEBOUNCE), switchMap(() => { - return new Observable>((observer) => { + return (async () => { const { explicitInput: currentInput, componentState: { lastSavedInput }, } = this.getState(); - getDashboardUnsavedChanges - .bind(this)(lastSavedInput, currentInput) - .then((unsavedChanges) => { - if (observer.closed) return; - observer.next(unsavedChanges); - }); - }); + const unsavedChanges = await getDashboardUnsavedChanges.bind(this)( + lastSavedInput, + currentInput + ); + return unsavedChanges; + })(); }) ); diff --git a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts index 9332315f57cd2f..ca8881cba5f979 100644 --- a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/calc_auto_interval.ts @@ -6,197 +6,115 @@ * Side Public License, v 1. */ -import { i18n } from '@kbn/i18n'; import moment from 'moment'; +import { + dayLabel, + hourLabel, + yearLabel, + minuteLabel, + secondLabel, + millisecondLabel, + infinityLabel, + monthLabel, +} from './i18n_messages'; + export const boundsDescendingRaw = [ { bound: Infinity, interval: moment.duration(1, 'year'), - boundLabel: i18n.translate('data.search.timeBuckets.infinityLabel', { - defaultMessage: 'More than a year', - }), - intervalLabel: i18n.translate('data.search.timeBuckets.yearLabel', { - defaultMessage: 'a year', - }), + boundLabel: infinityLabel(), + intervalLabel: yearLabel(), }, { bound: moment.duration(1, 'year'), interval: moment.duration(1, 'month'), - boundLabel: i18n.translate('data.search.timeBuckets.yearLabel', { - defaultMessage: 'a year', - }), - intervalLabel: i18n.translate('data.search.timeBuckets.monthLabel', { - defaultMessage: 'a month', - }), + boundLabel: yearLabel(), + intervalLabel: monthLabel(), }, { bound: moment.duration(3, 'week'), interval: moment.duration(1, 'week'), - boundLabel: i18n.translate('data.search.timeBuckets.dayLabel', { - defaultMessage: '{amount, plural, one {a day} other {# days}}', - values: { amount: 21 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.dayLabel', { - defaultMessage: '{amount, plural, one {a day} other {# days}}', - values: { amount: 7 }, - }), + boundLabel: dayLabel(21), + intervalLabel: dayLabel(7), }, { bound: moment.duration(1, 'week'), interval: moment.duration(1, 'd'), - boundLabel: i18n.translate('data.search.timeBuckets.dayLabel', { - defaultMessage: '{amount, plural, one {a day} other {# days}}', - values: { amount: 7 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.dayLabel', { - defaultMessage: '{amount, plural, one {a day} other {# days}}', - values: { amount: 1 }, - }), + boundLabel: dayLabel(7), + intervalLabel: dayLabel(1), }, { bound: moment.duration(24, 'hour'), interval: moment.duration(12, 'hour'), - boundLabel: i18n.translate('data.search.timeBuckets.dayLabel', { - defaultMessage: '{amount, plural, one {a day} other {# days}}', - values: { amount: 1 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.hourLabel', { - defaultMessage: '{amount, plural, one {an hour} other {# hours}}', - values: { amount: 12 }, - }), + boundLabel: dayLabel(1), + intervalLabel: hourLabel(12), }, { bound: moment.duration(6, 'hour'), interval: moment.duration(3, 'hour'), - boundLabel: i18n.translate('data.search.timeBuckets.hourLabel', { - defaultMessage: '{amount, plural, one {an hour} other {# hours}}', - values: { amount: 6 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.hourLabel', { - defaultMessage: '{amount, plural, one {an hour} other {# hours}}', - values: { amount: 3 }, - }), + boundLabel: hourLabel(6), + intervalLabel: hourLabel(3), }, { bound: moment.duration(2, 'hour'), interval: moment.duration(1, 'hour'), - boundLabel: i18n.translate('data.search.timeBuckets.hourLabel', { - defaultMessage: '{amount, plural, one {an hour} other {# hours}}', - values: { amount: 2 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.hourLabel', { - defaultMessage: '{amount, plural, one {an hour} other {# hours}}', - values: { amount: 1 }, - }), + boundLabel: hourLabel(2), + intervalLabel: hourLabel(1), }, { bound: moment.duration(45, 'minute'), interval: moment.duration(30, 'minute'), - boundLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 45 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 30 }, - }), + boundLabel: minuteLabel(45), + intervalLabel: minuteLabel(30), }, { bound: moment.duration(20, 'minute'), interval: moment.duration(10, 'minute'), - boundLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 20 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 10 }, - }), + boundLabel: minuteLabel(20), + intervalLabel: minuteLabel(10), }, { bound: moment.duration(9, 'minute'), interval: moment.duration(5, 'minute'), - boundLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 9 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 5 }, - }), + boundLabel: minuteLabel(9), + intervalLabel: minuteLabel(5), }, { bound: moment.duration(3, 'minute'), interval: moment.duration(1, 'minute'), - boundLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 3 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.minuteLabel', { - defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', - values: { amount: 1 }, - }), + boundLabel: minuteLabel(3), + intervalLabel: minuteLabel(1), }, { bound: moment.duration(45, 'second'), interval: moment.duration(30, 'second'), - boundLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 45 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 30 }, - }), + boundLabel: secondLabel(45), + intervalLabel: secondLabel(30), }, { bound: moment.duration(15, 'second'), interval: moment.duration(10, 'second'), - boundLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 15 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 10 }, - }), + boundLabel: secondLabel(15), + intervalLabel: secondLabel(10), }, { bound: moment.duration(7.5, 'second'), interval: moment.duration(5, 'second'), - boundLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 7.5 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 5 }, - }), + boundLabel: secondLabel(7.5), + intervalLabel: secondLabel(5), }, { bound: moment.duration(5, 'second'), interval: moment.duration(1, 'second'), - boundLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 5 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.secondLabel', { - defaultMessage: '{amount, plural, one {a second} other {# seconds}}', - values: { amount: 1 }, - }), + boundLabel: secondLabel(5), + intervalLabel: secondLabel(1), }, { bound: moment.duration(500, 'ms'), interval: moment.duration(100, 'ms'), - boundLabel: i18n.translate('data.search.timeBuckets.millisecondLabel', { - defaultMessage: '{amount, plural, one {a millisecond} other {# milliseconds}}', - values: { amount: 500 }, - }), - intervalLabel: i18n.translate('data.search.timeBuckets.millisecondLabel', { - defaultMessage: '{amount, plural, one {a millisecond} other {# milliseconds}}', - values: { amount: 100 }, - }), + boundLabel: millisecondLabel(500), + intervalLabel: millisecondLabel(100), }, ]; diff --git a/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/i18n_messages.ts b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/i18n_messages.ts new file mode 100644 index 00000000000000..56cfdc920317e1 --- /dev/null +++ b/src/plugins/data/common/search/aggs/buckets/lib/time_buckets/i18n_messages.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 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 dayLabel = (amount: number) => + i18n.translate('data.search.timeBuckets.dayLabel', { + defaultMessage: '{amount, plural, one {a day} other {# days}}', + values: { amount }, + }); + +export const hourLabel = (amount: number) => + i18n.translate('data.search.timeBuckets.hourLabel', { + defaultMessage: '{amount, plural, one {an hour} other {# hours}}', + values: { amount }, + }); + +export const yearLabel = () => + i18n.translate('data.search.timeBuckets.yearLabel', { + defaultMessage: 'a year', + }); + +export const minuteLabel = (amount: number) => + i18n.translate('data.search.timeBuckets.minuteLabel', { + defaultMessage: '{amount, plural, one {a minute} other {# minutes}}', + values: { amount }, + }); + +export const secondLabel = (amount: number) => + i18n.translate('data.search.timeBuckets.secondLabel', { + defaultMessage: '{amount, plural, one {a second} other {# seconds}}', + values: { amount }, + }); + +export const millisecondLabel = (amount: number) => + i18n.translate('data.search.timeBuckets.millisecondLabel', { + defaultMessage: '{amount, plural, one {a millisecond} other {# milliseconds}}', + values: { amount }, + }); + +export const infinityLabel = () => + i18n.translate('data.search.timeBuckets.infinityLabel', { + defaultMessage: 'More than a year', + }); + +export const monthLabel = () => + i18n.translate('data.search.timeBuckets.monthLabel', { + defaultMessage: 'a month', + }); diff --git a/src/plugins/data/common/search/expressions/esql.ts b/src/plugins/data/common/search/expressions/esql.ts index a14d56dfbaebb8..6073bc5297991c 100644 --- a/src/plugins/data/common/search/expressions/esql.ts +++ b/src/plugins/data/common/search/expressions/esql.ts @@ -18,7 +18,7 @@ import { Observable, defer, throwError } from 'rxjs'; import { catchError, map, switchMap, tap } from 'rxjs'; import { buildEsQuery } from '@kbn/es-query'; import type { ISearchGeneric } from '@kbn/search-types'; -import type { ESQLSearchReponse, ESQLSearchParams } from '@kbn/es-types'; +import type { ESQLSearchResponse, ESQLSearchParams } from '@kbn/es-types'; import { getEsQueryConfig } from '../../es_query'; import { getTime } from '../../query'; import { ESQL_ASYNC_SEARCH_STRATEGY, KibanaContext, ESQL_TABLE_TYPE } from '..'; @@ -194,7 +194,7 @@ export const getEsqlFn = ({ getStartDependencies }: EsqlFnArguments) => { return search< IKibanaSearchRequest, - IKibanaSearchResponse + IKibanaSearchResponse >( { params: { ...params, dropNullColumns: true } }, { abortSignal, strategy: ESQL_ASYNC_SEARCH_STRATEGY } diff --git a/src/plugins/data/common/search/search_source/index.ts b/src/plugins/data/common/search/search_source/index.ts index 189538415ab537..0bc25a0fe85d00 100644 --- a/src/plugins/data/common/search/search_source/index.ts +++ b/src/plugins/data/common/search/search_source/index.ts @@ -15,3 +15,4 @@ export * from './fetch'; export * from './search_source'; export * from './search_source_service'; export * from './types'; +export * from './query_to_fields'; diff --git a/src/plugins/data/common/search/search_source/query_to_fields.ts b/src/plugins/data/common/search/search_source/query_to_fields.ts new file mode 100644 index 00000000000000..5c64a95a0a9272 --- /dev/null +++ b/src/plugins/data/common/search/search_source/query_to_fields.ts @@ -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 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 { DataViewLazy } from '@kbn/data-views-plugin/common'; +import { fromKueryExpression, getKqlFieldNames } from '@kbn/es-query'; +import type { SearchRequest } from './fetch'; +import { EsQuerySortValue } from '../..'; + +export async function queryToFields({ + dataView, + sort, + request, +}: { + dataView: DataViewLazy; + sort?: EsQuerySortValue | EsQuerySortValue[]; + request: SearchRequest; +}) { + let fields = dataView.timeFieldName ? [dataView.timeFieldName] : []; + if (sort) { + const sortArr = Array.isArray(sort) ? sort : [sort]; + fields.push(...sortArr.flatMap((s) => Object.keys(s))); + } + for (const query of request.query) { + if (query.query) { + const nodes = fromKueryExpression(query.query); + const queryFields = getKqlFieldNames(nodes); + fields = fields.concat(queryFields); + } + } + const filters = request.filters; + if (filters) { + const filtersArr = Array.isArray(filters) ? filters : [filters]; + for (const f of filtersArr) { + // unified search bar filters have meta object and key (regular filters) + // unified search bar "custom" filters ("Edit as query DSL", where meta.key is not present but meta is) + // Any other Elasticsearch query DSL filter that gets passed in by consumers (not coming from unified search, and these probably won't have a meta key at all) + if (f?.meta?.key && f.meta.disabled !== true) { + fields.push(f.meta.key); + } + } + } + + // if source filtering is enabled, we need to fetch all the fields + const fieldName = + dataView.getSourceFiltering() && dataView.getSourceFiltering().excludes.length ? ['*'] : fields; + + if (fieldName.length) { + return (await dataView.getFields({ fieldName })).getFieldMapSorted(); + } + + // no fields needed to be loaded for query + return {}; +} diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index 6f0807cb42248c..a5009f350bd3a5 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -77,11 +77,9 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { buildEsQuery, Filter, - fromKueryExpression, isOfQueryType, isPhraseFilter, isPhrasesFilter, - getKqlFieldNames, } from '@kbn/es-query'; import { fieldWildcardFilter } from '@kbn/kibana-utils-plugin/common'; import { getHighlightRequest } from '@kbn/field-formats-plugin/common'; @@ -95,6 +93,7 @@ import type { ISearchGeneric, IKibanaSearchResponse, IEsSearchResponse } from '@ import { normalizeSortRequest } from './normalize_sort_request'; import { AggConfigSerialized, DataViewField, SerializedSearchSourceFields } from '../..'; +import { queryToFields } from './query_to_fields'; import { AggConfigs, EsQuerySortValue } from '../..'; import type { @@ -778,43 +777,7 @@ export class SearchSource { public async loadDataViewFields(dataView: DataViewLazy) { const request = this.mergeProps(this, { body: {} }); - let fields = dataView.timeFieldName ? [dataView.timeFieldName] : []; - const sort = this.getField('sort'); - if (sort) { - const sortArr = Array.isArray(sort) ? sort : [sort]; - for (const s of sortArr) { - const keys = Object.keys(s); - fields = fields.concat(keys); - } - } - for (const query of request.query) { - if (query.query) { - const nodes = fromKueryExpression(query.query); - const queryFields = getKqlFieldNames(nodes); - fields = fields.concat(queryFields); - } - } - const filters = request.filters; - if (filters) { - const filtersArr = Array.isArray(filters) ? filters : [filters]; - for (const f of filtersArr) { - fields = fields.concat(f.meta.key); - } - } - fields = fields.filter((f) => Boolean(f)); - - if (dataView.getSourceFiltering() && dataView.getSourceFiltering().excludes.length) { - // if source filtering is enabled, we need to fetch all the fields - return (await dataView.getFields({ fieldName: ['*'] })).getFieldMapSorted(); - } else if (fields.length) { - return ( - await dataView.getFields({ - fieldName: fields, - }) - ).getFieldMapSorted(); - } - // no fields needed to be loaded for query - return {}; + return await queryToFields({ dataView, request }); } private flatten() { diff --git a/src/plugins/data/public/utils/table_inspector_view/components/data_table_selector.tsx b/src/plugins/data/public/utils/table_inspector_view/components/data_table_selector.tsx index faea07d402f181..0ecbe9e7fabd07 100644 --- a/src/plugins/data/public/utils/table_inspector_view/components/data_table_selector.tsx +++ b/src/plugins/data/public/utils/table_inspector_view/components/data_table_selector.tsx @@ -96,7 +96,7 @@ export class TableSelector extends Component diff --git a/src/plugins/data/server/ui_settings.ts b/src/plugins/data/server/ui_settings.ts index 7c314d66c19012..1a850152e2d323 100644 --- a/src/plugins/data/server/ui_settings.ts +++ b/src/plugins/data/server/ui_settings.ts @@ -204,7 +204,7 @@ export function getUiSettings(
  • {sessionId}: restricts operations to execute all search requests on the same shards. This has the benefit of reusing shard caches across requests.
  • {custom}: allows you to define a your own preference. - Use \''courier:customRequestPreference\'' to customize your preference value.
  • + Use courier:customRequestPreference to customize your preference value.
  • {none}: means do not set a preference. This might provide better performance because requests can be spread across all shard copies. However, results might be inconsistent because different shards might be in different refresh states.
  • diff --git a/src/plugins/data_view_editor/public/data_view_editor_service.test.ts b/src/plugins/data_view_editor/public/data_view_editor_service.test.ts new file mode 100644 index 00000000000000..02e79d01e1e3c4 --- /dev/null +++ b/src/plugins/data_view_editor/public/data_view_editor_service.test.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 { DataViewEditorService } from './data_view_editor_service'; +import { HttpSetup } from '@kbn/core/public'; +import { DataViewsServicePublic } from '@kbn/data-views-plugin/public'; + +describe('DataViewEditorService', () => { + it('should check for rollup indices when rolls are enabled', () => { + const get = jest.fn(); + const http = { get } as unknown as HttpSetup; + new DataViewEditorService({ + services: { + http, + dataViews: { + getIdsWithTitle: jest.fn().mockResolvedValue([]), + getRollupsEnabled: jest.fn().mockReturnValue(true), + } as unknown as DataViewsServicePublic, + }, + initialValues: {}, + }); + + expect(get).toHaveBeenCalledTimes(1); + expect(get.mock.calls[0][0]).toEqual('/api/rollup/indices'); + }); + it('should skip check for rollup indices when rollups are disabled', () => { + const http = { get: jest.fn() } as unknown as HttpSetup; + new DataViewEditorService({ + services: { + http, + dataViews: { + getIdsWithTitle: jest.fn().mockResolvedValue([]), + getRollupsEnabled: jest.fn().mockReturnValue(false), + } as unknown as DataViewsServicePublic, + }, + initialValues: {}, + }); + + expect(http.get).toHaveBeenCalledTimes(0); + }); +}); diff --git a/src/plugins/data_view_editor/public/data_view_editor_service.ts b/src/plugins/data_view_editor/public/data_view_editor_service.ts index 52ac001b1f0a4e..01c1842ee94252 100644 --- a/src/plugins/data_view_editor/public/data_view_editor_service.ts +++ b/src/plugins/data_view_editor/public/data_view_editor_service.ts @@ -179,6 +179,9 @@ export class DataViewEditorService { }; private getRollupIndexCaps = async () => { + if (this.dataViews.getRollupsEnabled() === false) { + return {}; + } let rollupIndicesCaps: RollupIndicesCapsResponse = {}; try { rollupIndicesCaps = await this.http.get('/api/rollup/indices'); diff --git a/src/plugins/data_views/common/data_views/data_views.ts b/src/plugins/data_views/common/data_views/data_views.ts index adce2a0079945a..182429de37ef9f 100644 --- a/src/plugins/data_views/common/data_views/data_views.ts +++ b/src/plugins/data_views/common/data_views/data_views.ts @@ -39,6 +39,12 @@ import { DuplicateDataViewError, DataViewInsufficientAccessError } from '../erro const MAX_ATTEMPTS_TO_RESOLVE_CONFLICTS = 3; +const createFetchFieldErrorTitle = ({ id, title }: { id?: string; title?: string }) => + i18n.translate('dataViews.fetchFieldErrorTitle', { + defaultMessage: 'Error fetching fields for data view {title} (ID: {id})', + values: { id, title }, + }); + /* * Attributes of the data view saved object * @public @@ -661,9 +667,9 @@ export class DataViewsService { this.onError( err, { - title: i18n.translate('dataViews.fetchFieldErrorTitle', { - defaultMessage: 'Error fetching fields for data view {title} (ID: {id})', - values: { id: dataView.id, title: dataView.getIndexPattern() }, + title: createFetchFieldErrorTitle({ + id: dataView.id, + title: dataView.getIndexPattern(), }), }, dataView.getIndexPattern() @@ -722,10 +728,7 @@ export class DataViewsService { this.onError( err, { - title: i18n.translate('dataViews.fetchFieldErrorTitle', { - defaultMessage: 'Error fetching fields for data view {title} (ID: {id})', - values: { id, title }, - }), + title: createFetchFieldErrorTitle({ id, title }), }, title ); @@ -884,10 +887,7 @@ export class DataViewsService { this.onError( err, { - title: i18n.translate('dataViews.fetchFieldErrorTitle', { - defaultMessage: 'Error fetching fields for data view {title} (ID: {id})', - values: { id: savedObject.id, title: spec.title }, - }), + title: createFetchFieldErrorTitle({ id: savedObject.id, title: spec.title }), }, spec.title || '' ); diff --git a/src/plugins/data_views/server/deprecations/scripted_fields.ts b/src/plugins/data_views/server/deprecations/scripted_fields.ts index 198a44ed455559..934bb71c858757 100644 --- a/src/plugins/data_views/server/deprecations/scripted_fields.ts +++ b/src/plugins/data_views/server/deprecations/scripted_fields.ts @@ -66,6 +66,7 @@ export const createScriptedFieldsDeprecationsConfig: ( allTitles: indexPatternTitles.join('; '), numberOfIndexPatternsWithScriptedFields: indexPatternsWithScriptedFields.length, }, + ignoreTag: true, }), ], }, diff --git a/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts b/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts index 0a41f087c75abc..c6a380cad98e23 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_saved_search_container.ts @@ -408,6 +408,10 @@ function getSavedSearchFieldForComparison( return visContext; } + if (fieldName === 'breakdownField') { + return savedSearch.breakdownField || ''; // ignore the difference between an empty string and undefined + } + return savedSearch[fieldName]; } diff --git a/src/plugins/discover/public/application/main/state_management/discover_state.test.ts b/src/plugins/discover/public/application/main/state_management/discover_state.test.ts index db8666cf727513..b56600b1969445 100644 --- a/src/plugins/discover/public/application/main/state_management/discover_state.test.ts +++ b/src/plugins/discover/public/application/main/state_management/discover_state.test.ts @@ -453,7 +453,6 @@ describe('Test discover state actions', () => { const { searchSource, ...savedSearch } = state.savedSearchState.getState(); expect(savedSearch).toMatchInlineSnapshot(` Object { - "breakdownField": undefined, "columns": Array [ "default_column", ], diff --git a/src/plugins/discover/public/application/main/state_management/utils/resolve_data_view.ts b/src/plugins/discover/public/application/main/state_management/utils/resolve_data_view.ts index 55e18899a4e33e..8ab6570f9d610c 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/resolve_data_view.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/resolve_data_view.ts @@ -89,7 +89,7 @@ export async function loadDataView({ if (!fetchedDataView) { try { defaultDataView = await dataViews.getDefaultDataView({ - displayErrors: false, + displayErrors: true, // notify the user about access issues refreshFields: true, }); } catch (e) { diff --git a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.test.ts b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.test.ts index 3af2b38d679c05..eea38b05503c10 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.test.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.test.ts @@ -124,6 +124,40 @@ describe('updateSavedSearch', () => { }); }); + it('should pass breakdownField if state has breakdownField', async () => { + const savedSearch = { + ...savedSearchMock, + searchSource: savedSearchMock.searchSource.createCopy(), + }; + expect(savedSearch.breakdownField).toBeUndefined(); + updateSavedSearch({ + savedSearch, + globalStateContainer: createGlobalStateContainer(), + services: discoverServiceMock, + state: { + breakdownField: 'test', + }, + }); + expect(savedSearch.breakdownField).toEqual('test'); + }); + + it('should pass an empty string if state already has breakdownField', async () => { + const savedSearch = { + ...savedSearchMock, + searchSource: savedSearchMock.searchSource.createCopy(), + breakdownField: 'test', + }; + updateSavedSearch({ + savedSearch, + globalStateContainer: createGlobalStateContainer(), + services: discoverServiceMock, + state: { + breakdownField: undefined, + }, + }); + expect(savedSearch.breakdownField).toEqual(''); + }); + it('should set query and filters from services', async () => { const savedSearch = { ...savedSearchMock, diff --git a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts index 19a5cd6c7fb887..6638e511f6b2fd 100644 --- a/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts +++ b/src/plugins/discover/public/application/main/state_management/utils/update_saved_search.ts @@ -74,7 +74,12 @@ export function updateSavedSearch({ savedSearch.viewMode = state.viewMode; } - savedSearch.breakdownField = state.breakdownField || undefined; // `undefined` instead of an empty string + if (typeof state.breakdownField !== 'undefined') { + savedSearch.breakdownField = state.breakdownField; + } else if (savedSearch.breakdownField) { + savedSearch.breakdownField = ''; + } + savedSearch.hideAggregatedPreview = state.hideAggregatedPreview; // add a flag here to identify ES|QL queries diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx index e8ba94e61a1259..3b6c8cddaa085b 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.test.tsx @@ -93,7 +93,8 @@ describe('react embeddable renderer', () => { { bork: 'blorp?' }, expect.any(Function), expect.any(String), - expect.any(Object) + expect.any(Object), + expect.any(Function) ); }); }); @@ -118,7 +119,8 @@ describe('react embeddable renderer', () => { { bork: 'blorp?' }, expect.any(Function), '12345', - expect.any(Object) + expect.any(Object), + expect.any(Function) ); }); }); @@ -139,7 +141,8 @@ describe('react embeddable renderer', () => { { bork: 'blorp?' }, expect.any(Function), expect.any(String), - parentApi + parentApi, + expect.any(Function) ); }); }); diff --git a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx index 509e5a758866d2..a10420a33f67fe 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx +++ b/src/plugins/embeddable/public/react_embeddable_system/react_embeddable_renderer.tsx @@ -19,7 +19,11 @@ import { BehaviorSubject, combineLatest, debounceTime, skip, Subscription, switc import { v4 as generateId } from 'uuid'; import { getReactEmbeddableFactory } from './react_embeddable_registry'; import { initializeReactEmbeddableState } from './react_embeddable_state'; -import { DefaultEmbeddableApi, ReactEmbeddableApiRegistration } from './types'; +import { + DefaultEmbeddableApi, + SetReactEmbeddableApiRegistration, + BuildReactEmbeddableApiRegistration, +} from './types'; const ON_STATE_CHANGE_DEBOUNCE = 100; @@ -96,8 +100,22 @@ export const ReactEmbeddableRenderer = < RuntimeState >(uuid, factory, parentApi); + const setApi = ( + apiRegistration: SetReactEmbeddableApiRegistration + ) => { + const fullApi = { + ...apiRegistration, + uuid, + phase$, + parentApi, + type: factory.type, + } as unknown as Api; + onApiAvailable?.(fullApi); + return fullApi; + }; + const buildApi = ( - apiRegistration: ReactEmbeddableApiRegistration, + apiRegistration: BuildReactEmbeddableApiRegistration, comparators: StateComparators ) => { if (onAnyStateChange) { @@ -131,21 +149,15 @@ export const ReactEmbeddableRenderer = < const { unsavedChanges, resetUnsavedChanges, cleanup, snapshotRuntimeState } = startStateDiffing(comparators); - const fullApi = { + + const fullApi = setApi({ ...apiRegistration, - uuid, - phase$, - parentApi, unsavedChanges, - type: factory.type, resetUnsavedChanges, snapshotRuntimeState, - } as unknown as Api; - cleanupFunction.current = () => { - subscriptions.unsubscribe(); - cleanup(); - }; - onApiAvailable?.(fullApi); + } as unknown as SetReactEmbeddableApiRegistration); + + cleanupFunction.current = () => cleanup(); return fullApi; }; @@ -153,7 +165,8 @@ export const ReactEmbeddableRenderer = < initialState, buildApi, uuid, - parentApi + parentApi, + setApi ); if (apiPublishesDataLoading(api)) { diff --git a/src/plugins/embeddable/public/react_embeddable_system/types.ts b/src/plugins/embeddable/public/react_embeddable_system/types.ts index 64514ac854b526..8a05698934e9cb 100644 --- a/src/plugins/embeddable/public/react_embeddable_system/types.ts +++ b/src/plugins/embeddable/public/react_embeddable_system/types.ts @@ -36,21 +36,24 @@ export interface DefaultEmbeddableApi< HasSnapshottableState {} /** - * A subset of the default embeddable API used in registration to allow implementors to omit aspects - * of the API that will be automatically added by the system. + * Defines the subset of the default embeddable API that the `setApi` method uses, which allows implementors + * to omit aspects of the API that will be automatically added by `setApi`. */ -export type ReactEmbeddableApiRegistration< +export type SetReactEmbeddableApiRegistration< + SerializedState extends object = object, + Api extends DefaultEmbeddableApi = DefaultEmbeddableApi +> = Omit; + +/** + * Defines the subset of the default embeddable API that the `buildApi` method uses, which allows implementors + * to omit aspects of the API that will be automatically added by `buildApi`. + */ +export type BuildReactEmbeddableApiRegistration< SerializedState extends object = object, Api extends DefaultEmbeddableApi = DefaultEmbeddableApi > = Omit< - Api, - | 'uuid' - | 'parent' - | 'type' - | 'unsavedChanges' - | 'resetUnsavedChanges' - | 'snapshotRuntimeState' - | 'phase$' + SetReactEmbeddableApiRegistration, + 'unsavedChanges' | 'resetUnsavedChanges' | 'snapshotRuntimeState' >; /** @@ -93,11 +96,17 @@ export interface ReactEmbeddableFactory< */ buildEmbeddable: ( initialState: RuntimeState, + /** + * `buildApi` should be used by most embeddables that are used in dashboards, since it implements the unsaved + * changes logic that the dashboard expects using the provided comparators + */ buildApi: ( - apiRegistration: ReactEmbeddableApiRegistration, + apiRegistration: BuildReactEmbeddableApiRegistration, comparators: StateComparators ) => Api, uuid: string, - parentApi?: unknown + parentApi: unknown | undefined, + /** `setApi` should be used when the unsaved changes logic in `buildApi` is unnecessary */ + setApi: (api: SetReactEmbeddableApiRegistration) => Api ) => Promise<{ Component: React.FC<{}>; api: Api }>; } diff --git a/src/plugins/esql_datagrid/.i18nrc.json b/src/plugins/esql_datagrid/.i18nrc.json new file mode 100755 index 00000000000000..b56ac6e79d88ce --- /dev/null +++ b/src/plugins/esql_datagrid/.i18nrc.json @@ -0,0 +1,6 @@ +{ + "prefix": "esqlDataGrid", + "paths": { + "esqlDataGrid": "." + } +} diff --git a/src/plugins/esql_datagrid/README.md b/src/plugins/esql_datagrid/README.md new file mode 100644 index 00000000000000..89848b34b5f4db --- /dev/null +++ b/src/plugins/esql_datagrid/README.md @@ -0,0 +1,47 @@ +# @kbn/esql-datagrid + +Contains a Discover-like table specifically for ES|QL queries: + - You have to run the esql query on your application, this is just a UI component + - You pass the columns and rows of the _query response to the table + - The table operates in both Document view and table view mode, define this with the `isTableView` property + - The table offers a built in Row Viewer flyout + - The table offers a rows comparison mode, exactly as Discover + +--- + +### Properties + * rows: ESQLRow[], is the array of values returned by the _query api + * columns: DatatableColumn[], is the array of columns in a kibana compatible format. You can sue the `formatESQLColumns` helper function from the `@kbn/esql-utils` package + * query: AggregateQuery, the ES|QL query in the format of + ```json + { + esql: + } + ``` + * flyoutType?: "overlay" | "push", defines the type of flyout for the Row Viewer + * isTableView?: boolean, defines if the table will render as a Document Viewer or a Table View + + +### How to use it +```tsx +import { getIndexPatternFromESQLQuery, getESQLAdHocDataview, formatESQLColumns } from '@kbn/esql-utils'; +import { ESQLDataGrid } from '@kbn/esql-datagrid/public'; + +/** + Run the _query api to get the datatable with the ES|QL query you want. + This will return a response with columns and values +**/ + +const indexPattern = getIndexPatternFromESQLQuery(query); +const adHocDataView = getESQLAdHocDataview(indexPattern, dataViewService); +const formattedColumns = formatESQLColumns(columns); + + +``` diff --git a/src/plugins/esql_datagrid/jest.config.js b/src/plugins/esql_datagrid/jest.config.js new file mode 100644 index 00000000000000..6def95236d27c1 --- /dev/null +++ b/src/plugins/esql_datagrid/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/src/plugins/esql_datagrid'], + coverageDirectory: '/target/kibana-coverage/jest/src/plugins/esql_datagrid', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/src/plugins/esql_datagrid/{common,public,server}/**/*.{js,ts,tsx}', + ], + setupFiles: ['jest-canvas-mock'], +}; diff --git a/src/plugins/esql_datagrid/kibana.jsonc b/src/plugins/esql_datagrid/kibana.jsonc new file mode 100644 index 00000000000000..ed589432578f38 --- /dev/null +++ b/src/plugins/esql_datagrid/kibana.jsonc @@ -0,0 +1,21 @@ +{ + "type": "plugin", + "id": "@kbn/esql-datagrid", + "owner": "@elastic/kibana-esql", + "plugin": { + "id": "esqlDataGrid", + "server": false, + "browser": true, + "requiredPlugins": [ + "data", + "uiActions", + "fieldFormats" + ], + "requiredBundles": [ + "kibanaReact", + "kibanaUtils", + "dataViews", + "unifiedDocViewer" + ] + } +} diff --git a/src/plugins/esql_datagrid/package.json b/src/plugins/esql_datagrid/package.json new file mode 100644 index 00000000000000..3c5482db0f13f6 --- /dev/null +++ b/src/plugins/esql_datagrid/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/esql-datagrid", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/src/plugins/esql_datagrid/public/create_datagrid.tsx b/src/plugins/esql_datagrid/public/create_datagrid.tsx new file mode 100644 index 00000000000000..6e218fac2bde46 --- /dev/null +++ b/src/plugins/esql_datagrid/public/create_datagrid.tsx @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import React, { lazy } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import type { ESQLRow } from '@kbn/es-types'; +import type { AggregateQuery } from '@kbn/es-query'; +import { withSuspense } from '@kbn/shared-ux-utility'; +import useAsync from 'react-use/lib/useAsync'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; +import { CellActionsProvider } from '@kbn/cell-actions'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { untilPluginStartServicesReady } from './kibana_services'; + +interface ESQLDataGridProps { + rows: ESQLRow[]; + dataView: DataView; + columns: DatatableColumn[]; + query: AggregateQuery; + flyoutType?: 'overlay' | 'push'; + isTableView?: boolean; + initialColumns?: DatatableColumn[]; +} + +const DataGridLazy = withSuspense(lazy(() => import('./data_grid'))); + +export const ESQLDataGrid = (props: ESQLDataGridProps) => { + const { loading, value } = useAsync(() => { + const startServicesPromise = untilPluginStartServicesReady(); + return Promise.all([startServicesPromise]); + }, []); + + const deps = value?.[0]; + if (loading || !deps) return ; + + return ( + + +
    + +
    +
    +
    + ); +}; diff --git a/src/plugins/esql_datagrid/public/data_grid.tsx b/src/plugins/esql_datagrid/public/data_grid.tsx new file mode 100644 index 00000000000000..c9e507295b9f3a --- /dev/null +++ b/src/plugins/esql_datagrid/public/data_grid.tsx @@ -0,0 +1,157 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useState, useCallback, useMemo } from 'react'; +import { zipObject } from 'lodash'; +import { UnifiedDataTable, DataLoadingState, type SortOrder } from '@kbn/unified-data-table'; +import { Storage } from '@kbn/kibana-utils-plugin/public'; +import type { ESQLRow } from '@kbn/es-types'; +import type { DatatableColumn, DatatableColumnMeta } from '@kbn/expressions-plugin/common'; +import type { AggregateQuery } from '@kbn/es-query'; +import type { DataTableRecord } from '@kbn/discover-utils/types'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { CoreStart } from '@kbn/core/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { RowViewer } from './row_viewer_lazy'; + +interface ESQLDataGridProps { + core: CoreStart; + data: DataPublicPluginStart; + fieldFormats: FieldFormatsStart; + rows: ESQLRow[]; + dataView: DataView; + columns: DatatableColumn[]; + query: AggregateQuery; + flyoutType?: 'overlay' | 'push'; + isTableView?: boolean; + initialColumns?: DatatableColumn[]; +} +type DataTableColumnsMeta = Record< + string, + { + type: DatatableColumnMeta['type']; + esType?: DatatableColumnMeta['esType']; + } +>; + +const sortOrder: SortOrder[] = []; + +const DataGrid: React.FC = (props) => { + const [expandedDoc, setExpandedDoc] = useState(undefined); + const [activeColumns, setActiveColumns] = useState( + (props.initialColumns || (props.isTableView ? props.columns : [])).map((c) => c.name) + ); + const [rowHeight, setRowHeight] = useState(5); + + const onSetColumns = useCallback((columns) => { + setActiveColumns(columns); + }, []); + + const renderDocumentView = useCallback( + ( + hit: DataTableRecord, + displayedRows: DataTableRecord[], + displayedColumns: string[], + customColumnsMeta?: DataTableColumnsMeta + ) => ( + { + setActiveColumns(activeColumns.filter((c) => c !== column)); + }} + onAddColumn={(column) => { + setActiveColumns([...activeColumns, column]); + }} + onClose={() => setExpandedDoc(undefined)} + setExpandedDoc={setExpandedDoc} + /> + ), + [activeColumns, props.core.notifications, props.dataView, props.flyoutType] + ); + + const columnsMeta = useMemo(() => { + return props.columns.reduce((acc, column) => { + acc[column.id] = { + type: column.meta?.type, + esType: column.meta?.esType ?? column.meta?.type, + }; + return acc; + }, {} as DataTableColumnsMeta); + }, [props.columns]); + + const rows: DataTableRecord[] = useMemo(() => { + const columnNames = props.columns?.map(({ name }) => name); + return props.rows + .map((row) => zipObject(columnNames, row)) + .map((row, idx: number) => { + return { + id: String(idx), + raw: row, + flattened: row, + } as unknown as DataTableRecord; + }); + }, [props.columns, props.rows]); + + const services = useMemo(() => { + const storage = new Storage(localStorage); + + return { + data: props.data, + theme: props.core.theme, + uiSettings: props.core.uiSettings, + toastNotifications: props.core.notifications.toasts, + fieldFormats: props.fieldFormats, + storage, + }; + }, [ + props.core.notifications.toasts, + props.core.theme, + props.core.uiSettings, + props.data, + props.fieldFormats, + ]); + + return ( + + ); +}; + +// eslint-disable-next-line import/no-default-export +export default DataGrid; diff --git a/src/plugins/esql_datagrid/public/index.ts b/src/plugins/esql_datagrid/public/index.ts new file mode 100644 index 00000000000000..14a92068f02cc8 --- /dev/null +++ b/src/plugins/esql_datagrid/public/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ESQLDataGridPlugin } from './plugin'; +export { ESQLDataGrid } from './create_datagrid'; + +export function plugin() { + return new ESQLDataGridPlugin(); +} diff --git a/src/plugins/esql_datagrid/public/kibana_services.ts b/src/plugins/esql_datagrid/public/kibana_services.ts new file mode 100644 index 00000000000000..df52136ce021b0 --- /dev/null +++ b/src/plugins/esql_datagrid/public/kibana_services.ts @@ -0,0 +1,50 @@ +/* + * Copyright 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 { BehaviorSubject } from 'rxjs'; +import type { CoreStart } from '@kbn/core/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; + +export let core: CoreStart; + +interface ServiceDeps { + core: CoreStart; + data: DataPublicPluginStart; + uiActions: UiActionsStart; + fieldFormats: FieldFormatsStart; +} + +const servicesReady$ = new BehaviorSubject(undefined); +export const untilPluginStartServicesReady = () => { + if (servicesReady$.value) return Promise.resolve(servicesReady$.value); + return new Promise((resolve) => { + const subscription = servicesReady$.subscribe((deps) => { + if (deps) { + subscription.unsubscribe(); + resolve(deps); + } + }); + }); +}; + +export const setKibanaServices = ( + kibanaCore: CoreStart, + data: DataPublicPluginStart, + uiActions: UiActionsStart, + fieldFormats: FieldFormatsStart +) => { + core = kibanaCore; + servicesReady$.next({ + core, + data, + uiActions, + fieldFormats, + }); +}; diff --git a/src/plugins/esql_datagrid/public/plugin.ts b/src/plugins/esql_datagrid/public/plugin.ts new file mode 100755 index 00000000000000..662d23c5190b80 --- /dev/null +++ b/src/plugins/esql_datagrid/public/plugin.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { Plugin, CoreStart, CoreSetup } from '@kbn/core/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import { setKibanaServices } from './kibana_services'; + +interface ESQLDataGridPluginStart { + data: DataPublicPluginStart; + uiActions: UiActionsStart; + fieldFormats: FieldFormatsStart; +} +export class ESQLDataGridPlugin implements Plugin<{}, void> { + public setup(_: CoreSetup, {}: {}) { + return {}; + } + + public start(core: CoreStart, { data, uiActions, fieldFormats }: ESQLDataGridPluginStart): void { + setKibanaServices(core, data, uiActions, fieldFormats); + } + + public stop() {} +} diff --git a/src/plugins/esql_datagrid/public/row_viewer.test.tsx b/src/plugins/esql_datagrid/public/row_viewer.test.tsx new file mode 100644 index 00000000000000..712e23953fae9d --- /dev/null +++ b/src/plugins/esql_datagrid/public/row_viewer.test.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import React from 'react'; +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import type { CoreStart } from '@kbn/core/public'; +import type { DataTableRecord } from '@kbn/discover-utils/types'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import { setUnifiedDocViewerServices } from '@kbn/unified-doc-viewer-plugin/public/plugin'; +import { mockUnifiedDocViewerServices } from '@kbn/unified-doc-viewer-plugin/public/__mocks__'; +import { RowViewer } from './row_viewer'; + +describe('RowViewer', () => { + function renderComponent(closeFlyoutSpy?: jest.Mock, extraHit?: DataTableRecord) { + const dataView = { + title: 'foo', + id: 'foo', + name: 'foo', + toSpec: jest.fn(), + toMinimalSpec: jest.fn(), + isPersisted: jest.fn().mockReturnValue(false), + fields: { + getByName: jest.fn(), + }, + timeFieldName: 'timestamp', + }; + const columns = ['bytes', 'destination']; + const hit = { + flattened: { + bytes: 123, + destination: 'Amsterdam', + }, + id: '1', + raw: { + bytes: 123, + destination: 'Amsterdam', + }, + } as unknown as DataTableRecord; + + const hits = [hit]; + if (extraHit) { + hits.push(extraHit); + } + const services = { + toastNotifications: { + addSuccess: jest.fn(), + }, + }; + + setUnifiedDocViewerServices(mockUnifiedDocViewerServices); + + render( + + + + ); + } + + it('should render a flyout', async () => { + renderComponent(); + await waitFor(() => expect(screen.getByTestId('esqlRowDetailsFlyout')).toBeInTheDocument()); + }); + + it('should run the onClose prop when the close button is clicked', async () => { + const closeFlyoutSpy = jest.fn(); + renderComponent(closeFlyoutSpy); + await waitFor(() => { + userEvent.click(screen.getByTestId('esqlRowDetailsFlyoutCloseBtn')); + expect(closeFlyoutSpy).toHaveBeenCalled(); + }); + }); + + it('displays row navigation when there is more than 1 row available', async () => { + renderComponent(undefined, { + flattened: { + bytes: 456, + destination: 'Athens', + }, + id: '3', + raw: { + bytes: 456, + destination: 'Athens', + }, + } as unknown as DataTableRecord); + await waitFor(() => { + expect(screen.getByTestId('esqlTableRowNavigation')).toBeInTheDocument(); + }); + }); + + it('doesnt display row navigation when there is only 1 row available', async () => { + renderComponent(); + await waitFor(() => { + expect(screen.queryByTestId('esqlTableRowNavigation')).not.toBeInTheDocument(); + }); + }); +}); diff --git a/src/plugins/esql_datagrid/public/row_viewer.tsx b/src/plugins/esql_datagrid/public/row_viewer.tsx new file mode 100644 index 00000000000000..35c2b807fbbb3f --- /dev/null +++ b/src/plugins/esql_datagrid/public/row_viewer.tsx @@ -0,0 +1,235 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { useMemo, useCallback } from 'react'; +import { get } from 'lodash'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutResizable, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiTitle, + EuiPortal, + EuiPagination, + keys, + EuiButtonEmpty, + useEuiTheme, + useIsWithinMinBreakpoint, +} from '@elastic/eui'; +import type { DataTableRecord } from '@kbn/discover-utils/types'; +import type { DataTableColumnsMeta } from '@kbn/unified-data-table'; +import { UnifiedDocViewer } from '@kbn/unified-doc-viewer-plugin/public'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; +import { NotificationsStart } from '@kbn/core-notifications-browser'; + +export interface RowViewerProps { + toastNotifications?: NotificationsStart; + columns: string[]; + columnsMeta?: DataTableColumnsMeta; + hit: DataTableRecord; + hits?: DataTableRecord[]; + flyoutType?: 'push' | 'overlay'; + dataView: DataView; + onAddColumn: (column: string) => void; + onClose: () => void; + onRemoveColumn: (column: string) => void; + setExpandedDoc: (doc?: DataTableRecord) => void; +} + +function getIndexByDocId(hits: DataTableRecord[], id: string) { + return hits.findIndex((h) => { + return h.id === id; + }); +} + +export const FLYOUT_WIDTH_KEY = 'esqlTable:flyoutWidth'; +/** + * Flyout displaying an expanded ES|QL row + */ +export function RowViewer({ + hit, + hits, + dataView, + columns, + columnsMeta, + toastNotifications, + flyoutType = 'push', + onClose, + onRemoveColumn, + onAddColumn, + setExpandedDoc, +}: RowViewerProps) { + const { euiTheme } = useEuiTheme(); + + const isXlScreen = useIsWithinMinBreakpoint('xl'); + const DEFAULT_WIDTH = euiTheme.base * 34; + const defaultWidth = DEFAULT_WIDTH; + const [flyoutWidth, setFlyoutWidth] = useLocalStorage(FLYOUT_WIDTH_KEY, defaultWidth); + const minWidth = euiTheme.base * 24; + const maxWidth = euiTheme.breakpoint.xl; + + const actualHit = useMemo(() => hits?.find(({ id }) => id === hit?.id) || hit, [hit, hits]); + const pageCount = useMemo(() => (hits ? hits.length : 0), [hits]); + const activePage = useMemo(() => { + const id = hit.id; + if (!hits || pageCount <= 1) { + return -1; + } + + return getIndexByDocId(hits, id); + }, [hits, hit, pageCount]); + + const setPage = useCallback( + (index: number) => { + if (hits && hits[index]) { + setExpandedDoc(hits[index]); + } + }, + [hits, setExpandedDoc] + ); + + const onKeyDown = useCallback( + (ev: React.KeyboardEvent) => { + const nodeName = get(ev, 'target.nodeName', null); + if (typeof nodeName === 'string' && nodeName.toLowerCase() === 'input') { + return; + } + if (ev.key === keys.ARROW_LEFT || ev.key === keys.ARROW_RIGHT) { + ev.preventDefault(); + ev.stopPropagation(); + setPage(activePage + (ev.key === keys.ARROW_RIGHT ? 1 : -1)); + } + }, + [activePage, setPage] + ); + + const addColumn = useCallback( + (columnName: string) => { + onAddColumn(columnName); + toastNotifications?.toasts?.addSuccess?.( + i18n.translate('esqlDataGrid.grid.flyout.toastColumnAdded', { + defaultMessage: `Column '{columnName}' was added`, + values: { columnName }, + }) + ); + }, + [onAddColumn, toastNotifications] + ); + + const removeColumn = useCallback( + (columnName: string) => { + onRemoveColumn(columnName); + toastNotifications?.toasts?.addSuccess?.( + i18n.translate('esqlDataGrid.grid.flyout.toastColumnRemoved', { + defaultMessage: `Column '{columnName}' was removed`, + values: { columnName }, + }) + ); + }, + [onRemoveColumn, toastNotifications] + ); + + const renderDefaultContent = useCallback( + () => ( + + ), + [actualHit, addColumn, columns, columnsMeta, dataView, hits, removeColumn] + ); + + const bodyContent = renderDefaultContent(); + + return ( + + + + + + +

    + {i18n.translate('esqlDataGrid.grid.tableRow.docViewerEsqlDetailHeading', { + defaultMessage: 'Result', + })} +

    +
    +
    + {activePage !== -1 && ( + + + + )} +
    +
    + {bodyContent} + + + {i18n.translate('esqlDataGrid.grid.flyout.close', { + defaultMessage: 'Close', + })} + + +
    +
    + ); +} + +// eslint-disable-next-line import/no-default-export +export default RowViewer; diff --git a/src/plugins/esql_datagrid/public/row_viewer_lazy.tsx b/src/plugins/esql_datagrid/public/row_viewer_lazy.tsx new file mode 100644 index 00000000000000..a4fea13dffab22 --- /dev/null +++ b/src/plugins/esql_datagrid/public/row_viewer_lazy.tsx @@ -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. + */ + +import { withSuspense } from '@kbn/shared-ux-utility'; +import { lazy } from 'react'; +export type { RowViewerProps } from './row_viewer'; + +export const RowViewer = withSuspense(lazy(() => import('./row_viewer'))); diff --git a/src/plugins/esql_datagrid/tsconfig.json b/src/plugins/esql_datagrid/tsconfig.json new file mode 100644 index 00000000000000..5db30eb35fd20d --- /dev/null +++ b/src/plugins/esql_datagrid/tsconfig.json @@ -0,0 +1,33 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": [ + "../../typings/**/*", + "common/**/*", + "public/**/*", + ], + "kbn_references": [ + "@kbn/data-plugin", + "@kbn/es-types", + "@kbn/es-query", + "@kbn/discover-utils", + "@kbn/data-views-plugin", + "@kbn/expressions-plugin", + "@kbn/cell-actions", + "@kbn/unified-data-table", + "@kbn/kibana-utils-plugin", + "@kbn/kibana-react-plugin", + "@kbn/core", + "@kbn/ui-actions-plugin", + "@kbn/field-formats-plugin", + "@kbn/i18n", + "@kbn/unified-doc-viewer-plugin", + "@kbn/core-notifications-browser", + "@kbn/shared-ux-utility" + ], + "exclude": [ + "target/**/*", + ] +} diff --git a/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts index 1fbea1ddf58a16..c1ada0fd8d4cbd 100644 --- a/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/heartbeat_instructions.ts @@ -71,7 +71,7 @@ export const createHeartbeatInstructions = (context: TutorialContext) => { 'sudo rpm -vi heartbeat-{config.kibana.version}-x86_64.rpm', ], textPost: i18n.translate( - 'home.tutorials.common.heartbeatInstructions.install.debTextPost', + 'home.tutorials.common.heartbeatInstructions.install.rpmTextPost', { defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', values: { link: 'https://www.elastic.co/downloads/beats/heartbeat' }, diff --git a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts index fc83af90621009..859015613e6582 100644 --- a/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/metricbeat_instructions.ts @@ -82,7 +82,7 @@ export const createMetricbeatInstructions = memoize( 'sudo rpm -vi metricbeat-{config.kibana.version}-x86_64.rpm', ], textPost: i18n.translate( - 'home.tutorials.common.metricbeatInstructions.install.debTextPost', + 'home.tutorials.common.metricbeatInstructions.install.rpmTextPost', { defaultMessage: 'Looking for the 32-bit packages? See the [Download page]({link}).', values: { link: 'https://www.elastic.co/downloads/beats/metricbeat' }, diff --git a/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx b/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx index 7cb462a5f1de7d..7416c8e9eee214 100644 --- a/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx +++ b/src/plugins/presentation_util/public/components/floating_actions/floating_actions.tsx @@ -7,14 +7,15 @@ */ import classNames from 'classnames'; import React, { FC, ReactElement, useEffect, useState } from 'react'; +import { v4 } from 'uuid'; import { panelHoverTrigger, PANEL_HOVER_TRIGGER, type EmbeddableInput, - type IEmbeddable, type ViewMode, } from '@kbn/embeddable-plugin/public'; +import { apiHasUniqueId } from '@kbn/presentation-publishing'; import { Action } from '@kbn/ui-actions-plugin/public'; import { pluginServices } from '../../services'; @@ -25,7 +26,7 @@ export interface FloatingActionsProps { className?: string; isEnabled?: boolean; - embeddable?: IEmbeddable; + api?: unknown; viewMode?: ViewMode; disabledActions?: EmbeddableInput['disabledActions']; } @@ -34,7 +35,7 @@ export const FloatingActions: FC = ({ children, viewMode, isEnabled, - embeddable, + api, className = '', disabledActions, }) => { @@ -44,12 +45,12 @@ export const FloatingActions: FC = ({ const [floatingActions, setFloatingActions] = useState(undefined); useEffect(() => { - if (!embeddable) return; + if (!api) return; const getActions = async () => { let mounted = true; const context = { - embeddable, + embeddable: api, trigger: panelHoverTrigger, }; const actions = (await getTriggerCompatibleActions(PANEL_HOVER_TRIGGER, context)) @@ -79,14 +80,16 @@ export const FloatingActions: FC = ({ }; getActions(); - }, [embeddable, getTriggerCompatibleActions, viewMode, disabledActions]); + }, [api, getTriggerCompatibleActions, viewMode, disabledActions]); return (
    {children} {isEnabled && floatingActions && (
    {floatingActions} diff --git a/src/plugins/presentation_util/tsconfig.json b/src/plugins/presentation_util/tsconfig.json index dc386db112c166..dea02739d9db97 100644 --- a/src/plugins/presentation_util/tsconfig.json +++ b/src/plugins/presentation_util/tsconfig.json @@ -35,6 +35,7 @@ "@kbn/code-editor", "@kbn/calculate-width-from-char-count", "@kbn/field-utils", + "@kbn/presentation-publishing", ], "exclude": ["target/**/*"] } diff --git a/src/plugins/share/public/components/context/index.tsx b/src/plugins/share/public/components/context/index.tsx index 1426bd42c805a2..46cdea37f002f6 100644 --- a/src/plugins/share/public/components/context/index.tsx +++ b/src/plugins/share/public/components/context/index.tsx @@ -31,6 +31,7 @@ export interface IShareContext extends ShareContext { isEmbedded: boolean; theme: ThemeServiceSetup; i18n: I18nStart; + publicAPIEnabled?: boolean; anchorElement?: HTMLElement; } diff --git a/src/plugins/share/public/components/tabs/export/export_content.tsx b/src/plugins/share/public/components/tabs/export/export_content.tsx index b979a61c5398ca..b1106b7df77742 100644 --- a/src/plugins/share/public/components/tabs/export/export_content.tsx +++ b/src/plugins/share/public/components/tabs/export/export_content.tsx @@ -33,9 +33,16 @@ type ExportProps = Pick { +const ExportContentUi = ({ + isDirty, + aggregateReportTypes, + intl, + onClose, + publicAPIEnabled, +}: ExportProps) => { const [isCreatingExport, setIsCreatingExport] = useState(false); const [usePrintLayout, setPrintLayout] = useState(false); @@ -116,7 +123,7 @@ const ExportContentUi = ({ isDirty, aggregateReportTypes, intl, onClose }: Expor }, [usePrintLayout, renderLayoutOptionSwitch, handlePrintLayoutChange]); const showCopyURLButton = useCallback(() => { - if (renderCopyURLButton) + if (renderCopyURLButton && publicAPIEnabled) return ( @@ -151,7 +158,7 @@ const ExportContentUi = ({ isDirty, aggregateReportTypes, intl, onClose }: Expor ); - }, [absoluteUrl, renderCopyURLButton]); + }, [absoluteUrl, renderCopyURLButton, publicAPIEnabled]); const renderGenerateReportButton = useCallback(() => { return ( @@ -185,6 +192,28 @@ const ExportContentUi = ({ isDirty, aggregateReportTypes, intl, onClose }: Expor } }; + const renderHelpText = () => { + const showHelpText = publicAPIEnabled && isDirty; + return ( + showHelpText && ( + <> + + + } + > + + + + ) + ); + }; + return ( <> @@ -192,22 +221,7 @@ const ExportContentUi = ({ isDirty, aggregateReportTypes, intl, onClose }: Expor <>{helpText} <>{renderRadioOptions()} - {isDirty && ( - <> - - - } - > - - - - )} + {renderHelpText()} diff --git a/src/plugins/share/public/components/tabs/export/index.tsx b/src/plugins/share/public/components/tabs/export/index.tsx index 28066ee3d65c6e..68a329c0a54a55 100644 --- a/src/plugins/share/public/components/tabs/export/index.tsx +++ b/src/plugins/share/public/components/tabs/export/index.tsx @@ -15,7 +15,7 @@ import { useShareTabsContext, type ShareMenuItemV2 } from '../../context'; type IExportTab = IModalTabDeclaration; const ExportTabContent = () => { - const { shareMenuItems, objectType, isDirty, onClose } = useShareTabsContext()!; + const { shareMenuItems, objectType, isDirty, onClose, publicAPIEnabled } = useShareTabsContext()!; return ( { onClose={onClose} // we are guaranteed that shareMenuItems will be a ShareMenuItem V2 variant aggregateReportTypes={shareMenuItems as unknown as ShareMenuItemV2[]} + publicAPIEnabled={publicAPIEnabled ?? true} /> ); }; diff --git a/src/plugins/share/public/services/share_menu_manager.tsx b/src/plugins/share/public/services/share_menu_manager.tsx index 1bec2d9f6416e5..0f58e875cfcd5b 100644 --- a/src/plugins/share/public/services/share_menu_manager.tsx +++ b/src/plugins/share/public/services/share_menu_manager.tsx @@ -52,6 +52,7 @@ export class ShareMenuManager { overlays: core.overlays, i18n: core.i18n, toasts: core.notifications.toasts, + publicAPIEnabled: !disableEmbed, }); }, }; @@ -86,6 +87,7 @@ export class ShareMenuManager { isDirty, toasts, delegatedShareUrlHandler, + publicAPIEnabled, }: ShowShareMenuOptions & { anchorElement: HTMLElement; menuItems: ShareMenuItem[]; @@ -111,6 +113,7 @@ export class ShareMenuManager { toMountPoint( { embedUrlParamExtensions?: UrlParamExtension[]; snapshotShareWarning?: string; onClose?: () => void; + publicAPIEnabled?: boolean; } export interface ClientConfigType { diff --git a/src/plugins/share/server/url_service/http/short_urls/register_create_route.ts b/src/plugins/share/server/url_service/http/short_urls/register_create_route.ts index 0848fdfbfe6051..3b8667d92cfb2e 100644 --- a/src/plugins/share/server/url_service/http/short_urls/register_create_route.ts +++ b/src/plugins/share/server/url_service/http/short_urls/register_create_route.ts @@ -17,7 +17,7 @@ export const registerCreateRoute = (router: IRouter, url: ServerUrlService) => { path: '/api/short_url', options: { access: 'public', - description: `Create a short URL`, + summary: `Create a short URL`, }, validate: { body: schema.object({ diff --git a/src/plugins/share/server/url_service/http/short_urls/register_delete_route.ts b/src/plugins/share/server/url_service/http/short_urls/register_delete_route.ts index 258faff0d04a68..2df23f190c2d7f 100644 --- a/src/plugins/share/server/url_service/http/short_urls/register_delete_route.ts +++ b/src/plugins/share/server/url_service/http/short_urls/register_delete_route.ts @@ -16,7 +16,7 @@ export const registerDeleteRoute = (router: IRouter, url: ServerUrlService) => { path: '/api/short_url/{id}', options: { access: 'public', - description: `Delete a short URL`, + summary: `Delete a short URL`, }, validate: { params: schema.object({ diff --git a/src/plugins/share/server/url_service/http/short_urls/register_get_route.ts b/src/plugins/share/server/url_service/http/short_urls/register_get_route.ts index ae108ccd11d973..8c7df947d46627 100644 --- a/src/plugins/share/server/url_service/http/short_urls/register_get_route.ts +++ b/src/plugins/share/server/url_service/http/short_urls/register_get_route.ts @@ -16,7 +16,7 @@ export const registerGetRoute = (router: IRouter, url: ServerUrlService) => { path: '/api/short_url/{id}', options: { access: 'public', - description: `Get a short URL`, + summary: `Get a short URL`, }, validate: { params: schema.object({ diff --git a/src/plugins/share/server/url_service/http/short_urls/register_resolve_route.ts b/src/plugins/share/server/url_service/http/short_urls/register_resolve_route.ts index 6076889945f366..e37f2c818dca8e 100644 --- a/src/plugins/share/server/url_service/http/short_urls/register_resolve_route.ts +++ b/src/plugins/share/server/url_service/http/short_urls/register_resolve_route.ts @@ -17,7 +17,7 @@ export const registerResolveRoute = (router: IRouter, url: ServerUrlService) => path: '/api/short_url/_slug/{slug}', options: { access: 'public', - description: `Resolve a short URL`, + summary: `Resolve a short URL`, }, validate: { params: schema.object({ diff --git a/test/functional/apps/dashboard/group1/create_and_add_embeddables.ts b/test/functional/apps/dashboard/group1/create_and_add_embeddables.ts index 9531606e649f31..1219fb03fd1c26 100644 --- a/test/functional/apps/dashboard/group1/create_and_add_embeddables.ts +++ b/test/functional/apps/dashboard/group1/create_and_add_embeddables.ts @@ -34,7 +34,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.switchToEditMode(); await dashboardAddPanel.clickEditorMenuButton(); - await dashboardAddPanel.clickAddNewEmbeddableLink('LOG_STREAM_EMBEDDABLE'); + await dashboardAddPanel.clickAddNewPanelFromUIActionLink('Log stream'); await dashboardAddPanel.expectEditorMenuClosed(); }); diff --git a/test/functional/apps/dashboard/group4/dashboard_clone.ts b/test/functional/apps/dashboard/group4/dashboard_clone.ts index 438f01061dda86..1e15f4d44e7405 100644 --- a/test/functional/apps/dashboard/group4/dashboard_clone.ts +++ b/test/functional/apps/dashboard/group4/dashboard_clone.ts @@ -42,5 +42,12 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(panelTitles).to.eql(PageObjects.dashboard.getTestVisualizationNames()); }); }); + + it('Clone should suggest a unique title', async function () { + await PageObjects.dashboard.loadSavedDashboard(clonedDashboardName); + await PageObjects.dashboard.duplicateDashboard(); + await PageObjects.dashboard.gotoDashboardLandingPage(); + await listingTable.searchAndExpectItemsCount('dashboard', `${dashboardName} (2)`, 1); + }); }); } diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index df4353beb569ca..7ccbc90d8760e5 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -256,6 +256,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.cloud.serverless.project_id (string)', 'xpack.cloud.serverless.project_name (string)', 'xpack.cloud.serverless.project_type (string)', + 'xpack.cloud.onboarding.default_solution (string)', 'xpack.discoverEnhanced.actions.exploreDataInChart.enabled (boolean)', 'xpack.discoverEnhanced.actions.exploreDataInContextMenu.enabled (boolean)', 'xpack.fleet.agents.enabled (boolean)', diff --git a/tsconfig.base.json b/tsconfig.base.json index 912a135068d882..31f05377e4d4c7 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -816,6 +816,8 @@ "@kbn/esql-ast/*": ["packages/kbn-esql-ast/*"], "@kbn/esql-ast-inspector-plugin": ["examples/esql_ast_inspector"], "@kbn/esql-ast-inspector-plugin/*": ["examples/esql_ast_inspector/*"], + "@kbn/esql-datagrid": ["src/plugins/esql_datagrid"], + "@kbn/esql-datagrid/*": ["src/plugins/esql_datagrid/*"], "@kbn/esql-utils": ["packages/kbn-esql-utils"], "@kbn/esql-utils/*": ["packages/kbn-esql-utils/*"], "@kbn/esql-validation-autocomplete": ["packages/kbn-esql-validation-autocomplete"], @@ -1004,6 +1006,8 @@ "@kbn/interactive-setup-test-endpoints-plugin/*": ["test/interactive_setup_api_integration/plugins/test_endpoints/*"], "@kbn/interpreter": ["packages/kbn-interpreter"], "@kbn/interpreter/*": ["packages/kbn-interpreter/*"], + "@kbn/investigate-plugin": ["x-pack/plugins/observability_solution/investigate"], + "@kbn/investigate-plugin/*": ["x-pack/plugins/observability_solution/investigate/*"], "@kbn/io-ts-utils": ["packages/kbn-io-ts-utils"], "@kbn/io-ts-utils/*": ["packages/kbn-io-ts-utils/*"], "@kbn/ipynb": ["packages/kbn-ipynb"], @@ -1776,6 +1780,8 @@ "@kbn/unified-search-plugin/*": ["src/plugins/unified_search/*"], "@kbn/unsaved-changes-badge": ["packages/kbn-unsaved-changes-badge"], "@kbn/unsaved-changes-badge/*": ["packages/kbn-unsaved-changes-badge/*"], + "@kbn/unsaved-changes-prompt": ["packages/kbn-unsaved-changes-prompt"], + "@kbn/unsaved-changes-prompt/*": ["packages/kbn-unsaved-changes-prompt/*"], "@kbn/upgrade-assistant-plugin": ["x-pack/plugins/upgrade_assistant"], "@kbn/upgrade-assistant-plugin/*": ["x-pack/plugins/upgrade_assistant/*"], "@kbn/uptime-plugin": ["x-pack/plugins/observability_solution/uptime"], diff --git a/versions.json b/versions.json index 30d89496af0393..b789d4463f9189 100644 --- a/versions.json +++ b/versions.json @@ -8,7 +8,7 @@ "currentMinor": true }, { - "version": "8.14.0", + "version": "8.14.1", "branch": "8.14", "currentMajor": true, "previousMinor": true diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 2de23279fac72b..8059502946861d 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -51,6 +51,7 @@ "xpack.logsShared": "plugins/observability_solution/logs_shared", "xpack.fleet": "plugins/fleet", "xpack.ingestPipelines": "plugins/ingest_pipelines", + "xpack.investigate": "plugins/observability_solution/investigate", "xpack.kubernetesSecurity": "plugins/kubernetes_security", "xpack.lens": "plugins/lens", "xpack.licenseApiGuard": "plugins/license_api_guard", diff --git a/x-pack/examples/triggers_actions_ui_example/public/application.tsx b/x-pack/examples/triggers_actions_ui_example/public/application.tsx index 6b1dfe98c22b24..b605a1245ab8de 100644 --- a/x-pack/examples/triggers_actions_ui_example/public/application.tsx +++ b/x-pack/examples/triggers_actions_ui_example/public/application.tsx @@ -39,6 +39,8 @@ import { AlertsTableSandbox } from './components/alerts_table_sandbox'; import { RulesSettingsLinkSandbox } from './components/rules_settings_link_sandbox'; import { RuleDefinitionSandbox } from './components/rule_form/rule_definition_sandbox'; +import { RuleActionsSandbox } from './components/rule_form/rule_actions_sandbox'; +import { RuleDetailsSandbox } from './components/rule_form/rule_details_sandbox'; export interface TriggersActionsUiExampleComponentParams { http: CoreStart['http']; @@ -174,6 +176,22 @@ const TriggersActionsUiExampleApp = ({ )} /> + ( + + + + )} + /> + ( + + + + )} + /> ); diff --git a/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_actions_sandbox.tsx b/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_actions_sandbox.tsx new file mode 100644 index 00000000000000..3114bad2a56bb0 --- /dev/null +++ b/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_actions_sandbox.tsx @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { RuleActions } from '@kbn/alerts-ui-shared/src/rule_form'; + +export const RuleActionsSandbox = () => { + return {}} />; +}; diff --git a/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_details_sandbox.tsx b/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_details_sandbox.tsx new file mode 100644 index 00000000000000..6c1b83d79f46ce --- /dev/null +++ b/x-pack/examples/triggers_actions_ui_example/public/components/rule_form/rule_details_sandbox.tsx @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useCallback } from 'react'; +import { RuleDetails } from '@kbn/alerts-ui-shared/src/rule_form'; +import { EuiCodeBlock, EuiTitle } from '@elastic/eui'; + +export const RuleDetailsSandbox = () => { + const [formValues, setFormValues] = useState({ + tags: [], + name: 'test-rule', + }); + + const onChange = useCallback((property: string, value: unknown) => { + setFormValues((prevFormValues) => ({ + ...prevFormValues, + [property]: value, + })); + }, []); + + return ( + <> +
    + +

    Form State

    +
    + {JSON.stringify(formValues, null, 2)} +
    + + + ); +}; diff --git a/x-pack/examples/triggers_actions_ui_example/public/components/sidebar.tsx b/x-pack/examples/triggers_actions_ui_example/public/components/sidebar.tsx index caaad858b4cc47..a6dd96190574bf 100644 --- a/x-pack/examples/triggers_actions_ui_example/public/components/sidebar.tsx +++ b/x-pack/examples/triggers_actions_ui_example/public/components/sidebar.tsx @@ -85,6 +85,16 @@ export const Sidebar = () => { name: 'Rule Definition', onClick: () => history.push('/rule_definition'), }, + { + id: 'rule-actions', + name: 'Rule Actions', + onClick: () => history.push('/rule_actions'), + }, + { + id: 'rule-details', + name: 'Rule Details', + onClick: () => history.push('/rule_details'), + }, ], }, ]} diff --git a/x-pack/packages/kbn-elastic-assistant/impl/mock/connectors.ts b/x-pack/packages/kbn-elastic-assistant/impl/mock/connectors.ts index 05b4e96d2b0da8..34dfeb98ce29db 100644 --- a/x-pack/packages/kbn-elastic-assistant/impl/mock/connectors.ts +++ b/x-pack/packages/kbn-elastic-assistant/impl/mock/connectors.ts @@ -29,6 +29,16 @@ export const mockActionTypes = [ isSystemActionType: true, supportedFeatureIds: ['generativeAI'], } as ActionType, + { + id: '.gemini', + name: 'Gemini', + enabled: true, + enabledInConfig: true, + enabledInLicense: true, + minimumLicenseRequired: 'basic', + isSystemActionType: true, + supportedFeatureIds: ['generativeAI'], + } as ActionType, ]; export const mockConnectors: AIConnector[] = [ diff --git a/x-pack/packages/kbn-entities-schema/src/schema/common.ts b/x-pack/packages/kbn-entities-schema/src/schema/common.ts index 6b4f0cc794c2be..b2df63e93d71a9 100644 --- a/x-pack/packages/kbn-entities-schema/src/schema/common.ts +++ b/x-pack/packages/kbn-entities-schema/src/schema/common.ts @@ -63,7 +63,8 @@ export const durationSchema = z const value = parseInt(parts[1], 10); const unit = parts[2] as 'm' | 's' | 'h' | 'd'; const duration = moment.duration(value, unit); - return { ...duration, toJSON: () => val }; + duration.toJSON = () => val; + return duration; }); export const percentileMetricSchema = z.object({ diff --git a/x-pack/packages/kbn-entities-schema/src/schema/entity.ts b/x-pack/packages/kbn-entities-schema/src/schema/entity.ts index cf4be826acf045..8e5c411c2489eb 100644 --- a/x-pack/packages/kbn-entities-schema/src/schema/entity.ts +++ b/x-pack/packages/kbn-entities-schema/src/schema/entity.ts @@ -8,15 +8,25 @@ import { z } from 'zod'; import { arrayOfStringsSchema } from './common'; -export const entitySchema = z.intersection( - z.object({ - entity: z.object({ - id: z.string(), - indexPatterns: arrayOfStringsSchema, - identityFields: arrayOfStringsSchema, - metric: z.record(z.string(), z.number()), - spaceId: z.string(), - }), +const entitySchema = z.object({ + entity: z.object({ + id: z.string(), + identityFields: arrayOfStringsSchema, + displayName: z.string(), + spaceId: z.string(), + metrics: z.record(z.string(), z.number()), }), +}); + +export const entitySummarySchema = z.intersection( + entitySchema.extend({ + lastSeenTimestamp: z.string(), + firstSeenTimestamp: z.string(), + }), + z.record(z.string(), z.string().or(z.number())) +); + +export const entityHistorySchema = z.intersection( + entitySchema.extend({ ['@timestamp']: z.string() }), z.record(z.string(), z.string().or(z.number())) ); diff --git a/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts b/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts index fa5ea596b62146..3ccc9a1ba2eea7 100644 --- a/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts +++ b/x-pack/packages/kbn-entities-schema/src/schema/entity_definition.ts @@ -24,18 +24,34 @@ export const entityDefinitionSchema = z.object({ filter: filterSchema, indexPatterns: arrayOfStringsSchema, identityFields: z.array(identityFieldsSchema), - identityTemplate: z.string(), + displayNameTemplate: z.string(), metadata: z.optional(z.array(metadataSchema)), metrics: z.optional(z.array(keyMetricSchema)), staticFields: z.optional(z.record(z.string(), z.string())), - lookback: durationSchema, - timestampField: z.string(), managed: z.optional(z.boolean()).default(false), - settings: z.optional( + history: z.object({ + timestampField: z.string(), + interval: durationSchema.refine((val) => val.asMinutes() >= 1, { + message: 'The history.interval can not be less than 1m', + }), + lookbackPeriod: z.optional(durationSchema), + settings: z.optional( + z.object({ + syncField: z.optional(z.string()), + syncDelay: z.optional(z.string()), + frequency: z.optional(z.string()), + }) + ), + }), + latest: z.optional( z.object({ - syncField: z.optional(z.string()), - syncDelay: z.optional(z.string()), - frequency: z.optional(z.string()), + settings: z.optional( + z.object({ + syncField: z.optional(z.string()), + syncDelay: z.optional(z.string()), + frequency: z.optional(z.string()), + }) + ), }) ), }); diff --git a/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts b/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts index f24f85e4f3ac45..6c3149c3c35e1e 100644 --- a/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts +++ b/x-pack/packages/kbn-slo-schema/src/schema/indicators.ts @@ -25,9 +25,9 @@ const filtersSchema = t.array( isMultiIndex: t.boolean, type: t.string, key: t.string, + field: t.string, params: t.any, value: t.string, - field: t.string, }), query: t.record(t.string, t.any), }) @@ -54,6 +54,7 @@ const apmTransactionDurationIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -71,6 +72,7 @@ const apmTransactionErrorRateIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -87,6 +89,7 @@ const kqlCustomIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -164,6 +167,7 @@ const timesliceMetricIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -205,6 +209,7 @@ const metricCustomIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -250,6 +255,7 @@ const histogramIndicatorSchema = t.type({ }), t.partial({ filter: querySchema, + dataViewId: t.string, }), ]), }); @@ -270,6 +276,7 @@ const syntheticsAvailabilityIndicatorSchema = t.type({ tags: t.array(syntheticsParamSchema), projects: t.array(syntheticsParamSchema), filter: querySchema, + dataViewId: t.string, }), ]), }); diff --git a/x-pack/packages/security/plugin_types_public/index.ts b/x-pack/packages/security/plugin_types_public/index.ts index 682e1641a4c4cb..0b326ce2ee664e 100644 --- a/x-pack/packages/security/plugin_types_public/index.ts +++ b/x-pack/packages/security/plugin_types_public/index.ts @@ -16,3 +16,4 @@ export type { UserProfileSuggestParams, UserProfileAPIClient, } from './src/user_profile'; +export type { RolePutPayload, RolesAPIClient } from './src/roles'; diff --git a/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts b/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts index 16fd10a57d6946..5ad462f8c2aa18 100644 --- a/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts +++ b/x-pack/packages/security/plugin_types_public/src/authorization/authorization_service.ts @@ -5,11 +5,18 @@ * 2.0. */ +import type { RolesAPIClient } from '../roles'; + export interface AuthorizationServiceSetup { /** * Determines if role management is enabled. */ isRoleManagementEnabled: () => boolean | undefined; + + /** + * A set of methods to work with Kibana user roles. + */ + roles: RolesAPIClient; } /** diff --git a/x-pack/packages/security/plugin_types_public/src/plugin.ts b/x-pack/packages/security/plugin_types_public/src/plugin.ts index 672be02cf38d49..06f3574388a363 100644 --- a/x-pack/packages/security/plugin_types_public/src/plugin.ts +++ b/x-pack/packages/security/plugin_types_public/src/plugin.ts @@ -14,6 +14,8 @@ import type { UserProfileAPIClient } from './user_profile'; export interface SecurityPluginSetup { /** * Exposes authentication information about the currently logged in user. + * + * @deprecated in favor of Core's `security` service */ authc: AuthenticationServiceSetup; /** @@ -33,6 +35,8 @@ export interface SecurityPluginStart { navControlService: SecurityNavControlServiceStart; /** * Exposes authentication information about the currently logged in user. + * + * @deprecated in favor of Core's `security` service */ authc: AuthenticationServiceStart; /** @@ -41,6 +45,8 @@ export interface SecurityPluginStart { authz: AuthorizationServiceStart; /** * A set of methods to work with Kibana user profiles. + * + * @deprecated in favor of Core's `userProfile` service. */ userProfiles: UserProfileAPIClient; } diff --git a/x-pack/packages/security/plugin_types_public/src/roles/index.ts b/x-pack/packages/security/plugin_types_public/src/roles/index.ts new file mode 100644 index 00000000000000..36a3e85fa87676 --- /dev/null +++ b/x-pack/packages/security/plugin_types_public/src/roles/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { RolePutPayload, RolesAPIClient } from './roles_api_client'; diff --git a/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts new file mode 100644 index 00000000000000..b5c45c5160fde7 --- /dev/null +++ b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { Role } from '@kbn/security-plugin-types-common'; + +export interface RolePutPayload { + role: Role; + createOnly?: boolean; +} + +export interface RolesAPIClient { + getRoles: () => Promise; + getRole: (roleName: string) => Promise; + deleteRole: (roleName: string) => Promise; + saveRole: (payload: RolePutPayload) => Promise; +} diff --git a/x-pack/packages/security/plugin_types_server/src/plugin.ts b/x-pack/packages/security/plugin_types_server/src/plugin.ts index d3ee046c2d0cd6..c8222163785bf7 100644 --- a/x-pack/packages/security/plugin_types_server/src/plugin.ts +++ b/x-pack/packages/security/plugin_types_server/src/plugin.ts @@ -21,6 +21,8 @@ export interface SecurityPluginSetup { license: SecurityLicense; /** * Exposes services for audit logging. + * + * @deprecated in favor of Core's `security` service */ audit: AuditServiceSetup; /** @@ -35,6 +37,8 @@ export interface SecurityPluginSetup { export interface SecurityPluginStart { /** * Authentication services to confirm the user is who they say they are. + * + * @deprecated in favor of Core's `security` service */ authc: AuthenticationServiceStart; /** @@ -43,6 +47,8 @@ export interface SecurityPluginStart { authz: AuthorizationServiceSetup; /** * User profiles services to retrieve user profiles. + * + * @deprecated in favor of Core's `userProfile` service */ userProfiles: UserProfileServiceStart; } diff --git a/x-pack/plugins/actions/docs/openapi/bundled_serverless.json b/x-pack/plugins/actions/docs/openapi/bundled_serverless.json index 0f55981305631d..821f74fb1424c8 100644 --- a/x-pack/plugins/actions/docs/openapi/bundled_serverless.json +++ b/x-pack/plugins/actions/docs/openapi/bundled_serverless.json @@ -480,6 +480,42 @@ } } }, + "create_connector_request_gemini": { + "title": "Create Google Gemini connector request", + "description": "The Google Gemini connector uses axios to send a POST request to Google Gemini.", + "type": "object", + "required": [ + "config", + "connector_type_id", + "name", + "secrets" + ], + "properties": { + "config": { + "$ref": "#/components/schemas/config_properties_gemini" + }, + "connector_type_id": { + "type": "string", + "description": "The type of connector.", + "enum": [ + ".gemini" + ], + "examples": [ + ".gemini" + ] + }, + "name": { + "type": "string", + "description": "The display name for the connector.", + "examples": [ + "my-connector" + ] + }, + "secrets": { + "$ref": "#/components/schemas/secrets_properties_gemini" + } + } + }, "create_connector_request_cases_webhook": { "title": "Create Webhook - Case Managment connector request", "description": "The Webhook - Case Management connector uses axios to send POST, PUT, and GET requests to a case management RESTful API web service.\n", @@ -1289,6 +1325,49 @@ } } }, + "config_properties_gemini": { + "title": "Connector request properties for an Google Gemini connector", + "description": "Defines properties for connectors when type is `.gemini`.", + "type": "object", + "required": [ + "apiUrl", + "gcpRegion", + "gcpProjectID" + ], + "properties": { + "apiUrl": { + "type": "string", + "description": "The Google Gemini request URL." + }, + "defaultModel": { + "type": "string", + "description": "The generative artificial intelligence model for Google Gemini to use.\n", + "default": "gemini-1.5-pro-preview-0409" + }, + "gcpRegion": { + "type": "string", + "description": "The GCP region that has Vertex AI endpoint enabled." + }, + "gcpProjectID": { + "type": "string", + "description": "The Google ProjectID that has Vertex AI endpoint enabled." + } + } + }, + "secrets_properties_gemini": { + "title": "Connector secrets properties for an Google Gemini connector", + "description": "Defines secrets for connectors when type is `.gemini`.", + "type": "object", + "required": [ + "credentialsJSON" + ], + "properties": { + "credentialsJSON": { + "type": "string", + "description": "The service account credentials JSON file. The service account should have Vertex AI user IAM role assigned to it." + } + } + }, "config_properties_cases_webhook": { "title": "Connector request properties for Webhook - Case Management connector", "required": [ @@ -2411,6 +2490,9 @@ { "$ref": "#/components/schemas/create_connector_request_bedrock" }, + { + "$ref": "#/components/schemas/create_connector_request_gemini" + }, { "$ref": "#/components/schemas/create_connector_request_cases_webhook" }, @@ -2482,6 +2564,7 @@ "propertyName": "connector_type_id", "mapping": { ".bedrock": "#/components/schemas/create_connector_request_bedrock", + ".gemini": "#/components/schemas/create_connector_request_gemini", ".cases-webhook": "#/components/schemas/create_connector_request_cases_webhook", ".d3security": "#/components/schemas/create_connector_request_d3security", ".email": "#/components/schemas/create_connector_request_email", @@ -2551,6 +2634,50 @@ } } }, + "connector_response_properties_gemini": { + "title": "Connector response properties for an Google Gemini connector", + "type": "object", + "required": [ + "config", + "connector_type_id", + "id", + "is_deprecated", + "is_preconfigured", + "name" + ], + "properties": { + "config": { + "$ref": "#/components/schemas/config_properties_gemini" + }, + "connector_type_id": { + "type": "string", + "description": "The type of connector.", + "enum": [ + ".gemini" + ] + }, + "id": { + "type": "string", + "description": "The identifier for the connector." + }, + "is_deprecated": { + "$ref": "#/components/schemas/is_deprecated" + }, + "is_missing_secrets": { + "$ref": "#/components/schemas/is_missing_secrets" + }, + "is_preconfigured": { + "$ref": "#/components/schemas/is_preconfigured" + }, + "is_system_action": { + "$ref": "#/components/schemas/is_system_action" + }, + "name": { + "type": "string", + "description": "The display name for the connector." + } + } + }, "connector_response_properties_cases_webhook": { "title": "Connector request properties for a Webhook - Case Management connector", "type": "object", @@ -3605,6 +3732,9 @@ { "$ref": "#/components/schemas/connector_response_properties_bedrock" }, + { + "$ref": "#/components/schemas/connector_response_properties_gemini" + }, { "$ref": "#/components/schemas/connector_response_properties_cases_webhook" }, @@ -3676,6 +3806,7 @@ "propertyName": "connector_type_id", "mapping": { ".bedrock": "#/components/schemas/connector_response_properties_bedrock", + ".gemini": "#/components/schemas/connector_response_properties_gemini", ".cases-webhook": "#/components/schemas/connector_response_properties_cases_webhook", ".d3security": "#/components/schemas/connector_response_properties_d3security", ".email": "#/components/schemas/connector_response_properties_email", @@ -3721,6 +3852,26 @@ } } }, + "update_connector_request_gemini": { + "title": "Update Google Gemini connector request", + "type": "object", + "required": [ + "config", + "name" + ], + "properties": { + "config": { + "$ref": "#/components/schemas/config_properties_gemini" + }, + "name": { + "type": "string", + "description": "The display name for the connector." + }, + "secrets": { + "$ref": "#/components/schemas/secrets_properties_gemini" + } + } + }, "update_connector_request_cases_webhook": { "title": "Update Webhook - Case Managment connector request", "type": "object", @@ -4131,6 +4282,9 @@ { "$ref": "#/components/schemas/update_connector_request_bedrock" }, + { + "$ref": "#/components/schemas/update_connector_request_gemini" + }, { "$ref": "#/components/schemas/update_connector_request_cases_webhook" }, @@ -4213,6 +4367,7 @@ "description": "The type of connector. For example, `.email`, `.index`, `.jira`, `.opsgenie`, or `.server-log`.", "enum": [ ".bedrock", + ".gemini", ".cases-webhook", ".d3security", ".email", @@ -4456,6 +4611,18 @@ "generativeAI" ], "is_system_action_type": false + }, + { + "id": ".gemini", + "name": "Google Gemini", + "enabled": true, + "enabled_in_config": true, + "enabled_in_license": true, + "minimum_license_required": "enterprise", + "supported_feature_ids": [ + "generativeAI" + ], + "is_system_action_type": false } ] } diff --git a/x-pack/plugins/actions/docs/openapi/components/examples/get_connector_types_generativeai_response.yaml b/x-pack/plugins/actions/docs/openapi/components/examples/get_connector_types_generativeai_response.yaml index 96eff6e72f2473..b271d7f0f3df3f 100644 --- a/x-pack/plugins/actions/docs/openapi/components/examples/get_connector_types_generativeai_response.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/examples/get_connector_types_generativeai_response.yaml @@ -18,3 +18,13 @@ value: supported_feature_ids: - generativeAI is_system_action_type: false + + - id: .gemini + name: Google Gemini + enabled: true + enabled_in_config: true + enabled_in_license: true + minimum_license_required: enterprise + supported_feature_ids: + - generativeAI + is_system_action_type: false diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties.yaml index e64bc1aaf46585..2622f6a80dc993 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_response_properties.yaml @@ -2,6 +2,7 @@ title: Connector response properties description: The properties vary depending on the connector type. oneOf: - $ref: 'connector_response_properties_bedrock.yaml' + - $ref: 'connector_response_properties_gemini.yaml' - $ref: 'connector_response_properties_cases_webhook.yaml' - $ref: 'connector_response_properties_d3security.yaml' - $ref: 'connector_response_properties_email.yaml' @@ -28,6 +29,7 @@ discriminator: propertyName: connector_type_id mapping: .bedrock: 'connector_response_properties_bedrock.yaml' + .gemini: 'connector_response_properties_gemini.yaml' .cases-webhook: 'connector_response_properties_cases_webhook.yaml' .d3security: 'connector_response_properties_d3security.yaml' .email: 'connector_response_properties_email.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml index 950d6470cefe3c..f202efc087b008 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/connector_types.yaml @@ -3,6 +3,7 @@ type: string description: The type of connector. For example, `.email`, `.index`, `.jira`, `.opsgenie`, or `.server-log`. enum: - .bedrock + - .gemini - .cases-webhook - .d3security - .email diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request.yaml index 35720488e14688..7de48825999f32 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/create_connector_request.yaml @@ -2,6 +2,7 @@ title: Create connector request body properties description: The properties vary depending on the connector type. oneOf: - $ref: 'create_connector_request_bedrock.yaml' + - $ref: 'create_connector_request_gemini.yaml' - $ref: 'create_connector_request_cases_webhook.yaml' - $ref: 'create_connector_request_d3security.yaml' - $ref: 'create_connector_request_email.yaml' @@ -28,6 +29,7 @@ discriminator: propertyName: connector_type_id mapping: .bedrock: 'create_connector_request_bedrock.yaml' + .gemini: 'create_connector_request_gemini.yaml' .cases-webhook: 'create_connector_request_cases_webhook.yaml' .d3security: 'create_connector_request_d3security.yaml' .email: 'create_connector_request_email.yaml' diff --git a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request.yaml b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request.yaml index 1947f7433186e1..d87e508ba22d83 100644 --- a/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request.yaml +++ b/x-pack/plugins/actions/docs/openapi/components/schemas/update_connector_request.yaml @@ -2,6 +2,7 @@ title: Update connector request body properties description: The properties vary depending on the connector type. oneOf: - $ref: 'update_connector_request_bedrock.yaml' + - $ref: 'update_connector_request_gemini.yaml' - $ref: 'update_connector_request_cases_webhook.yaml' - $ref: 'update_connector_request_d3security.yaml' - $ref: 'update_connector_request_email.yaml' diff --git a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap index b41e9ef70df78b..10f8265b15cc32 100644 --- a/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap +++ b/x-pack/plugins/actions/server/integration_tests/__snapshots__/connector_types.test.ts.snap @@ -2950,6 +2950,371 @@ Object { } `; +exports[`Connector type config checks detect connector type changes for: .gemini 1`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "body": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "model": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "signal": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "timeout": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .gemini 2`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "dashboardId": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .gemini 3`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "body": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "model": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "signal": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-any-type": true, + }, + Object { + "x-oas-optional": true, + }, + ], + "type": "any", + }, + "timeout": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "metas": Array [ + Object { + "x-oas-optional": true, + }, + ], + "type": "number", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .gemini 4`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "apiUrl": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "defaultModel": Object { + "flags": Object { + "default": "gemini-1.5-pro-preview-0409", + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "gcpProjectID": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "gcpRegion": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .gemini 5`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "credentialsJson": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + +exports[`Connector type config checks detect connector type changes for: .gemini 6`] = ` +Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + }, + "keys": Object { + "subAction": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "subActionParams": Object { + "flags": Object { + "default": Object { + "special": "deep", + }, + "error": [Function], + "presence": "optional", + "unknown": true, + }, + "keys": Object {}, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", + }, + }, + "preferences": Object { + "stripUnknown": Object { + "objects": false, + }, + }, + "type": "object", +} +`; + exports[`Connector type config checks detect connector type changes for: .index 1`] = ` Object { "flags": Object { diff --git a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts index d90756d1bb5943..c2ad283861b4fc 100644 --- a/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts +++ b/x-pack/plugins/actions/server/integration_tests/mocks/connector_types.ts @@ -26,6 +26,7 @@ export const connectorTypes: string[] = [ '.tines', '.gen-ai', '.bedrock', + '.gemini', '.d3security', '.resilient', '.sentinelone', diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts index 7e112398d45087..c3624178046fce 100644 --- a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.test.ts @@ -310,6 +310,56 @@ describe('getGenAiTokenTracking', () => { expect(logger.error).toHaveBeenCalled(); }); + it('should return the total, prompt, and completion token counts when given a valid Gemini response', async () => { + const actionTypeId = '.gemini'; + + const result = { + actionId: '123', + status: 'ok' as const, + data: { + usageMetadata: { + promptTokenCount: 50, + candidatesTokenCount: 50, + totalTokenCount: 100, + }, + }, + }; + const validatedParams = {}; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toEqual({ + total_tokens: 100, + prompt_tokens: 50, + completion_tokens: 50, + }); + }); + + it('should return null when given an invalid Gemini response', async () => { + const actionTypeId = '.gemini'; + const result = { + actionId: '123', + status: 'ok' as const, + data: {}, + }; + const validatedParams = {}; + + const tokenTracking = await getGenAiTokenTracking({ + actionTypeId, + logger, + result, + validatedParams, + }); + + expect(tokenTracking).toBeNull(); + expect(logger.error).toHaveBeenCalled(); + }); + describe('shouldTrackGenAiToken', () => { it('should be true with OpenAI action', () => { expect(shouldTrackGenAiToken('.gen-ai')).toEqual(true); @@ -317,6 +367,9 @@ describe('getGenAiTokenTracking', () => { it('should be true with bedrock action', () => { expect(shouldTrackGenAiToken('.bedrock')).toEqual(true); }); + it('should be true with Gemini action', () => { + expect(shouldTrackGenAiToken('.gemini')).toEqual(true); + }); it('should be false with any other action', () => { expect(shouldTrackGenAiToken('.jira')).toEqual(false); }); diff --git a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts index 41dffcbaafebf7..15c5b234d24bce 100644 --- a/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts +++ b/x-pack/plugins/actions/server/lib/gen_ai_token_tracking.ts @@ -173,6 +173,26 @@ export const getGenAiTokenTracking = async ({ } } + // Process non-streamed Gemini response from `usageMetadata` object + if (actionTypeId === '.gemini') { + const data = result.data as unknown as { + usageMetadata: { + promptTokenCount?: number; + candidatesTokenCount?: number; + totalTokenCount?: number; + }; + }; + if (data.usageMetadata == null) { + logger.error('Response did not contain usage metadata object'); + return null; + } + return { + total_tokens: data.usageMetadata?.totalTokenCount ?? 0, + prompt_tokens: data.usageMetadata?.promptTokenCount ?? 0, + completion_tokens: data.usageMetadata?.candidatesTokenCount ?? 0, + }; + } + // this is a non-streamed Bedrock response used by security solution if (actionTypeId === '.bedrock' && validatedParams.subAction === 'invokeAI') { try { @@ -215,4 +235,4 @@ export const getGenAiTokenTracking = async ({ }; export const shouldTrackGenAiToken = (actionTypeId: string) => - actionTypeId === '.gen-ai' || actionTypeId === '.bedrock'; + actionTypeId === '.gen-ai' || actionTypeId === '.bedrock' || actionTypeId === '.gemini'; diff --git a/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.test.ts b/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.test.ts new file mode 100644 index 00000000000000..436d75dc1c7756 --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.test.ts @@ -0,0 +1,172 @@ +/* + * Copyright 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 { Logger } from '@kbn/core/server'; +import { connectorTokenClientMock } from './connector_token_client.mock'; +import { loggingSystemMock } from '@kbn/core/server/mocks'; + +describe('getGoogleOAuthJwtAccessToken', () => { + const logger = loggingSystemMock.create().get() as jest.Mocked; + const credentialsJson = { + type: 'service_account', + project_id: '', + private_key_id: '', + private_key: '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n', + client_email: '', + client_id: '', + auth_uri: 'https://accounts.google.com/o/oauth2/auth', + token_uri: 'https://oauth2.googleapis.com/token', + auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: '', + }; + const connectorTokenClient = connectorTokenClientMock.create(); + const getGoogleOAuthJwtAccessTokenOptions = { + connectorId: '123', + logger, + credentials: credentialsJson, + connectorTokenClient, + }; + + beforeEach(() => { + jest.resetModules(); + jest.clearAllMocks(); + }); + + it('should get access token successfully', async () => { + connectorTokenClient.get.mockResolvedValueOnce({ + hasErrors: false, + connectorToken: null, + }); + + jest.mock('google-auth-library', () => ({ + GoogleAuth: jest.fn().mockImplementation(() => ({ + getAccessToken: jest.fn().mockResolvedValue('mocked_access_token'), // Success case + })), + })); + + // Dynamically import the function after mocking + const { getGoogleOAuthJwtAccessToken } = await import('./get_gcp_oauth_access_token'); + + const accessToken = await getGoogleOAuthJwtAccessToken(getGoogleOAuthJwtAccessTokenOptions); + expect(accessToken).toBe('mocked_access_token'); + expect(connectorTokenClient.updateOrReplace).toHaveBeenCalledWith( + expect.objectContaining({ + connectorId: '123', + token: null, + newToken: 'mocked_access_token', + deleteExisting: false, + expiresInSec: 3500, + }) + ); + }); + + it('uses stored access token if it exists', async () => { + const createdAt = new Date(); + createdAt.setHours(createdAt.getHours() - 1); + const expiresAt = new Date(); + expiresAt.setHours(expiresAt.getHours() + 1); + connectorTokenClient.get.mockResolvedValueOnce({ + hasErrors: false, + connectorToken: { + id: '1', + connectorId: '123', + tokenType: 'access_token', + token: 'testtokenvalue', + createdAt: createdAt.toISOString(), + expiresAt: expiresAt.toISOString(), + }, + }); + // Dynamically import the function + const { getGoogleOAuthJwtAccessToken } = await import('./get_gcp_oauth_access_token'); + + const accessToken = await getGoogleOAuthJwtAccessToken(getGoogleOAuthJwtAccessTokenOptions); + expect(accessToken).toEqual('testtokenvalue'); + }); + + it('should get access token if token expires', async () => { + connectorTokenClient.get.mockResolvedValueOnce({ + hasErrors: false, + connectorToken: { + id: '1', + connectorId: '123', + tokenType: 'access_token', + token: 'testtokenvalue', + createdAt: new Date('2021-01-01T08:00:00.000Z').toISOString(), + expiresAt: new Date('2021-01-02T13:00:00.000Z').toISOString(), + }, + }); + + jest.mock('google-auth-library', () => ({ + GoogleAuth: jest.fn().mockImplementation(() => ({ + getAccessToken: jest.fn().mockResolvedValue('mocked_access_token'), // Success case + })), + })); + + // Dynamically import the function after mocking + const { getGoogleOAuthJwtAccessToken } = await import('./get_gcp_oauth_access_token'); + const accessToken = await getGoogleOAuthJwtAccessToken(getGoogleOAuthJwtAccessTokenOptions); + expect(accessToken).toBe('mocked_access_token'); + expect(connectorTokenClient.updateOrReplace).toHaveBeenCalledWith( + expect.objectContaining({ + connectorId: '123', + newToken: 'mocked_access_token', + deleteExisting: false, + expiresInSec: 3500, + }) + ); + }); + + it('logs warning when getting connector token fails', async () => { + const mockError = new Error('Failed to fetch token'); + connectorTokenClient.get.mockRejectedValue(mockError); // Simulate failure + jest.mock('google-auth-library', () => ({ + GoogleAuth: jest.fn().mockImplementation(() => ({ + getAccessToken: jest.fn().mockResolvedValue('mocked_access_token'), // Success case + })), + })); + + // Dynamically import the function after mocking + const { getGoogleOAuthJwtAccessToken } = await import('./get_gcp_oauth_access_token'); + const accessToken = await getGoogleOAuthJwtAccessToken({ + connectorId: 'failing_connector', + logger, + credentials: credentialsJson, + connectorTokenClient, + }); + + expect(accessToken).toBeDefined(); // Should still return a token (likely a new one) + expect(logger.warn).toHaveBeenCalledWith( + `Failed to get connector token for connectorId: failing_connector. Error: ${mockError.message}` + ); + }); + + it('throws an error when Google Auth fails', async () => { + jest.mock('google-auth-library', () => ({ + GoogleAuth: jest.fn().mockImplementation(() => ({ + getAccessToken: jest.fn().mockRejectedValue(new Error('Google Auth Error')), + })), + })); + + connectorTokenClient.get.mockResolvedValue({ connectorToken: null, hasErrors: false }); + + // Dynamically import the function after mocking + const { getGoogleOAuthJwtAccessToken } = await import('./get_gcp_oauth_access_token'); + + await expect( + getGoogleOAuthJwtAccessToken({ + connectorId: 'test_connector', + logger, + credentials: {}, + connectorTokenClient, + }) + ).rejects.toThrowError( + 'Unable to retrieve access token. Ensure the service account has the right permissions and the Vertex AI endpoint is enabled in the GCP project. Error: Google Auth Error' + ); + + expect(connectorTokenClient.updateOrReplace).not.toHaveBeenCalled(); // No update + }); +}); diff --git a/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.ts b/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.ts new file mode 100644 index 00000000000000..3efe7900ea6b64 --- /dev/null +++ b/x-pack/plugins/actions/server/lib/get_gcp_oauth_access_token.ts @@ -0,0 +1,89 @@ +/* + * Copyright 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 { Logger } from '@kbn/core/server'; +import { GoogleAuth } from 'google-auth-library'; +import { ConnectorToken, ConnectorTokenClientContract } from '../types'; + +interface GetOAuthJwtAccessTokenOpts { + connectorId?: string; + logger: Logger; + credentials: object; + connectorTokenClient?: ConnectorTokenClientContract; +} +export const getGoogleOAuthJwtAccessToken = async ({ + connectorId, + logger, + credentials, + connectorTokenClient, +}: GetOAuthJwtAccessTokenOpts) => { + let accessToken; + let connectorToken: ConnectorToken | null = null; + let hasErrors: boolean = false; + const expiresInSec = 3500; + + if (connectorId && connectorTokenClient) { + try { + // Check if there is a token stored for this connector + const { connectorToken: token, hasErrors: errors } = await connectorTokenClient.get({ + connectorId, + }); + connectorToken = token; + hasErrors = errors; + } catch (error) { + logger.warn( + `Failed to get connector token for connectorId: ${connectorId}. Error: ${error.message}` + ); + } + } + + if (!connectorToken || Date.parse(connectorToken.expiresAt) <= Date.now()) { + const requestTokenStart = Date.now(); + + // Request access token with service account credentials file + const auth = new GoogleAuth({ + credentials, + scopes: 'https://www.googleapis.com/auth/cloud-platform', + }); + + try { + accessToken = await auth.getAccessToken(); + } catch (error) { + throw new Error( + `Unable to retrieve access token. Ensure the service account has the right permissions and the Vertex AI endpoint is enabled in the GCP project. Error: ${error.message}` + ); + } + + if (!accessToken) { + throw new Error( + `Error occurred while retrieving the access token. Ensure that the credentials are vaild.` + ); + } + + // Try to update connector token + if (connectorId && connectorTokenClient) { + try { + await connectorTokenClient.updateOrReplace({ + connectorId, + token: connectorToken, + newToken: accessToken, + tokenRequestDate: requestTokenStart, + expiresInSec, + deleteExisting: hasErrors, + }); + } catch (err) { + logger.warn( + `Not able to update connector token for connectorId: ${connectorId} due to error: ${err.message}` + ); + } + } + } else { + // Use existing valid token + accessToken = connectorToken.token; + } + + return accessToken; +}; diff --git a/x-pack/plugins/actions/server/routes/connector/get/get.ts b/x-pack/plugins/actions/server/routes/connector/get/get.ts index 2a05405a6a722d..bb15a2e2e5cf57 100644 --- a/x-pack/plugins/actions/server/routes/connector/get/get.ts +++ b/x-pack/plugins/actions/server/routes/connector/get/get.ts @@ -25,7 +25,7 @@ export const getConnectorRoute = ( path: `${BASE_ACTION_API_PATH}/connector/{id}`, options: { access: 'public', - description: `Get connector information`, + summary: `Get connector information`, }, validate: { params: getConnectorParamsSchemaV1, diff --git a/x-pack/plugins/actions/server/routes/connector/get_all/get_all.ts b/x-pack/plugins/actions/server/routes/connector/get_all/get_all.ts index e37edc2347a32d..b5ffb4499b0736 100644 --- a/x-pack/plugins/actions/server/routes/connector/get_all/get_all.ts +++ b/x-pack/plugins/actions/server/routes/connector/get_all/get_all.ts @@ -22,7 +22,7 @@ export const getAllConnectorsRoute = ( path: `${BASE_ACTION_API_PATH}/connectors`, options: { access: 'public', - description: `Get all connectors`, + summary: `Get all connectors`, }, validate: {}, }, diff --git a/x-pack/plugins/actions/server/routes/connector/list_types/list_types.ts b/x-pack/plugins/actions/server/routes/connector/list_types/list_types.ts index e09a828c9ff6ca..4632a6fb9e83ec 100644 --- a/x-pack/plugins/actions/server/routes/connector/list_types/list_types.ts +++ b/x-pack/plugins/actions/server/routes/connector/list_types/list_types.ts @@ -26,7 +26,7 @@ export const listTypesRoute = ( path: `${BASE_ACTION_API_PATH}/connector_types`, options: { access: 'public', - description: `Get connector types`, + summary: `Get connector types`, }, validate: { query: connectorTypesQuerySchemaV1, diff --git a/x-pack/plugins/actions/server/routes/create.ts b/x-pack/plugins/actions/server/routes/create.ts index 63cf948d318cdd..a18cf4c61ef2c2 100644 --- a/x-pack/plugins/actions/server/routes/create.ts +++ b/x-pack/plugins/actions/server/routes/create.ts @@ -55,7 +55,7 @@ export const createActionRoute = ( path: `${BASE_ACTION_API_PATH}/connector/{id?}`, options: { access: 'public', - description: 'Create a connector', + summary: 'Create a connector', }, validate: { params: schema.maybe( diff --git a/x-pack/plugins/actions/server/routes/delete.ts b/x-pack/plugins/actions/server/routes/delete.ts index c6a6c8afcbb728..950a3a8a60b172 100644 --- a/x-pack/plugins/actions/server/routes/delete.ts +++ b/x-pack/plugins/actions/server/routes/delete.ts @@ -25,7 +25,7 @@ export const deleteActionRoute = ( path: `${BASE_ACTION_API_PATH}/connector/{id}`, options: { access: 'public', - description: `Delete a connector`, + summary: `Delete a connector`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/actions/server/routes/execute.ts b/x-pack/plugins/actions/server/routes/execute.ts index d366feb7ce3eea..8b022e4d13f2c5 100644 --- a/x-pack/plugins/actions/server/routes/execute.ts +++ b/x-pack/plugins/actions/server/routes/execute.ts @@ -41,7 +41,9 @@ export const executeActionRoute = ( path: `${BASE_ACTION_API_PATH}/connector/{id}/_execute`, options: { access: 'public', - description: `Run a connector`, + summary: `Run a connector`, + description: + 'You can use this API to test an action that involves interaction with Kibana services or integrations with third-party systems. You must have `read` privileges for the **Actions and Connectors** feature in the **Management** section of the Kibana feature privileges. If you use an index connector, you must also have `all`, `create`, `index`, or `write` indices privileges.', }, validate: { body: bodySchema, diff --git a/x-pack/plugins/actions/server/routes/legacy/create.ts b/x-pack/plugins/actions/server/routes/legacy/create.ts index bbdf528f215643..d4a7da1420f7f0 100644 --- a/x-pack/plugins/actions/server/routes/legacy/create.ts +++ b/x-pack/plugins/actions/server/routes/legacy/create.ts @@ -31,7 +31,7 @@ export const createActionRoute = ( path: `${BASE_ACTION_API_PATH}/action`, options: { access: 'public', - description: `Create a connector`, + summary: `Create a connector`, }, validate: { body: bodySchema, diff --git a/x-pack/plugins/actions/server/routes/legacy/delete.ts b/x-pack/plugins/actions/server/routes/legacy/delete.ts index 57c4346084f576..0639019f73278d 100644 --- a/x-pack/plugins/actions/server/routes/legacy/delete.ts +++ b/x-pack/plugins/actions/server/routes/legacy/delete.ts @@ -27,7 +27,7 @@ export const deleteActionRoute = ( path: `${BASE_ACTION_API_PATH}/action/{id}`, options: { access: 'public', - description: `Delete a connector`, + summary: `Delete a connector`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/actions/server/routes/legacy/execute.ts b/x-pack/plugins/actions/server/routes/legacy/execute.ts index f4ec794635263e..ecf036617a28a9 100644 --- a/x-pack/plugins/actions/server/routes/legacy/execute.ts +++ b/x-pack/plugins/actions/server/routes/legacy/execute.ts @@ -33,7 +33,7 @@ export const executeActionRoute = ( path: `${BASE_ACTION_API_PATH}/action/{id}/_execute`, options: { access: 'public', - description: `Run a connector`, + summary: `Run a connector`, }, validate: { body: bodySchema, diff --git a/x-pack/plugins/actions/server/routes/legacy/get.ts b/x-pack/plugins/actions/server/routes/legacy/get.ts index d47efc698c2fef..4c8d797205238b 100644 --- a/x-pack/plugins/actions/server/routes/legacy/get.ts +++ b/x-pack/plugins/actions/server/routes/legacy/get.ts @@ -27,7 +27,7 @@ export const getActionRoute = ( path: `${BASE_ACTION_API_PATH}/action/{id}`, options: { access: 'public', - description: `Get connector information`, + summary: `Get connector information`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/actions/server/routes/legacy/get_all.ts b/x-pack/plugins/actions/server/routes/legacy/get_all.ts index 19fc32389c2ec1..2ecd570cb3e768 100644 --- a/x-pack/plugins/actions/server/routes/legacy/get_all.ts +++ b/x-pack/plugins/actions/server/routes/legacy/get_all.ts @@ -22,7 +22,7 @@ export const getAllActionRoute = ( path: `${BASE_ACTION_API_PATH}`, options: { access: 'public', - description: `Get all connectors`, + summary: `Get all connectors`, }, validate: {}, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts b/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts index ef587d1ad11a6f..fac078843e02dd 100644 --- a/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts +++ b/x-pack/plugins/actions/server/routes/legacy/list_action_types.ts @@ -26,7 +26,7 @@ export const listActionTypesRoute = ( path: `${BASE_ACTION_API_PATH}/list_action_types`, options: { access: 'public', - description: `Get connector types`, + summary: `Get connector types`, }, validate: {}, }, diff --git a/x-pack/plugins/actions/server/routes/legacy/update.ts b/x-pack/plugins/actions/server/routes/legacy/update.ts index 0959398dd1a691..59258434050e14 100644 --- a/x-pack/plugins/actions/server/routes/legacy/update.ts +++ b/x-pack/plugins/actions/server/routes/legacy/update.ts @@ -33,7 +33,7 @@ export const updateActionRoute = ( path: `${BASE_ACTION_API_PATH}/action/{id}`, options: { access: 'public', - description: `Update a connector`, + summary: `Update a connector`, }, validate: { body: bodySchema, diff --git a/x-pack/plugins/actions/server/routes/update.ts b/x-pack/plugins/actions/server/routes/update.ts index 68c7a8e9f9def4..426deeb19aae31 100644 --- a/x-pack/plugins/actions/server/routes/update.ts +++ b/x-pack/plugins/actions/server/routes/update.ts @@ -51,7 +51,7 @@ export const updateActionRoute = ( path: `${BASE_ACTION_API_PATH}/connector/{id}`, options: { access: 'public', - description: `Update a connector`, + summary: `Update a connector`, }, validate: { body: bodySchema, diff --git a/x-pack/plugins/alerting/server/routes/disable_rule.ts b/x-pack/plugins/alerting/server/routes/disable_rule.ts index 6be1254fb9342e..2b60cdbeedeafb 100644 --- a/x-pack/plugins/alerting/server/routes/disable_rule.ts +++ b/x-pack/plugins/alerting/server/routes/disable_rule.ts @@ -32,7 +32,7 @@ export const disableRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}/_disable`, options: { access: 'public', - description: `Disable a rule`, + summary: `Disable a rule`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/alerting/server/routes/enable_rule.ts b/x-pack/plugins/alerting/server/routes/enable_rule.ts index 76c96fecaef5a0..a6334a25138dc5 100644 --- a/x-pack/plugins/alerting/server/routes/enable_rule.ts +++ b/x-pack/plugins/alerting/server/routes/enable_rule.ts @@ -24,7 +24,7 @@ export const enableRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}/_enable`, options: { access: 'public', - description: `Enable a rule`, + summary: `Enable a rule`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/alerting/server/routes/health.ts b/x-pack/plugins/alerting/server/routes/health.ts index 5272876773b69a..6d178e7bd186ce 100644 --- a/x-pack/plugins/alerting/server/routes/health.ts +++ b/x-pack/plugins/alerting/server/routes/health.ts @@ -42,7 +42,7 @@ export const healthRoute = ( path: `${BASE_ALERTING_API_PATH}/_health`, options: { access: 'public', - description: `Get the health of the alerting framework`, + summary: `Get the health of the alerting framework`, }, validate: false, }, diff --git a/x-pack/plugins/alerting/server/routes/mute_all_rule.ts b/x-pack/plugins/alerting/server/routes/mute_all_rule.ts index ca1f31bae3cb26..185d44b95a50ed 100644 --- a/x-pack/plugins/alerting/server/routes/mute_all_rule.ts +++ b/x-pack/plugins/alerting/server/routes/mute_all_rule.ts @@ -27,7 +27,7 @@ export const muteAllRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}/_mute_all`, options: { access: 'public', - description: `Mute all alerts`, + summary: `Mute all alerts`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/create/create_rule_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/create/create_rule_route.ts index 7299da7e8dd396..5bb1eec92de268 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/create/create_rule_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/create/create_rule_route.ts @@ -34,7 +34,7 @@ export const createRuleRoute = ({ router, licenseState, usageCounter }: RouteOpt path: `${BASE_ALERTING_API_PATH}/rule/{id?}`, options: { access: 'public', - description: `Create a rule`, + summary: `Create a rule`, }, validate: { body: createBodySchemaV1, diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/delete/delete_rule_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/delete/delete_rule_route.ts index bb862e3a7e5c9d..3fe896cec9622f 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/delete/delete_rule_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/delete/delete_rule_route.ts @@ -23,7 +23,7 @@ export const deleteRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}`, options: { access: 'public', - description: `Delete a rule`, + summary: `Delete a rule`, }, validate: { params: deleteRuleRequestParamsSchemaV1, diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts index ac2aa49956b3a8..1cadb35969944f 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/find/find_rules_route.ts @@ -43,7 +43,7 @@ const buildFindRulesRoute = ({ path, options: { access: 'public', - description: `Get rules`, + summary: `Get rules`, }, validate: { query: findRulesRequestQuerySchemaV1, diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/get/get_rule_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/get/get_rule_route.ts index 2764163641a979..e08c81a1d2e5c3 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/get/get_rule_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/get/get_rule_route.ts @@ -78,7 +78,7 @@ export const getRuleRoute = ( router, options: { access: 'public', - description: `Get rule details`, + summary: `Get rule details`, }, }); diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/mute_alert/mute_alert.ts b/x-pack/plugins/alerting/server/routes/rule/apis/mute_alert/mute_alert.ts index 2e7747f53b1b41..91a254be09663e 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/mute_alert/mute_alert.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/mute_alert/mute_alert.ts @@ -23,7 +23,7 @@ export const muteAlertRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{rule_id}/alert/{alert_id}/_mute`, options: { access: 'public', - description: `Mute an alert`, + summary: `Mute an alert`, }, validate: { params: muteAlertParamsSchemaV1, diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/update/update_rule_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/update/update_rule_route.ts index 0edaf62ea7ddda..f13d3ac9ee31b3 100644 --- a/x-pack/plugins/alerting/server/routes/rule/apis/update/update_rule_route.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/update/update_rule_route.ts @@ -33,7 +33,7 @@ export const updateRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}`, options: { access: 'public', - description: `Update a rule`, + summary: `Update a rule`, }, validate: { body: updateBodySchemaV1, diff --git a/x-pack/plugins/alerting/server/routes/rule_types.ts b/x-pack/plugins/alerting/server/routes/rule_types.ts index 5c20fc6df7d5d8..1021b4c9a14314 100644 --- a/x-pack/plugins/alerting/server/routes/rule_types.ts +++ b/x-pack/plugins/alerting/server/routes/rule_types.ts @@ -57,7 +57,7 @@ export const ruleTypesRoute = ( path: `${BASE_ALERTING_API_PATH}/rule_types`, options: { access: 'public', - description: `Get rule types`, + summary: `Get rule types`, }, validate: {}, }, diff --git a/x-pack/plugins/alerting/server/routes/unmute_alert.ts b/x-pack/plugins/alerting/server/routes/unmute_alert.ts index 089f63911a902b..b0d124e0d3945a 100644 --- a/x-pack/plugins/alerting/server/routes/unmute_alert.ts +++ b/x-pack/plugins/alerting/server/routes/unmute_alert.ts @@ -34,7 +34,7 @@ export const unmuteAlertRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{rule_id}/alert/{alert_id}/_unmute`, options: { access: 'public', - description: `Unmute an alert`, + summary: `Unmute an alert`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/alerting/server/routes/unmute_all_rule.ts b/x-pack/plugins/alerting/server/routes/unmute_all_rule.ts index 247f6377e4ad14..033f5b276828ab 100644 --- a/x-pack/plugins/alerting/server/routes/unmute_all_rule.ts +++ b/x-pack/plugins/alerting/server/routes/unmute_all_rule.ts @@ -24,7 +24,7 @@ export const unmuteAllRuleRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}/_unmute_all`, options: { access: 'public', - description: `Unmute all alerts`, + summary: `Unmute all alerts`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/alerting/server/routes/update_rule_api_key.ts b/x-pack/plugins/alerting/server/routes/update_rule_api_key.ts index 2838e206c92d73..8591f273eeeb33 100644 --- a/x-pack/plugins/alerting/server/routes/update_rule_api_key.ts +++ b/x-pack/plugins/alerting/server/routes/update_rule_api_key.ts @@ -24,7 +24,7 @@ export const updateRuleApiKeyRoute = ( path: `${BASE_ALERTING_API_PATH}/rule/{id}/_update_api_key`, options: { access: 'public', - description: `Update the API key for a rule`, + summary: `Update the API key for a rule`, }, validate: { params: paramSchema, diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/hooks/use_download_runtime.ts b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/hooks/use_download_runtime.ts index cb158fd3958c18..cd1635d65a573a 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/hooks/use_download_runtime.ts +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/hooks/use_download_runtime.ts @@ -26,7 +26,7 @@ const strings = { getShareableZipErrorTitle: (workpadName: string) => i18n.translate('xpack.canvas.workpadHeaderShareMenu.shareWebsiteErrorTitle', { defaultMessage: - "Failed to create {ZIP} file for '{workpadName}'. The workpad may be too large. You'll need to download the files separately.", + "Failed to create {ZIP} file for ''{workpadName}''. The workpad may be too large. You'll need to download the files separately.", values: { ZIP, workpadName, diff --git a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts index 6371b6ad546cd0..e82c93039b2bcf 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/alerts/get_cases.ts @@ -21,7 +21,7 @@ export const getCasesByAlertIdRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Get cases for an alert`, + summary: `Get cases for an alert`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts index f36c13499aa704..a9b05c92e0f3da 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/delete_cases.ts @@ -16,7 +16,7 @@ export const deleteCaseRoute = createCasesRoute({ path: CASES_URL, routerOptions: { access: 'public', - description: `Delete cases`, + summary: `Delete cases`, }, params: { query: schema.object({ diff --git a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts index cfb5a7572894ea..070bb4f1257251 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/find_cases.ts @@ -15,7 +15,7 @@ export const findCaseRoute = createCasesRoute({ path: `${CASES_URL}/_find`, routerOptions: { access: 'public', - description: `Search cases`, + summary: `Search cases`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts index c2522df7ddad77..b7557359b005ec 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/get_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/get_case.ts @@ -32,7 +32,7 @@ export const getCaseRoute = createCasesRoute({ params, routerOptions: { access: 'public', - description: `Get a case`, + summary: `Get a case`, }, handler: async ({ context, request, response, logger, kibanaVersion }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts index 2ae12fba4111ca..9a01378d0a86c5 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/patch_cases.ts @@ -16,7 +16,7 @@ export const patchCaseRoute = createCasesRoute({ path: CASES_URL, routerOptions: { access: 'public', - description: `Update cases`, + summary: `Update cases`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts index 5a65ed0851e917..f72819bf7536d9 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/post_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/post_case.ts @@ -16,7 +16,7 @@ export const postCaseRoute = createCasesRoute({ path: CASES_URL, routerOptions: { access: 'public', - description: `Create a case`, + summary: `Create a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts index d439b3f03dd796..2933a383aa13dd 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/push_case.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/push_case.ts @@ -18,7 +18,7 @@ export const pushCaseRoute: CaseRoute = createCasesRoute({ path: CASE_PUSH_URL, routerOptions: { access: 'public', - description: `Push a case to an external service`, + summary: `Push a case to an external service`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts index 06ab468d9ce173..9945b5ffa13bfd 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/reporters/get_reporters.ts @@ -15,7 +15,7 @@ export const getReportersRoute = createCasesRoute({ path: CASE_REPORTERS_URL, routerOptions: { access: 'public', - description: `Get all case creators`, + summary: `Get all case creators`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts index 366ba114c9d4e1..1d34fb3e566b17 100644 --- a/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts +++ b/x-pack/plugins/cases/server/routes/api/cases/tags/get_tags.ts @@ -15,7 +15,7 @@ export const getTagsRoute = createCasesRoute({ path: CASE_TAGS_URL, routerOptions: { access: 'public', - description: `Get case tags`, + summary: `Get case tags`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts index c395f68fbb1470..499b102dbed734 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_all_comments.ts @@ -15,7 +15,7 @@ export const deleteAllCommentsRoute = createCasesRoute({ path: CASE_COMMENTS_URL, routerOptions: { access: 'public', - description: `Delete all alerts and comments from a case`, + summary: `Delete all alerts and comments from a case`, }, params: { params: schema.object({ diff --git a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts index 47b9ad99927171..2d0e30bf49ecae 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/delete_comment.ts @@ -22,7 +22,7 @@ export const deleteCommentRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Delete an alert or comment from a case`, + summary: `Delete an alert or comment from a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts index e5f18ba07610f3..d44deffc1a9aef 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/find_comments.ts @@ -22,7 +22,7 @@ export const findCommentsRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Get all alerts and comments for a case`, + summary: `Get all alerts and comments for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts index bab7cd8971572f..4de1d4690f3b3c 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_alerts.ts @@ -22,7 +22,7 @@ export const getAllAlertsAttachedToCaseRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Get all alerts for a case`, + summary: `Get all alerts for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts index a070c79541e1c7..10f6b072636aa9 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_all_comment.ts @@ -28,7 +28,7 @@ export const getAllCommentsRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Gets all comments for a case`, + summary: `Gets all comments for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts index e2f5968b668141..69382492ff40b1 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/get_comment.ts @@ -23,7 +23,7 @@ export const getCommentRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Get an alert or comment for a case`, + summary: `Get an alert or comment for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts index 03fe0747f83df9..ecd4bc6454e55d 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/patch_comment.ts @@ -23,7 +23,7 @@ export const patchCommentRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Update an alert or comment in a case`, + summary: `Update an alert or comment in a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts index d2cbd96b880b92..8128439b74672d 100644 --- a/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts +++ b/x-pack/plugins/cases/server/routes/api/comments/post_comment.ts @@ -22,7 +22,7 @@ export const postCommentRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Add an alert or comment to a case`, + summary: `Add an alert or comment to a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts index fe5c65dd54ffa3..e4d2c75689cd27 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_configure.ts @@ -15,7 +15,7 @@ export const getCaseConfigureRoute = createCasesRoute({ path: CASE_CONFIGURE_URL, routerOptions: { access: 'public', - description: `Get case settings`, + summary: `Get case settings`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts index 53bc6d958115e7..3201cb7005fb48 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/get_connectors.ts @@ -18,7 +18,7 @@ export const getConnectorsRoute = createCasesRoute({ routerOptions: { tags: ['access:casesGetConnectorsConfigure'], access: 'public', - description: `Get case connectors`, + summary: `Get case connectors`, }, handler: async ({ context, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts index dabc73325f2862..c028013332866a 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/patch_configure.ts @@ -17,7 +17,7 @@ export const patchCaseConfigureRoute = createCasesRoute({ path: CASE_CONFIGURE_DETAILS_URL, routerOptions: { access: 'public', - description: `Update case settings`, + summary: `Update case settings`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts index cf23dad956d169..6b6d6b1e484417 100644 --- a/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts +++ b/x-pack/plugins/cases/server/routes/api/configure/post_configure.ts @@ -17,7 +17,7 @@ export const postCaseConfigureRoute = createCasesRoute({ path: CASE_CONFIGURE_URL, routerOptions: { access: 'public', - description: `Add case settings`, + summary: `Add case settings`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts index 5a39b2ce6eadc7..1db0220365a021 100644 --- a/x-pack/plugins/cases/server/routes/api/stats/get_status.ts +++ b/x-pack/plugins/cases/server/routes/api/stats/get_status.ts @@ -21,7 +21,7 @@ export const getStatusRoute: CaseRoute = createCasesRoute({ options: { deprecated: true }, routerOptions: { access: 'public', - description: `Get case status summary`, + summary: `Get case status summary`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts index bf43cdef22b4ed..0a6c818cffa8b4 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/find_user_actions.ts @@ -22,7 +22,7 @@ export const findUserActionsRoute = createCasesRoute({ }, routerOptions: { access: 'public', - description: `Get user activity for a case`, + summary: `Get user activity for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts index 7f42a340cd8be5..e69e7197c1ece9 100644 --- a/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts +++ b/x-pack/plugins/cases/server/routes/api/user_actions/get_all_user_actions.ts @@ -26,7 +26,7 @@ export const getUserActionsRoute = createCasesRoute({ options: { deprecated: true }, routerOptions: { access: 'public', - description: `Get all user activity for a case`, + summary: `Get all user activity for a case`, }, handler: async ({ context, request, response }) => { try { diff --git a/x-pack/plugins/cloud/common/index.ts b/x-pack/plugins/cloud/common/index.ts new file mode 100644 index 00000000000000..4aa6ce8d5edf06 --- /dev/null +++ b/x-pack/plugins/cloud/common/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type { OnBoardingDefaultSolution } from './types'; diff --git a/x-pack/plugins/cloud/common/parse_onboarding_default_solution.test.ts b/x-pack/plugins/cloud/common/parse_onboarding_default_solution.test.ts new file mode 100644 index 00000000000000..de8b305ee452b2 --- /dev/null +++ b/x-pack/plugins/cloud/common/parse_onboarding_default_solution.test.ts @@ -0,0 +1,33 @@ +/* + * Copyright 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 { parseOnboardingSolution } from './parse_onboarding_default_solution'; + +describe('parseOnboardingSolution', () => { + it('should return undefined if there is no default solution defined', () => { + expect(parseOnboardingSolution()).toBeUndefined(); + }); + + it('should map correctly the cloud values to the Kibana values, regardless of case', () => { + [ + ['elasticsearch', 'es'], + ['Elasticsearch', 'es'], + ['observability', 'oblt'], + ['Observability', 'oblt'], + ['security', 'security'], + ['Security', 'security'], + ].forEach(([cloudValue, kibanaValue]) => { + expect(parseOnboardingSolution(cloudValue)).toBe(kibanaValue); + expect(parseOnboardingSolution(cloudValue.toUpperCase())).toBe(kibanaValue); + expect(parseOnboardingSolution(cloudValue.toLowerCase())).toBe(kibanaValue); + }); + }); + + it('should return undefined for unknown values', () => { + expect(parseOnboardingSolution('unknown')).toBeUndefined(); + }); +}); diff --git a/x-pack/plugins/cloud/common/parse_onboarding_default_solution.ts b/x-pack/plugins/cloud/common/parse_onboarding_default_solution.ts new file mode 100644 index 00000000000000..e5938f77af92fd --- /dev/null +++ b/x-pack/plugins/cloud/common/parse_onboarding_default_solution.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { OnBoardingDefaultSolution } from './types'; + +/** + * Cloud does not type the value of the "use case" that is set during onboarding for a deployment. Any string can + * be passed. This function maps the known values to the Kibana values. + * + * @param value The solution value set by Cloud. + * @returns The default solution value for onboarding that matches Kibana naming. + */ +export function parseOnboardingSolution(value?: string): OnBoardingDefaultSolution | undefined { + if (!value) return; + + const solutions: Array<{ + cloudValue: 'elasticsearch' | 'observability' | 'security'; + kibanaValue: OnBoardingDefaultSolution; + }> = [ + { + cloudValue: 'elasticsearch', + kibanaValue: 'es', + }, + { + cloudValue: 'observability', + kibanaValue: 'oblt', + }, + { + cloudValue: 'security', + kibanaValue: 'security', + }, + ]; + + return solutions.find(({ cloudValue }) => value.toLowerCase() === cloudValue)?.kibanaValue; +} diff --git a/x-pack/plugins/cloud/common/types.ts b/x-pack/plugins/cloud/common/types.ts new file mode 100644 index 00000000000000..ac4593fd0e2592 --- /dev/null +++ b/x-pack/plugins/cloud/common/types.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type OnBoardingDefaultSolution = 'es' | 'oblt' | 'security'; diff --git a/x-pack/plugins/cloud/public/mocks.tsx b/x-pack/plugins/cloud/public/mocks.tsx index 8bd4a933a0f1b0..dd5c5eced618a8 100644 --- a/x-pack/plugins/cloud/public/mocks.tsx +++ b/x-pack/plugins/cloud/public/mocks.tsx @@ -26,6 +26,7 @@ function createSetupMock(): jest.Mocked { isElasticStaffOwned: true, trialEndDate: new Date('2020-10-01T14:13:12Z'), registerCloudService: jest.fn(), + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, diff --git a/x-pack/plugins/cloud/public/plugin.test.ts b/x-pack/plugins/cloud/public/plugin.test.ts index 99e6f97946cca5..61ed4503246374 100644 --- a/x-pack/plugins/cloud/public/plugin.test.ts +++ b/x-pack/plugins/cloud/public/plugin.test.ts @@ -122,6 +122,15 @@ describe('Cloud Plugin', () => { expect(decodeCloudIdMock).toHaveBeenCalledWith('cloudId', expect.any(Object)); }); + it('exposes `onboarding.default_solution`', () => { + const { setup } = setupPlugin({ + onboarding: { + default_solution: 'Elasticsearch', + }, + }); + expect(setup.onboarding.defaultSolution).toBe('es'); + }); + describe('isServerlessEnabled', () => { it('is `true` when `serverless.projectId` is set', () => { const { setup } = setupPlugin({ diff --git a/x-pack/plugins/cloud/public/plugin.tsx b/x-pack/plugins/cloud/public/plugin.tsx index f0a561194b5621..0d071900418c3e 100644 --- a/x-pack/plugins/cloud/public/plugin.tsx +++ b/x-pack/plugins/cloud/public/plugin.tsx @@ -8,13 +8,15 @@ import React, { FC, PropsWithChildren } from 'react'; import type { Logger } from '@kbn/logging'; import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/public'; + import { registerCloudDeploymentMetadataAnalyticsContext } from '../common/register_cloud_deployment_id_analytics_context'; import { getIsCloudEnabled } from '../common/is_cloud_enabled'; import { parseDeploymentIdFromDeploymentUrl } from '../common/parse_deployment_id_from_deployment_url'; import { CLOUD_SNAPSHOTS_PATH } from '../common/constants'; import { decodeCloudId, type DecodedCloudId } from '../common/decode_cloud_id'; -import type { CloudSetup, CloudStart } from './types'; import { getFullCloudUrl } from '../common/utils'; +import { parseOnboardingSolution } from '../common/parse_onboarding_default_solution'; +import type { CloudSetup, CloudStart } from './types'; import { getSupportUrl } from './utils'; export interface CloudConfigType { @@ -31,6 +33,9 @@ export interface CloudConfigType { performance_url?: string; trial_end_date?: string; is_elastic_staff_owned?: boolean; + onboarding?: { + default_solution?: string; + }; serverless?: { project_id: string; project_name?: string; @@ -95,6 +100,9 @@ export class CloudPlugin implements Plugin { trialEndDate: trialEndDate ? new Date(trialEndDate) : undefined, isElasticStaffOwned, isCloudEnabled: this.isCloudEnabled, + onboarding: { + defaultSolution: parseOnboardingSolution(this.config.onboarding?.default_solution), + }, isServerlessEnabled: this.isServerlessEnabled, serverless: { projectId: this.config.serverless?.project_id, diff --git a/x-pack/plugins/cloud/public/types.ts b/x-pack/plugins/cloud/public/types.ts index 8de4f226beea4f..a7e34c79a8505e 100644 --- a/x-pack/plugins/cloud/public/types.ts +++ b/x-pack/plugins/cloud/public/types.ts @@ -6,6 +6,7 @@ */ import type { FC, PropsWithChildren } from 'react'; +import type { OnBoardingDefaultSolution } from '../common'; export interface CloudStart { /** @@ -174,6 +175,15 @@ export interface CloudSetup { * @param contextProvider The React component from the Service Provider. */ registerCloudService: (contextProvider: FC) => void; + /** + * Onboarding configuration + */ + onboarding: { + /** + * The default solution selected during onboarding. + */ + defaultSolution?: OnBoardingDefaultSolution; + }; /** * `true` when running on Serverless Elastic Cloud * Note that `isCloudEnabled` will always be true when `isServerlessEnabled` is. diff --git a/x-pack/plugins/cloud/server/__snapshots__/plugin.test.ts.snap b/x-pack/plugins/cloud/server/__snapshots__/plugin.test.ts.snap index c1fbbc93e96b5d..41002d0c48e6b8 100644 --- a/x-pack/plugins/cloud/server/__snapshots__/plugin.test.ts.snap +++ b/x-pack/plugins/cloud/server/__snapshots__/plugin.test.ts.snap @@ -17,6 +17,9 @@ Object { "isElasticStaffOwned": undefined, "isServerlessEnabled": false, "kibanaUrl": undefined, + "onboarding": Object { + "defaultSolution": undefined, + }, "projectsUrl": "https://cloud.elastic.co/projects/", "serverless": Object { "projectId": undefined, diff --git a/x-pack/plugins/cloud/server/config.ts b/x-pack/plugins/cloud/server/config.ts index 39babd548d99a4..de4ebd94b6f2b5 100644 --- a/x-pack/plugins/cloud/server/config.ts +++ b/x-pack/plugins/cloud/server/config.ts @@ -33,6 +33,11 @@ const configSchema = schema.object({ projects_url: offeringBasedSchema({ serverless: schema.string({ defaultValue: '/projects/' }) }), trial_end_date: schema.maybe(schema.string()), is_elastic_staff_owned: schema.maybe(schema.boolean()), + onboarding: schema.maybe( + schema.object({ + default_solution: schema.maybe(schema.string()), + }) + ), serverless: schema.maybe( schema.object( { @@ -68,6 +73,9 @@ export const config: PluginConfigDescriptor = { project_name: true, project_type: true, }, + onboarding: { + default_solution: true, + }, }, schema: configSchema, }; diff --git a/x-pack/plugins/cloud/server/mocks.ts b/x-pack/plugins/cloud/server/mocks.ts index 78ef284a5c9494..e77f58902bf3e8 100644 --- a/x-pack/plugins/cloud/server/mocks.ts +++ b/x-pack/plugins/cloud/server/mocks.ts @@ -25,6 +25,7 @@ function createSetupMock(): jest.Mocked { url: undefined, secretToken: undefined, }, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, diff --git a/x-pack/plugins/cloud/server/plugin.test.ts b/x-pack/plugins/cloud/server/plugin.test.ts index d13e04ca1138ac..f2ef8375b417e4 100644 --- a/x-pack/plugins/cloud/server/plugin.test.ts +++ b/x-pack/plugins/cloud/server/plugin.test.ts @@ -98,6 +98,15 @@ describe('Cloud Plugin', () => { expect(decodeCloudIdMock).toHaveBeenCalledWith('cloudId', expect.any(Object)); }); + it('exposes `onboarding.default_solution`', () => { + const { setup } = setupPlugin({ + onboarding: { + default_solution: 'Elasticsearch', + }, + }); + expect(setup.onboarding.defaultSolution).toBe('es'); + }); + describe('isServerlessEnabled', () => { it('is `true` when `serverless.projectId` is set', () => { const { setup } = setupPlugin({ diff --git a/x-pack/plugins/cloud/server/plugin.ts b/x-pack/plugins/cloud/server/plugin.ts index 322794b11fa21f..d8d5d397655e39 100644 --- a/x-pack/plugins/cloud/server/plugin.ts +++ b/x-pack/plugins/cloud/server/plugin.ts @@ -11,9 +11,11 @@ import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import { registerCloudDeploymentMetadataAnalyticsContext } from '../common/register_cloud_deployment_id_analytics_context'; import type { CloudConfigType } from './config'; import { registerCloudUsageCollector } from './collectors'; +import type { OnBoardingDefaultSolution } from '../common'; import { getIsCloudEnabled } from '../common/is_cloud_enabled'; import { parseDeploymentIdFromDeploymentUrl } from '../common/parse_deployment_id_from_deployment_url'; import { decodeCloudId, DecodedCloudId } from '../common/decode_cloud_id'; +import { parseOnboardingSolution } from '../common/parse_onboarding_default_solution'; import { getFullCloudUrl } from '../common/utils'; import { readInstanceSizeMb } from './env'; @@ -88,6 +90,15 @@ export interface CloudSetup { url?: string; secretToken?: string; }; + /** + * Onboarding configuration. + */ + onboarding: { + /** + * The default solution selected during onboarding. + */ + defaultSolution?: OnBoardingDefaultSolution; + }; /** * `true` when running on Serverless Elastic Cloud * Note that `isCloudEnabled` will always be true when `isServerlessEnabled` is. @@ -188,6 +199,9 @@ export class CloudPlugin implements Plugin { url: this.config.apm?.url, secretToken: this.config.apm?.secret_token, }, + onboarding: { + defaultSolution: parseOnboardingSolution(this.config.onboarding?.default_solution), + }, isServerlessEnabled, serverless: { projectId, diff --git a/x-pack/plugins/cloud_security_posture/common/constants.ts b/x-pack/plugins/cloud_security_posture/common/constants.ts index ef7191c9efe110..31f36b8d57a7c6 100644 --- a/x-pack/plugins/cloud_security_posture/common/constants.ts +++ b/x-pack/plugins/cloud_security_posture/common/constants.ts @@ -192,3 +192,5 @@ export const AZURE_CREDENTIALS_TYPE_TO_FIELDS_MAP = { managed_identity: [], manual: [], }; + +export const CLOUD_SECURITY_PLUGIN_VERSION = '1.8.1'; diff --git a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md b/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md index 16c826cbc9dd27..a6fdc6aa618ab9 100644 --- a/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md +++ b/x-pack/plugins/cloud_security_posture/common/dev_docs/__auto_generated_csp_requirements_test_coverage.md @@ -7,7 +7,7 @@ You can also check out the dedicated app view, which enables easier search and f ## Directory: x-pack/plugins/cloud_security_posture -**Total Tests:** 444 | **Skipped:** 5 (1.13%) | **Todo:** 0 (0.00%) +**Total Tests:** 458 | **Skipped:** 5 (1.09%) | **Todo:** 0 (0.00%) ![](https://img.shields.io/badge/UT-brightgreen) ![](https://img.shields.io/badge/HAS-SKIP-yellow) @@ -69,7 +69,6 @@ You can also check out the dedicated app view, which enables easier search and f | [useNavigateFindings](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | describe | | | | [creates a URL to findings page with correct path, filter and dataViewId](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | | [creates a URL to findings page with correct path and negated filter](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | -| [creates a URL to findings resource page with correct path and filter](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | | [creates a URL to vulnerabilities page with correct path, filter and dataViewId](x-pack/plugins/cloud_security_posture/public/common/hooks/use_navigate_findings.test.ts) | it | | | | [useUrlQuery](x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | describe | | | | [uses default query when no query is provided](x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.test.ts) | it | | | @@ -266,6 +265,14 @@ You can also check out the dedicated app view, which enables easier search and f | [Should return undefined when datastream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | | [Should return undefined when stream is undefined](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | | [Should return undefined when stream.var is invalid](x-pack/plugins/cloud_security_posture/public/components/fleet_extensions/utils.test.ts) | it | | | +| [NoFindingsStates](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | describe | | | +| [should show the indexing notification when CSPM is not installed and KSPM is indexing](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the indexing notification when KSPM is not installed and CSPM is indexing](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the indexing timout notification when CSPM is status is index-timeout](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the indexing timout notification when KSPM is status is index-timeout](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the unprivileged notification when CSPM is status is index-timeout](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the unprivileged notification when KSPM is status is index-timeout](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | +| [should show the not-installed notification when CSPM and KSPM status is not-installed](x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx) | it | | | | [](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | describe | | | | [renders cis integration name](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | | [renders benchmark version](x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx) | it | | | @@ -335,6 +342,13 @@ You can also check out the dedicated app view, which enables easier search and f | [](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | describe | | | | [calls Benchmark API](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | | [Display success state when result request is resolved](x-pack/plugins/cloud_security_posture/public/pages/rules/rules.test.tsx) | it | | | +| [use_change_csp_rule_state](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | describe | | | +| [should call http.post with the correct parameters](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should cancel queries and update query data onMutate](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should invalidate queries onSettled](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [should restore previous query data onError](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | +| [creates the new cache with rules in a unmute state](x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx) | it | | | | [](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | | [Header Info](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | describe | | | | [displays text details flyout header info](x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx) | it | | | @@ -464,9 +478,9 @@ You can also check out the dedicated app view, which enables easier search and f ## Directory: x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture -**Total Tests:** 37 | **Skipped:** 4 (10.81%) | **Todo:** 0 (0.00%) +**Total Tests:** 37 | **Skipped:** 0 (0.00%) | **Todo:** 0 (0.00%) -![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/SERVERLESS-pink) ![](https://img.shields.io/badge/API-INTEGRATION-purple) ![](https://img.shields.io/badge/HAS-SKIP-yellow) +![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/SERVERLESS-pink) ![](https://img.shields.io/badge/API-INTEGRATION-purple)
    Test Details @@ -490,10 +504,10 @@ You can also check out the dedicated app view, which enables easier search and f | [Should return 200 status code and paginate rules with a limit of PerPage](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/find_csp_benchmark_rule.ts) | it | | | | [cloud_security_posture](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/index.ts) | describe | | | | [GET /internal/cloud_security_posture/status](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | | | -| [STATUS = INDEXED TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | -| [Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | -| [Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [STATUS = INDEXED TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | describe | | | +| [Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | | +| [Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | | +| [Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexed.ts) | it | | | | [GET /internal/cloud_security_posture/status](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | describe | | | | [STATUS = INDEXING TEST](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | describe | | | | [Return kspm status indexing when logs-cloud_security_posture.findings_latest-default doesn](x-pack/test_serverless/api_integration/test_suites/security/cloud_security_posture/status/status_indexing.ts) | it | | | @@ -654,15 +668,21 @@ You can also check out the dedicated app view, which enables easier search and f ## Directory: x-pack/test/cloud_security_posture_functional -**Total Tests:** 190 | **Skipped:** 37 (19.47%) | **Todo:** 2 (1.05%) +**Total Tests:** 202 | **Skipped:** 41 (20.30%) | **Todo:** 3 (1.49%) -![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/HAS-TODO-green) ![](https://img.shields.io/badge/HAS-SKIP-yellow) +![](https://img.shields.io/badge/FTR-blue) ![](https://img.shields.io/badge/HAS-SKIP-yellow) ![](https://img.shields.io/badge/HAS-TODO-green)
    Test Details | Test Label | Type | Skipped | Todo | |------------|------|---------|------| +| [Access with custom roles](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | describe | | | +| [Access with valid user role](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [Access with invalid user role](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | +| [Access with custom roles - rule page](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | describe | | | +| [Access with valid user role](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | it | | | +| [Access with invalid user role](x-pack/test/cloud_security_posture_functional/pages/benchmark.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | | [Test adding Cloud Security Posture Integrations CNVM](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | describe | | | | [CNVM AWS](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | describe | | | | [Hyperlink on PostInstallation Modal should have the correct URL](x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts) | it | | | @@ -748,6 +768,9 @@ You can also check out the dedicated app view, which enables easier search and f | [displays accurate summary compliance score](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | | | | [TODO - Cloud Dashboard](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | describe | | ![](https://img.shields.io/badge/todo-green) | | [todo - displays accurate summary compliance score](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | | ![](https://img.shields.io/badge/todo-green) | +| [Access with custom roles](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | describe | | | +| [Access with valid user role](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | | | +| [todo - Access with invalid user role](x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | ![](https://img.shields.io/badge/todo-green) | | [Findings Page - Alerts](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | | | | [Create detection rule](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | | [Creates a detection rule from the Take Action button and navigates to rule page](x-pack/test/cloud_security_posture_functional/pages/findings_alerts.ts) | it | ![](https://img.shields.io/badge/skipped-yellow) | | @@ -796,6 +819,9 @@ You can also check out the dedicated app view, which enables easier search and f | [Reset fields to default](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | it | | | | [Findings Page - support muting rules](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | describe | | | | [verify only enabled rules appears](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | it | | | +| [Access with custom roles](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | describe | | | +| [Access with valid user role](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | it | | | +| [Access with invalid user role](x-pack/test/cloud_security_posture_functional/pages/findings.ts) | it | | | | [Cloud Security Posture](x-pack/test/cloud_security_posture_functional/pages/index.ts) | describe | | | | [Cloud Posture Rules Page](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | | [Rules Page - Rules Counters](x-pack/test/cloud_security_posture_functional/pages/rules.ts) | describe | ![](https://img.shields.io/badge/skipped-yellow) | | diff --git a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json b/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json index 98a7c6629ee7e2..8c177cd46e7139 100644 --- a/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json +++ b/x-pack/plugins/cloud_security_posture/common/scripts/__auto_generated_csp_test_log.json @@ -1148,7 +1148,6 @@ "describe('useNavigateFindings')", " it('creates a URL to findings page with correct path, filter and dataViewId')", " it('creates a URL to findings page with correct path and negated filter')", - " it('creates a URL to findings resource page with correct path and filter')", " it('creates a URL to vulnerabilities page with correct path, filter and dataViewId')" ], "testSuits": [ @@ -1182,16 +1181,6 @@ "isSkipped": false, "isTodo": false }, - { - "id": "creates-a-url-to-findings-resource-page-with-correct-path-and-filter", - "rawLine": " it('creates a URL to findings resource page with correct path and filter', () => {", - "line": " it('creates a URL to findings resource page with correct path and filter')", - "label": "creates a URL to findings resource page with correct path and filter", - "indent": 2, - "type": "it", - "isSkipped": false, - "isTodo": false - }, { "id": "creates-a-url-to-vulnerabilities-page-with-correct-path,-filter-and-dataviewid", "rawLine": " it('creates a URL to vulnerabilities page with correct path, filter and dataViewId', () => {", @@ -1234,16 +1223,6 @@ "isSkipped": false, "isTodo": false }, - { - "id": "creates-a-url-to-findings-resource-page-with-correct-path-and-filter", - "rawLine": " it('creates a URL to findings resource page with correct path and filter', () => {", - "line": " it('creates a URL to findings resource page with correct path and filter')", - "label": "creates a URL to findings resource page with correct path and filter", - "indent": 2, - "type": "it", - "isSkipped": false, - "isTodo": false - }, { "id": "creates-a-url-to-vulnerabilities-page-with-correct-path,-filter-and-dataviewid", "rawLine": " it('creates a URL to vulnerabilities page with correct path, filter and dataViewId', () => {", @@ -5695,6 +5674,190 @@ } ] }, + { + "filePath": "x-pack/plugins/cloud_security_posture/public/components/no_findings_states.test.tsx", + "fileName": "no_findings_states.test.tsx", + "directory": "x-pack/plugins/cloud_security_posture", + "tags": [ + "UT" + ], + "lines": [ + "describe('NoFindingsStates')", + " it('should show the indexing notification when CSPM is not installed and KSPM is indexing')", + " it('should show the indexing notification when KSPM is not installed and CSPM is indexing')", + " it('should show the indexing timout notification when CSPM is status is index-timeout')", + " it('should show the indexing timout notification when KSPM is status is index-timeout')", + " it('should show the unprivileged notification when CSPM is status is index-timeout')", + " it('should show the unprivileged notification when KSPM is status is index-timeout')", + " it('should show the not-installed notification when CSPM and KSPM status is not-installed')" + ], + "testSuits": [ + { + "id": "nofindingsstates", + "rawLine": "describe('NoFindingsStates', () => {", + "line": "describe('NoFindingsStates')", + "label": "NoFindingsStates", + "indent": 0, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-notification-when-cspm-is-not-installed-and-kspm-is-indexing", + "rawLine": " it('should show the indexing notification when CSPM is not installed and KSPM is indexing', async () => {", + "line": " it('should show the indexing notification when CSPM is not installed and KSPM is indexing')", + "label": "should show the indexing notification when CSPM is not installed and KSPM is indexing", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-notification-when-kspm-is-not-installed-and-cspm-is-indexing", + "rawLine": " it('should show the indexing notification when KSPM is not installed and CSPM is indexing', async () => {", + "line": " it('should show the indexing notification when KSPM is not installed and CSPM is indexing')", + "label": "should show the indexing notification when KSPM is not installed and CSPM is indexing", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-timout-notification-when-cspm-is-status-is-index-timeout", + "rawLine": " it('should show the indexing timout notification when CSPM is status is index-timeout', async () => {", + "line": " it('should show the indexing timout notification when CSPM is status is index-timeout')", + "label": "should show the indexing timout notification when CSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-timout-notification-when-kspm-is-status-is-index-timeout", + "rawLine": " it('should show the indexing timout notification when KSPM is status is index-timeout', async () => {", + "line": " it('should show the indexing timout notification when KSPM is status is index-timeout')", + "label": "should show the indexing timout notification when KSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-unprivileged-notification-when-cspm-is-status-is-index-timeout", + "rawLine": " it('should show the unprivileged notification when CSPM is status is index-timeout', async () => {", + "line": " it('should show the unprivileged notification when CSPM is status is index-timeout')", + "label": "should show the unprivileged notification when CSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-unprivileged-notification-when-kspm-is-status-is-index-timeout", + "rawLine": " it('should show the unprivileged notification when KSPM is status is index-timeout', async () => {", + "line": " it('should show the unprivileged notification when KSPM is status is index-timeout')", + "label": "should show the unprivileged notification when KSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-not-installed-notification-when-cspm-and-kspm-status-is-not-installed", + "rawLine": " it('should show the not-installed notification when CSPM and KSPM status is not-installed', async () => {", + "line": " it('should show the not-installed notification when CSPM and KSPM status is not-installed')", + "label": "should show the not-installed notification when CSPM and KSPM status is not-installed", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + } + ], + "tree": [ + { + "id": "nofindingsstates", + "rawLine": "describe('NoFindingsStates', () => {", + "line": "describe('NoFindingsStates')", + "label": "NoFindingsStates", + "indent": 0, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "should-show-the-indexing-notification-when-cspm-is-not-installed-and-kspm-is-indexing", + "rawLine": " it('should show the indexing notification when CSPM is not installed and KSPM is indexing', async () => {", + "line": " it('should show the indexing notification when CSPM is not installed and KSPM is indexing')", + "label": "should show the indexing notification when CSPM is not installed and KSPM is indexing", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-notification-when-kspm-is-not-installed-and-cspm-is-indexing", + "rawLine": " it('should show the indexing notification when KSPM is not installed and CSPM is indexing', async () => {", + "line": " it('should show the indexing notification when KSPM is not installed and CSPM is indexing')", + "label": "should show the indexing notification when KSPM is not installed and CSPM is indexing", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-timout-notification-when-cspm-is-status-is-index-timeout", + "rawLine": " it('should show the indexing timout notification when CSPM is status is index-timeout', async () => {", + "line": " it('should show the indexing timout notification when CSPM is status is index-timeout')", + "label": "should show the indexing timout notification when CSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-indexing-timout-notification-when-kspm-is-status-is-index-timeout", + "rawLine": " it('should show the indexing timout notification when KSPM is status is index-timeout', async () => {", + "line": " it('should show the indexing timout notification when KSPM is status is index-timeout')", + "label": "should show the indexing timout notification when KSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-unprivileged-notification-when-cspm-is-status-is-index-timeout", + "rawLine": " it('should show the unprivileged notification when CSPM is status is index-timeout', async () => {", + "line": " it('should show the unprivileged notification when CSPM is status is index-timeout')", + "label": "should show the unprivileged notification when CSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-unprivileged-notification-when-kspm-is-status-is-index-timeout", + "rawLine": " it('should show the unprivileged notification when KSPM is status is index-timeout', async () => {", + "line": " it('should show the unprivileged notification when KSPM is status is index-timeout')", + "label": "should show the unprivileged notification when KSPM is status is index-timeout", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-show-the-not-installed-notification-when-cspm-and-kspm-status-is-not-installed", + "rawLine": " it('should show the not-installed notification when CSPM and KSPM status is not-installed', async () => {", + "line": " it('should show the not-installed notification when CSPM and KSPM status is not-installed')", + "label": "should show the not-installed notification when CSPM and KSPM status is not-installed", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + } + ] + } + ] + }, { "filePath": "x-pack/plugins/cloud_security_posture/public/pages/benchmarks/benchmarks_table.test.tsx", "fileName": "benchmarks_table.test.tsx", @@ -7330,6 +7493,169 @@ } ] }, + { + "filePath": "x-pack/plugins/cloud_security_posture/public/pages/rules/use_change_csp_rule_state.test.tsx", + "fileName": "use_change_csp_rule_state.test.tsx", + "directory": "x-pack/plugins/cloud_security_posture", + "tags": [ + "UT" + ], + "lines": [ + "describe('use_change_csp_rule_state')", + " it('should call http.post with the correct parameters')", + " it('should cancel queries and update query data onMutate')", + " it('should invalidate queries onSettled')", + " it('should restore previous query data onError')", + " it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState')", + " it('creates the new cache with rules in a unmute state')" + ], + "testSuits": [ + { + "id": "use_change_csp_rule_state", + "rawLine": "describe('use_change_csp_rule_state', () => {", + "line": "describe('use_change_csp_rule_state')", + "label": "use_change_csp_rule_state", + "indent": 0, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-call-http.post-with-the-correct-parameters", + "rawLine": " it('should call http.post with the correct parameters', async () => {", + "line": " it('should call http.post with the correct parameters')", + "label": "should call http.post with the correct parameters", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-cancel-queries-and-update-query-data-onmutate", + "rawLine": " it('should cancel queries and update query data onMutate', async () => {", + "line": " it('should cancel queries and update query data onMutate')", + "label": "should cancel queries and update query data onMutate", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-invalidate-queries-onsettled", + "rawLine": " it('should invalidate queries onSettled', async () => {", + "line": " it('should invalidate queries onSettled')", + "label": "should invalidate queries onSettled", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-restore-previous-query-data-onerror", + "rawLine": " it('should restore previous query data onError', async () => {", + "line": " it('should restore previous query data onError')", + "label": "should restore previous query data onError", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "creates-the-new-set-of-cache-rules-in-a-muted-state-when-calling-createruleswithupdatedstate", + "rawLine": " it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState', async () => {", + "line": " it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState')", + "label": "creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "creates-the-new-cache-with-rules-in-a-unmute-state", + "rawLine": " it('creates the new cache with rules in a unmute state', async () => {", + "line": " it('creates the new cache with rules in a unmute state')", + "label": "creates the new cache with rules in a unmute state", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + } + ], + "tree": [ + { + "id": "use_change_csp_rule_state", + "rawLine": "describe('use_change_csp_rule_state', () => {", + "line": "describe('use_change_csp_rule_state')", + "label": "use_change_csp_rule_state", + "indent": 0, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "should-call-http.post-with-the-correct-parameters", + "rawLine": " it('should call http.post with the correct parameters', async () => {", + "line": " it('should call http.post with the correct parameters')", + "label": "should call http.post with the correct parameters", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-cancel-queries-and-update-query-data-onmutate", + "rawLine": " it('should cancel queries and update query data onMutate', async () => {", + "line": " it('should cancel queries and update query data onMutate')", + "label": "should cancel queries and update query data onMutate", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-invalidate-queries-onsettled", + "rawLine": " it('should invalidate queries onSettled', async () => {", + "line": " it('should invalidate queries onSettled')", + "label": "should invalidate queries onSettled", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "should-restore-previous-query-data-onerror", + "rawLine": " it('should restore previous query data onError', async () => {", + "line": " it('should restore previous query data onError')", + "label": "should restore previous query data onError", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "creates-the-new-set-of-cache-rules-in-a-muted-state-when-calling-createruleswithupdatedstate", + "rawLine": " it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState', async () => {", + "line": " it('creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState')", + "label": "creates the new set of cache rules in a muted state when calling createRulesWithUpdatedState", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "creates-the-new-cache-with-rules-in-a-unmute-state", + "rawLine": " it('creates the new cache with rules in a unmute state', async () => {", + "line": " it('creates the new cache with rules in a unmute state')", + "label": "creates the new cache with rules in a unmute state", + "indent": 2, + "type": "it", + "isSkipped": false, + "isTodo": false + } + ] + } + ] + }, { "filePath": "x-pack/plugins/cloud_security_posture/public/pages/vulnerabilities/vulnerabilities_finding_flyout/vulnerability_finding_flyout.test.tsx", "fileName": "vulnerability_finding_flyout.test.tsx", @@ -10683,12 +11009,11 @@ "tags": [ "FTR", "SERVERLESS", - "API INTEGRATION", - "HAS SKIP" + "API INTEGRATION" ], "lines": [ " describe('GET /internal/cloud_security_posture/status')", - " describe.skip('STATUS = INDEXED TEST')", + " describe('STATUS = INDEXED TEST')", " it(`Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents`)", " it(`Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents`)", " it(`Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents`)" @@ -10706,12 +11031,12 @@ }, { "id": "status-=-indexed-test", - "rawLine": " describe.skip('STATUS = INDEXED TEST', () => {", - "line": " describe.skip('STATUS = INDEXED TEST')", + "rawLine": " describe('STATUS = INDEXED TEST', () => {", + "line": " describe('STATUS = INDEXED TEST')", "label": "STATUS = INDEXED TEST", "indent": 4, "type": "describe", - "isSkipped": true, + "isSkipped": false, "isTodo": false }, { @@ -10758,12 +11083,12 @@ "children": [ { "id": "status-=-indexed-test", - "rawLine": " describe.skip('STATUS = INDEXED TEST', () => {", - "line": " describe.skip('STATUS = INDEXED TEST')", + "rawLine": " describe('STATUS = INDEXED TEST', () => {", + "line": " describe('STATUS = INDEXED TEST')", "label": "STATUS = INDEXED TEST", "indent": 4, "type": "describe", - "isSkipped": true, + "isSkipped": false, "isTodo": false, "children": [ { @@ -10773,7 +11098,7 @@ "label": "Return kspm status indexed when logs-cloud_security_posture.findings_latest-default contains new kspm documents", "indent": 6, "type": "it", - "isSkipped": true, + "isSkipped": false, "isTodo": false }, { @@ -10783,7 +11108,7 @@ "label": "Return cspm status indexed when logs-cloud_security_posture.findings_latest-default contains new cspm documents", "indent": 6, "type": "it", - "isSkipped": true, + "isSkipped": false, "isTodo": false }, { @@ -10793,7 +11118,7 @@ "label": "Return vuln status indexed when logs-cloud_security_posture.vulnerabilities_latest-default contains new documents", "indent": 6, "type": "it", - "isSkipped": true, + "isSkipped": false, "isTodo": false } ] @@ -13678,6 +14003,151 @@ } ] }, + { + "filePath": "x-pack/test/cloud_security_posture_functional/pages/benchmark.ts", + "fileName": "benchmark.ts", + "directory": "x-pack/test/cloud_security_posture_functional", + "tags": [ + "FTR", + "HAS SKIP" + ], + "lines": [ + " describe('Access with custom roles')", + " it.skip('Access with valid user role')", + " it.skip('Access with invalid user role')", + " describe('Access with custom roles - rule page')", + " it('Access with valid user role')", + " it.skip('Access with invalid user role')" + ], + "testSuits": [ + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 2, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-valid-user-role", + "rawLine": " it.skip('Access with valid user role', async () => {", + "line": " it.skip('Access with valid user role')", + "label": "Access with valid user role", + "indent": 4, + "type": "it", + "isSkipped": true, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it.skip('Access with invalid user role', async () => {});", + "line": " it.skip('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 4, + "type": "it", + "isSkipped": true, + "isTodo": false + }, + { + "id": "access-with-custom-roles---rule-page", + "rawLine": " describe('Access with custom roles - rule page', async () => {", + "line": " describe('Access with custom roles - rule page')", + "label": "Access with custom roles - rule page", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it.skip('Access with invalid user role', async () => {});", + "line": " it.skip('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": true, + "isTodo": false + } + ], + "tree": [ + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 2, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "access-with-valid-user-role", + "rawLine": " it.skip('Access with valid user role', async () => {", + "line": " it.skip('Access with valid user role')", + "label": "Access with valid user role", + "indent": 4, + "type": "it", + "isSkipped": true, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it.skip('Access with invalid user role', async () => {});", + "line": " it.skip('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 4, + "type": "it", + "isSkipped": true, + "isTodo": false + }, + { + "id": "access-with-custom-roles---rule-page", + "rawLine": " describe('Access with custom roles - rule page', async () => {", + "line": " describe('Access with custom roles - rule page')", + "label": "Access with custom roles - rule page", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it.skip('Access with invalid user role', async () => {});", + "line": " it.skip('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": true, + "isTodo": false + } + ] + } + ] + } + ] + }, { "filePath": "x-pack/test/cloud_security_posture_functional/pages/cis_integrations/cnvm/cis_integration_cnvm.ts", "fileName": "cis_integration_cnvm.ts", @@ -15516,6 +15986,7 @@ "directory": "x-pack/test/cloud_security_posture_functional", "tags": [ "FTR", + "HAS SKIP", "HAS TODO" ], "lines": [ @@ -15523,7 +15994,10 @@ " describe('Kubernetes Dashboard')", " it('displays accurate summary compliance score')", " describe('TODO - Cloud Dashboard', () => {", - " it('todo - displays accurate summary compliance score', async () => {});" + " it('todo - displays accurate summary compliance score', async () => {});", + " describe('Access with custom roles')", + " it('Access with valid user role')", + " it.skip('todo - Access with invalid user role')" ], "testSuits": [ { @@ -15575,6 +16049,36 @@ "type": "it", "isSkipped": false, "isTodo": true + }, + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "todo---access-with-invalid-user-role", + "rawLine": " it.skip('todo - Access with invalid user role', async () => {});", + "line": " it.skip('todo - Access with invalid user role')", + "label": "todo - Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": true, + "isTodo": true } ], "tree": [ @@ -15631,6 +16135,38 @@ "isTodo": true } ] + }, + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "todo---access-with-invalid-user-role", + "rawLine": " it.skip('todo - Access with invalid user role', async () => {});", + "line": " it.skip('todo - Access with invalid user role')", + "label": "todo - Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": true, + "isTodo": true + } + ] } ] } @@ -16393,7 +16929,10 @@ " it('Remove fields from the Findings DataTable')", " it('Reset fields to default')", " describe('Findings Page - support muting rules')", - " it(`verify only enabled rules appears`)" + " it(`verify only enabled rules appears`)", + " describe('Access with custom roles')", + " it('Access with valid user role')", + " it('Access with invalid user role')" ], "testSuits": [ { @@ -16565,6 +17104,36 @@ "type": "it", "isSkipped": false, "isTodo": false + }, + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it('Access with invalid user role', async () => {", + "line": " it('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false } ], "tree": [ @@ -16751,6 +17320,38 @@ "isTodo": false } ] + }, + { + "id": "access-with-custom-roles", + "rawLine": " describe('Access with custom roles', async () => {", + "line": " describe('Access with custom roles')", + "label": "Access with custom roles", + "indent": 4, + "type": "describe", + "isSkipped": false, + "isTodo": false, + "children": [ + { + "id": "access-with-valid-user-role", + "rawLine": " it('Access with valid user role', async () => {", + "line": " it('Access with valid user role')", + "label": "Access with valid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + }, + { + "id": "access-with-invalid-user-role", + "rawLine": " it('Access with invalid user role', async () => {", + "line": " it('Access with invalid user role')", + "label": "Access with invalid user role", + "indent": 6, + "type": "it", + "isSkipped": false, + "isTodo": false + } + ] } ] }, 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 index 0fba4f27ed23ad..9e5e8fa67058f9 100644 --- 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 @@ -46,22 +46,39 @@ const mockCloudPostureDataTable = { getRowsFromPages: jest.fn(), } as any; +const mockRows = [ + { + id: '1', + raw: { + field1: 'Label 1', + field2: 'Label 2', + }, + flattened: { + field1: 'Label 1', + field2: 'Label 2', + }, + }, +] as any; + const renderDataTable = (props: Partial = {}) => { const defaultProps: CloudSecurityDataTableProps = { isLoading: false, defaultColumns: mockDefaultColumns, - rows: [], + rows: props.rows || mockRows, total: 0, flyoutComponent: () => <>, cloudPostureDataTable: mockCloudPostureDataTable, loadMore: jest.fn(), + createRuleFn: jest.fn(), title: 'Test Table', }; + const propsWithDefaults = { ...defaultProps, ...props }; + return render( - + ); @@ -69,31 +86,17 @@ const renderDataTable = (props: Partial = {}) => { describe('CloudSecurityDataTable', () => { it('renders loading state', () => { - const { getByTestId } = renderDataTable({ isLoading: true }); + const { getByTestId } = renderDataTable({ isLoading: true, rows: [] }); expect(getByTestId('unifiedDataTableLoading')).toBeInTheDocument(); }); it('renders empty state when no rows are present', () => { - const { getByTestId } = renderDataTable(); + const { getByTestId } = renderDataTable({ rows: [] }); 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, }); @@ -101,4 +104,29 @@ describe('CloudSecurityDataTable', () => { expect(getByText('Label 1')).toBeInTheDocument(); expect(getByText('Label 2')).toBeInTheDocument(); }); + + it('renders data table with actions button', async () => { + const { getByRole } = renderDataTable({ + rows: mockRows, + total: mockRows.length, + }); + + const showActions = getByRole('button', { + name: 'More actions', + }); + + expect(showActions).toBeInTheDocument(); + }); + + it('renders data table without actions button', async () => { + const { queryByRole } = renderDataTable({ + createRuleFn: undefined, + rows: mockRows, + total: mockRows.length, + }); + const showActions = queryByRole('button', { + name: 'More actions', + }); + expect(showActions).toBeNull(); + }); }); 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 5ec9ef01cb7676..623de8401810ce 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 @@ -8,9 +8,15 @@ import React, { useState, useMemo } from 'react'; import { UnifiedDataTableSettings, useColumns } from '@kbn/unified-data-table'; import { UnifiedDataTable, DataLoadingState } from '@kbn/unified-data-table'; import { CellActionsProvider } from '@kbn/cell-actions'; +import { HttpSetup } from '@kbn/core-http-browser'; import { SHOW_MULTIFIELDS, SORT_DEFAULT_ORDER_SETTING } from '@kbn/discover-utils'; import { DataTableRecord } from '@kbn/discover-utils/types'; -import { EuiDataGridCellValueElementProps, EuiDataGridStyle, EuiProgress } from '@elastic/eui'; +import { + EuiDataGridCellValueElementProps, + EuiDataGridControlColumn, + EuiDataGridStyle, + EuiProgress, +} from '@elastic/eui'; import { AddFieldFilterHandler } from '@kbn/unified-field-list'; import { generateFilters } from '@kbn/data-plugin/public'; import { DocViewFilterFn } from '@kbn/unified-doc-viewer/types'; @@ -22,7 +28,9 @@ import { MAX_FINDINGS_TO_LOAD } from '../../common/constants'; import { useStyles } from './use_styles'; import { AdditionalControls } from './additional_controls'; import { useDataViewContext } from '../../common/contexts/data_view_context'; +import { TakeAction } from '../take_action'; +import { RuleResponse } from '../../common/types'; export interface CloudSecurityDefaultColumn { id: string; width?: number; @@ -77,6 +85,11 @@ export interface CloudSecurityDataTableProps { * Height override for the data grid. */ height?: number | string; + + /** + * This function will be used in the control column to create a rule for a specific finding. + */ + createRuleFn?: (rowIndex: number) => ((http: HttpSetup) => Promise) | undefined; /* Optional props passed to Columns to display Provided Labels as Column name instead of field name */ columnHeaders?: Record; /** @@ -97,6 +110,7 @@ export const CloudSecurityDataTable = ({ customCellRenderer, groupSelectorComponent, height, + createRuleFn, columnHeaders, hasDistributionBar = true, ...rest @@ -266,6 +280,20 @@ export const CloudSecurityDataTable = ({ /> ); + const externalControlColumns: EuiDataGridControlColumn[] | undefined = createRuleFn + ? [ + { + id: 'select', + width: 20, + headerCellRender: () => null, + rowCellRender: ({ rowIndex }) => + createRuleFn && ( + + ), + }, + ] + : undefined; + const rowHeightState = 0; const loadingStyle = { @@ -312,6 +340,7 @@ export const CloudSecurityDataTable = ({ showTimeCol={false} settings={settings} onFetchMoreRecords={loadMore} + externalControlColumns={externalControlColumns} externalCustomRenderers={externalCustomRenderers} externalAdditionalControls={externalAdditionalControls} gridStyleOverride={gridStyle} diff --git a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx index a11459194036ef..87d6d109b7db09 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/take_action.tsx @@ -8,6 +8,7 @@ import React, { useState } from 'react'; import { EuiButton, + EuiButtonIcon, EuiContextMenuItem, EuiContextMenuPanel, EuiFlexGroup, @@ -19,6 +20,7 @@ import { import { toMountPoint } from '@kbn/react-kibana-mount'; import type { HttpSetup } from '@kbn/core/public'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n as kbnI18n } from '@kbn/i18n'; import { QueryClient, useQueryClient } from '@tanstack/react-query'; import type { RuleResponse } from '../common/types'; import { CREATE_RULE_ACTION_SUBJ, TAKE_ACTION_SUBJ } from './test_subjects'; @@ -33,6 +35,7 @@ interface TakeActionProps { enableBenchmarkRuleFn?: () => Promise; disableBenchmarkRuleFn?: () => Promise; isCreateDetectionRuleDisabled?: boolean; + isDataGridControlColumn?: boolean; } export const showCreateDetectionRuleSuccessToast = ( @@ -170,6 +173,7 @@ export const TakeAction = ({ enableBenchmarkRuleFn, disableBenchmarkRuleFn, isCreateDetectionRuleDisabled = false, + isDataGridControlColumn: isDataTableAction = false, }: TakeActionProps) => { const queryClient = useQueryClient(); const [isPopoverOpen, setPopoverOpen] = useState(false); @@ -182,7 +186,7 @@ export const TakeAction = ({ prefix: 'smallContextMenuPopover', }); - const button = ( + const button = !isDataTableAction ? ( + ) : ( + setPopoverOpen(!isPopoverOpen)} + /> ); const actionsItems = []; 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 7207c47cc0029a..a93907825bc7d7 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 @@ -8,6 +8,7 @@ import React from 'react'; import { Filter } from '@kbn/es-query'; import { DataTableRecord } from '@kbn/discover-utils/types'; +import { HttpSetup } from '@kbn/core-http-browser'; import { i18n } from '@kbn/i18n'; import { EuiDataGridCellValueElementProps, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import * as TEST_SUBJECTS from '../test_subjects'; @@ -20,6 +21,7 @@ import { TimestampTableCell } from '../../../components/timestamp_table_cell'; import { CspEvaluationBadge } from '../../../components/csp_evaluation_badge'; import { CspFinding } from '../../../../common/schemas/csp_finding'; import { FindingsRuleFlyout } from '../findings_flyout/findings_flyout'; +import { createDetectionRuleFromBenchmarkRule } from '../utils/create_detection_rule_from_benchmark'; import { findingsTableFieldLabels } from './findings_table_field_labels'; interface LatestFindingsTableProps { @@ -35,6 +37,10 @@ const isCspFinding = (source: Record | undefined): source is CspFin return source?.result?.evaluation !== undefined; }; +const getCspFinding = (source: Record | undefined): CspFinding | false => { + return isCspFinding(source) && (source as CspFinding); +}; + /** * This Wrapper component renders the children if the given row is a CspFinding * it uses React's Render Props pattern @@ -46,8 +52,7 @@ const CspFindingRenderer = ({ row: DataTableRecord; children: ({ finding }: { finding: CspFinding }) => JSX.Element; }) => { - const source = row.raw._source; - const finding = isCspFinding(source) && (source as CspFinding); + const finding = getCspFinding(row.raw._source); if (!finding) return <>; return children({ finding }); }; @@ -104,6 +109,13 @@ export const LatestFindingsTable = ({ showDistributionBar, }); + const createMisconfigurationRuleFn = (rowIndex: number) => { + const finding = getCspFinding(rows[rowIndex].raw._source); + if (!finding) return; + + return async (http: HttpSetup) => createDetectionRuleFromBenchmarkRule(http, finding.rule); + }; + return ( {error ? ( @@ -137,6 +149,7 @@ export const LatestFindingsTable = ({ customCellRenderer={customCellRenderer} groupSelectorComponent={groupSelectorComponent} height={height} + createRuleFn={createMisconfigurationRuleFn} columnHeaders={findingsTableFieldLabels} /> diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx index 3777646917e4ad..2301a4a8ebcfe0 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_flyout.tsx @@ -99,7 +99,6 @@ export const RuleFlyout = ({ onClose, rule }: RuleFlyoutProps) => { return ( | undefined +): CspVulnerabilityFinding | false => { + return isCspVulnerabilityFinding(source) && (source as CspVulnerabilityFinding); +}; + /** * This Wrapper component renders the children if the given row is a CspVulnerabilityFinding * it uses React's Render Props pattern @@ -45,8 +53,7 @@ const CspVulnerabilityFindingRenderer = ({ row: DataTableRecord; children: ({ finding }: { finding: CspVulnerabilityFinding }) => JSX.Element; }) => { - const source = row.raw._source; - const finding = isCspVulnerabilityFinding(source) && (source as CspVulnerabilityFinding); + const finding = getCspVulnerabilityFinding(row.raw._source); if (!finding) return <>; return children({ finding }); }; @@ -94,6 +101,14 @@ export const LatestVulnerabilitiesTable = ({ nonPersistedFilters, }); + const createVulnerabilityRuleFn = (rowIndex: number) => { + const finding = getCspVulnerabilityFinding(rows[rowIndex].raw._source); + if (!finding) return; + + return async (http: HttpSetup) => + createDetectionRuleFromVulnerabilityFinding(http, finding.vulnerability); + }; + return ( <> {error ? ( @@ -109,6 +124,7 @@ export const LatestVulnerabilitiesTable = ({ rows={rows} total={total} flyoutComponent={flyoutComponent} + createRuleFn={createVulnerabilityRuleFn} cloudPostureDataTable={cloudPostureDataTable} loadMore={fetchNextPage} title={title} diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts index 6697dbdbbea56b..556ab0c7c830c9 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_findings_transform.ts @@ -16,7 +16,7 @@ const LATEST_FINDINGS_TRANSFORM_V830 = 'cloud_security_posture.findings_latest-d const LATEST_FINDINGS_TRANSFORM_V840 = 'cloud_security_posture.findings_latest-default-8.4.0'; const LATEST_FINDINGS_TRANSFORM_V880 = 'cloud_security_posture.findings_latest-default-8.8.0'; -const CURRENT_FINDINGS_TRANSFORM = 'cloud_security_posture.findings_latest-default-8.15.0'; +const CURRENT_FINDINGS_TRANSFORM_VERSION = 'cloud_security_posture.findings_latest-default-8.15.0'; export const DEPRECATED_FINDINGS_TRANSFORMS_VERSION = [ LATEST_FINDINGS_TRANSFORM_V830, @@ -25,7 +25,7 @@ export const DEPRECATED_FINDINGS_TRANSFORMS_VERSION = [ ]; export const latestFindingsTransform: TransformPutTransformRequest = { - transform_id: CURRENT_FINDINGS_TRANSFORM, + transform_id: CURRENT_FINDINGS_TRANSFORM_VERSION, description: 'Defines findings transformation to view only the latest finding per resource', source: { index: FINDINGS_INDEX_PATTERN, diff --git a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts index 2be5cf6072cf6e..c7cd2dd0921f70 100644 --- a/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts +++ b/x-pack/plugins/cloud_security_posture/server/create_transforms/latest_vulnerabilities_transforms.ts @@ -13,14 +13,15 @@ import { VULNERABILITIES_INDEX_PATTERN, } from '../../common/constants'; -const CURRENT_VULN_VERSION = 'cloud_security_posture.vulnerabilities_latest-default-8.15.0'; +const CURRENT_VULN_TRANSFORM_VERSION = + 'cloud_security_posture.vulnerabilities_latest-default-8.15.0'; export const DEPRECATED_VULN_TRANSFORM_VERSIONS = [ 'cloud_security_posture.vulnerabilities_latest-default-8.8.0', ]; export const latestVulnerabilitiesTransform: TransformPutTransformRequest = { - transform_id: CURRENT_VULN_VERSION, + transform_id: CURRENT_VULN_TRANSFORM_VERSION, description: 'Defines vulnerabilities transformation to view only the latest vulnerability per resource', source: { diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts index 01b3fb0d93be67..bbcb7f5b2c6b32 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/components/i18n.ts @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; export const txtDestinationDashboardNotFound = (dashboardId?: string) => i18n.translate('xpack.dashboard.drilldown.errorDestinationDashboardIsMissing', { defaultMessage: - "Destination dashboard ('{dashboardId}') no longer exists. Choose another dashboard.", + "Destination dashboard (''{dashboardId}'') no longer exists. Choose another dashboard.", values: { dashboardId, }, diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts index fc4db29b758c44..f10af0b74ca274 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/search_strategy/esql_requests/get_count_and_cardinality.ts @@ -8,7 +8,7 @@ import { ESQL_ASYNC_SEARCH_STRATEGY } from '@kbn/data-plugin/common'; import pLimit from 'p-limit'; import { chunk } from 'lodash'; import { isDefined } from '@kbn/ml-is-defined'; -import type { ESQLSearchReponse } from '@kbn/es-types'; +import type { ESQLSearchResponse } from '@kbn/es-types'; import { appendToESQLQuery } from '@kbn/esql-utils'; import type { UseCancellableSearch } from '@kbn/ml-cancellable-search'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; @@ -111,7 +111,7 @@ const getESQLOverallStatsInChunk = async ({ if (!esqlResults) { return; } - const esqlResultsResp = esqlResults.rawResponse as unknown as ESQLSearchReponse; + const esqlResultsResp = esqlResults.rawResponse as unknown as ESQLSearchResponse; const sampleCount = !isDefined(limitSize) ? totalCount : limitSize; fieldsToFetch.forEach((field, idx) => { diff --git a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx index e5cee004d67826..42a84efd0ccc43 100644 --- a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.test.tsx @@ -28,7 +28,7 @@ describe('EnterpriseSearchAISearchPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'AI Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.tsx index ec0c94b57455d0..ea18568c29189f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/ai_search/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { AI_SEARCH_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetAiSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; @@ -23,7 +23,7 @@ export const EnterpriseSearchAISearchPageTemplate: React.FC = } diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.tsx index 67180252e45d79..cf46363c236005 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.tsx @@ -13,7 +13,7 @@ import useObservable from 'react-use/lib/useObservable'; import type { EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; -import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { generateEncodedPath } from '../../../shared/encode_path_params'; import { KibanaLogic } from '../../../shared/kibana'; import { SetAnalyticsChrome } from '../../../shared/kibana_chrome'; @@ -87,7 +87,7 @@ export const EnterpriseSearchAnalyticsPageTemplate: React.FC< {...pageTemplateProps} solutionNav={{ items: chromeStyle === 'classic' ? navItems : undefined, - name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME, + name: SEARCH_PRODUCT_NAME, }} setPageChrome={pageChrome && } > diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_table/column_headers.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_table/column_headers.tsx index b36d71a49de13e..8bc4da27dcbb7d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_table/column_headers.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings_table/column_headers.tsx @@ -43,6 +43,7 @@ export const ColumnHeaders: React.FC = () => { { defaultMessage: 'A snippet is an escaped representaiton of a field value. Query matches are encapsulated in tags for highlighting. Fallback will look for a snippet match, but fallback to an escaped raw value if none is found. Range is between 20-1000. Defaults to 100.', + ignoreTag: true, } )} /> diff --git a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx index f8f390b1785b85..ec745ce77be2f9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/applications/components/layout/page_template.tsx @@ -13,7 +13,7 @@ import useObservable from 'react-use/lib/useObservable'; import type { EuiSideNavItemTypeEnhanced } from '@kbn/core-chrome-browser'; -import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { KibanaLogic } from '../../../shared/kibana'; import { SetEnterpriseSearchApplicationsChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; @@ -99,7 +99,7 @@ export const EnterpriseSearchApplicationsPageTemplate: React.FC< {...pageTemplateProps} solutionNav={{ items: chromeStyle === 'classic' ? navItems : undefined, - name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME, + name: SEARCH_PRODUCT_NAME, }} restrictWidth={restrictWidth} setPageChrome={pageChrome && } diff --git a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx index a6885bb8adc9ce..99eba7d57b1088 100644 --- a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.test.tsx @@ -28,7 +28,7 @@ describe('EnterpriseSearchElasticsearchPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Elasticsearch', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.tsx index 81ba64913879e4..7f2eded8a65659 100644 --- a/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/elasticsearch/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { ELASTICSEARCH_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetElasticsearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; @@ -24,7 +24,7 @@ export const EnterpriseSearchElasticsearchPageTemplate: React.FC} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx index 0ff30a31ebd343..f1f271a5e0cf20 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetEnterpriseSearchContentChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; @@ -24,7 +24,7 @@ export const EnterpriseSearchContentPageTemplate: React.FC = {...pageTemplateProps} solutionNav={{ items: useEnterpriseSearchNav(), - name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME, + name: SEARCH_PRODUCT_NAME, }} setPageChrome={pageChrome && } > diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts index 52d59ae81ccef0..c9e2bb0dd2b45b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/utils/connector_status_helpers.ts @@ -44,9 +44,10 @@ export function connectorStatusToText(connector: Connector): string { ); } if ( - connector.error === SyncStatus.ERROR || - connector.last_sync_error !== null || - connector.last_access_control_sync_error !== null + connector.last_sync_status === SyncStatus.ERROR || + connector.last_access_control_sync_status === SyncStatus.ERROR || + connector.last_sync_error != null || + connector.last_access_control_sync_error != null ) { return i18n.translate( 'xpack.enterpriseSearch.content.searchIndices.connectorStatus.syncFailure.label', @@ -87,9 +88,10 @@ export function connectorStatusToColor(connector: Connector): 'warning' | 'dange if ( isLastSeenOld(connector) || connectorStatus === ConnectorStatus.ERROR || - connector.error === SyncStatus.ERROR || - connector.last_sync_error !== null || - connector.last_access_control_sync_error !== null + connector.last_sync_status === SyncStatus.ERROR || + connector.last_access_control_sync_status === SyncStatus.ERROR || + connector.last_sync_error != null || + connector.last_access_control_sync_error != null ) { return 'danger'; } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx index 0929e81d02cbea..b3589189b9a557 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; @@ -23,7 +23,7 @@ export const EnterpriseSearchOverviewPageTemplate: React.FC = } diff --git a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.tsx index 704f9d06f3e194..11044fa04b956d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetSearchExperiencesChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; @@ -23,7 +23,7 @@ export const EnterpriseSearchSearchExperiencesPageTemplate: React.FC} diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/get_cloud_enterprise_search_host/get_cloud_enterprise_search_host.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/get_cloud_enterprise_search_host/get_cloud_enterprise_search_host.test.ts index 06d07f12668ee8..71b413b4870904 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/get_cloud_enterprise_search_host/get_cloud_enterprise_search_host.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/get_cloud_enterprise_search_host/get_cloud_enterprise_search_host.test.ts @@ -15,6 +15,7 @@ const defaultPortCloud = { cloudHost: 'us-central1.gcp.cloud.es.io', cloudDefaultPort: '443', registerCloudService: jest.fn(), + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -29,6 +30,7 @@ const customPortCloud = { cloudHost: 'us-central1.gcp.cloud.es.io', cloudDefaultPort: '9243', registerCloudService: jest.fn(), + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -39,6 +41,7 @@ const missingDeploymentIdCloud = { 'dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvOjkyNDMkYWMzMWViYjkwMjQxNzczMTU3MDQzYzM0ZmQyNmZkNDYkYTRjMDYyMzBlNDhjOGZjZTdiZTg4YTA3NGEzYmIzZTA=', isCloudEnabled: true, registerCloudService: jest.fn(), + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -48,6 +51,7 @@ const noCloud = { cloudId: undefined, isCloudEnabled: false, registerCloudService: jest.fn(), + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, diff --git a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx index ab6585f5e69611..5f6fe605858bf0 100644 --- a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.test.tsx @@ -28,7 +28,7 @@ describe('EnterpriseSearchVectorSearchPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Vector Search' }); + expect(wrapper.prop('solutionNav')).toEqual({ items: [], name: 'Search' }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.tsx index 44db21bb070d97..60b998958b6b22 100644 --- a/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/vector_search/components/layout/page_template.tsx @@ -7,7 +7,7 @@ import React from 'react'; -import { VECTOR_SEARCH_PLUGIN } from '../../../../../common/constants'; +import { SEARCH_PRODUCT_NAME } from '../../../../../common/constants'; import { SetVectorSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, @@ -26,7 +26,7 @@ export const EnterpriseSearchVectorSearchPageTemplate: React.FC} > diff --git a/x-pack/plugins/features/common/feature_kibana_privileges.ts b/x-pack/plugins/features/common/feature_kibana_privileges.ts index 49c001c890b692..54913e08223c54 100644 --- a/x-pack/plugins/features/common/feature_kibana_privileges.ts +++ b/x-pack/plugins/features/common/feature_kibana_privileges.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { FeatureKibanaPrivilegesReference } from './feature_kibana_privileges_reference'; + /** * Feature privilege definition */ @@ -263,4 +265,11 @@ export interface FeatureKibanaPrivileges { * @see UICapabilities */ ui: readonly string[]; + + /** + * An optional list of other registered feature or sub-feature privileges that this privilege is composed of. When + * privilege is registered with Elasticsearch, it will be expanded to grant everything that referenced privileges + * grant. This property can only be set in the feature configuration overrides. + */ + composedOf?: readonly FeatureKibanaPrivilegesReference[]; } diff --git a/x-pack/plugins/features/common/feature_kibana_privileges_reference.ts b/x-pack/plugins/features/common/feature_kibana_privileges_reference.ts new file mode 100644 index 00000000000000..3835579fbdb59d --- /dev/null +++ b/x-pack/plugins/features/common/feature_kibana_privileges_reference.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. + */ + +/** + * Defines a reference to a set of privileges of a specific feature. + */ +export interface FeatureKibanaPrivilegesReference { + /** + * The ID of the feature. + */ + feature: string; + /** + * The set of IDs of feature or sub-feature privileges provided by the feature. + */ + privileges: readonly string[]; +} diff --git a/x-pack/plugins/features/common/index.ts b/x-pack/plugins/features/common/index.ts index 9db2a1073cd07e..92cbcd76172d0c 100644 --- a/x-pack/plugins/features/common/index.ts +++ b/x-pack/plugins/features/common/index.ts @@ -18,3 +18,4 @@ export type { SubFeaturePrivilegeGroupType, } from './sub_feature'; export { SubFeature } from './sub_feature'; +export type { FeatureKibanaPrivilegesReference } from './feature_kibana_privileges_reference'; diff --git a/x-pack/plugins/features/common/kibana_feature.ts b/x-pack/plugins/features/common/kibana_feature.ts index debcec588dee0d..926aca01627a2e 100644 --- a/x-pack/plugins/features/common/kibana_feature.ts +++ b/x-pack/plugins/features/common/kibana_feature.ts @@ -142,6 +142,13 @@ export interface KibanaFeatureConfig { description: string; privileges: readonly ReservedKibanaPrivilege[]; }; + + /** + * Indicates whether the feature is available as a standalone feature. The feature can still be + * referenced by other features, but it will not be displayed in any feature management UIs. By default, all features + * are visible. + */ + hidden?: boolean; } export class KibanaFeature { @@ -157,6 +164,10 @@ export class KibanaFeature { return this.config.id; } + public get hidden() { + return this.config.hidden; + } + public get name() { return this.config.name; } diff --git a/x-pack/plugins/features/common/sub_feature.ts b/x-pack/plugins/features/common/sub_feature.ts index e51fc42195797b..a87dc2343e16d7 100644 --- a/x-pack/plugins/features/common/sub_feature.ts +++ b/x-pack/plugins/features/common/sub_feature.ts @@ -70,7 +70,7 @@ export interface SubFeaturePrivilegeGroupConfig { * Configuration for a sub-feature privilege. */ export interface SubFeaturePrivilegeConfig - extends Omit { + extends Omit { /** * Identifier for this privilege. Must be unique across all other privileges within a feature. */ diff --git a/x-pack/plugins/features/server/config.test.ts b/x-pack/plugins/features/server/config.test.ts new file mode 100644 index 00000000000000..096a7f8b9477e5 --- /dev/null +++ b/x-pack/plugins/features/server/config.test.ts @@ -0,0 +1,160 @@ +/* + * Copyright 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 { ConfigSchema } from './config'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; + +describe('config schema', () => { + it('generates proper defaults (no overrides)', () => { + expect(ConfigSchema.validate({})).toMatchInlineSnapshot(`Object {}`); + expect(ConfigSchema.validate({}, { serverless: true })).toMatchInlineSnapshot(`Object {}`); + }); + + it('does not allow overrides in non-serverless', () => { + expect(() => + ConfigSchema.validate( + { overrides: { featureA: { name: 'new name' } } }, + { serverless: false } + ) + ).toThrowErrorMatchingInlineSnapshot(`"[overrides]: a value wasn't expected to be present"`); + expect( + ConfigSchema.validate({ overrides: { featureA: { name: 'new name' } } }, { serverless: true }) + ).toMatchInlineSnapshot(` + Object { + "overrides": Object { + "featureA": Object { + "name": "new name", + }, + }, + } + `); + }); + + it('can override feature properties', () => { + expect( + ConfigSchema.validate( + { + overrides: { + featureA: { name: 'new name', hidden: true }, + featureB: { + order: 100, + category: 'management', + privileges: { + all: { + disabled: true, + }, + read: { + composedOf: [{ feature: 'featureC', privileges: ['all', 'read'] }], + }, + }, + }, + featureC: { + subFeatures: { + privileges: { + subOne: { + disabled: true, + includeIn: 'all', + }, + subTwo: { + includeIn: 'none', + }, + }, + }, + }, + }, + }, + { serverless: true } + ) + ).toMatchInlineSnapshot(` + Object { + "overrides": Object { + "featureA": Object { + "hidden": true, + "name": "new name", + }, + "featureB": Object { + "category": "management", + "order": 100, + "privileges": Object { + "all": Object { + "disabled": true, + }, + "read": Object { + "composedOf": Array [ + Object { + "feature": "featureC", + "privileges": Array [ + "all", + "read", + ], + }, + ], + }, + }, + }, + "featureC": Object { + "subFeatures": Object { + "privileges": Object { + "subOne": Object { + "disabled": true, + "includeIn": "all", + }, + "subTwo": Object { + "includeIn": "none", + }, + }, + }, + }, + }, + } + `); + }); + + it('properly validates category override', () => { + for (const category of Object.keys(DEFAULT_APP_CATEGORIES)) { + expect( + ConfigSchema.validate({ overrides: { featureA: { category } } }, { serverless: true }) + .overrides?.featureA.category + ).toBe(category); + } + + expect(() => + ConfigSchema.validate( + { overrides: { featureA: { category: 'unknown' } } }, + { serverless: true } + ) + ).toThrowErrorMatchingInlineSnapshot( + `"[overrides.featureA.category]: Unknown category \\"unknown\\". Should be one of kibana, enterpriseSearch, observability, security, management"` + ); + }); + it('properly validates sub-feature privilege inclusion override', () => { + for (const includeIn of ['all', 'read', 'none']) { + expect( + ConfigSchema.validate( + { overrides: { featureA: { subFeatures: { privileges: { subOne: { includeIn } } } } } }, + { serverless: true } + ).overrides?.featureA.subFeatures?.privileges.subOne.includeIn + ).toBe(includeIn); + } + + expect(() => + ConfigSchema.validate( + { + overrides: { + featureA: { subFeatures: { privileges: { subOne: { includeIn: 'write' } } } }, + }, + }, + { serverless: true } + ) + ).toThrowErrorMatchingInlineSnapshot(` + "[overrides.featureA.subFeatures.privileges.subOne.includeIn]: types that failed validation: + - [includeIn.0]: expected value to equal [all] + - [includeIn.1]: expected value to equal [read] + - [includeIn.2]: expected value to equal [none]" + `); + }); +}); diff --git a/x-pack/plugins/features/server/config.ts b/x-pack/plugins/features/server/config.ts new file mode 100644 index 00000000000000..c4941b0eef90eb --- /dev/null +++ b/x-pack/plugins/features/server/config.ts @@ -0,0 +1,74 @@ +/* + * Copyright 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 { offeringBasedSchema, schema, type TypeOf } from '@kbn/config-schema'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; + +const privilegeOverrideSchema = schema.maybe( + schema.object({ + disabled: schema.maybe(schema.boolean()), + composedOf: schema.maybe( + schema.arrayOf( + schema.object({ + feature: schema.string(), + privileges: schema.arrayOf(schema.string()), + }) + ) + ), + }) +); + +export type ConfigType = TypeOf; +export type ConfigOverridesType = Required['overrides']; +export const ConfigSchema = schema.object({ + overrides: offeringBasedSchema({ + // Overrides are only exposed in Serverless offering. + serverless: schema.maybe( + // Key is the feature ID, value is a set of feature properties to override. + schema.recordOf( + schema.string(), + schema.object({ + hidden: schema.maybe(schema.boolean()), + name: schema.maybe(schema.string({ minLength: 1 })), + category: schema.maybe( + schema.string({ + validate(categoryName) { + if (!Object.hasOwn(DEFAULT_APP_CATEGORIES, categoryName)) { + return `Unknown category "${categoryName}". Should be one of ${Object.keys( + DEFAULT_APP_CATEGORIES + ).join(', ')}`; + } + }, + }) + ), + order: schema.maybe(schema.number()), + privileges: schema.maybe( + schema.object({ all: privilegeOverrideSchema, read: privilegeOverrideSchema }) + ), + subFeatures: schema.maybe( + schema.object({ + // Key is the ID of the sub-feature privilege, value is a set of privilege properties to override. + privileges: schema.recordOf( + schema.string(), + schema.object({ + disabled: schema.maybe(schema.boolean()), + includeIn: schema.maybe( + schema.oneOf([ + schema.literal('all'), + schema.literal('read'), + schema.literal('none'), + ]) + ), + }) + ), + }) + ), + }) + ) + ), + }), +}); diff --git a/x-pack/plugins/features/server/feature_registry.test.ts b/x-pack/plugins/features/server/feature_registry.test.ts index e0d0591c67d884..f27c93ac9129e7 100644 --- a/x-pack/plugins/features/server/feature_registry.test.ts +++ b/x-pack/plugins/features/server/feature_registry.test.ts @@ -8,6 +8,7 @@ import { FeatureRegistry } from './feature_registry'; import { ElasticsearchFeatureConfig, KibanaFeatureConfig } from '../common'; import { licensingMock } from '@kbn/licensing-plugin/server/mocks'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; describe('FeatureRegistry', () => { describe('Kibana Features', () => { @@ -1930,6 +1931,270 @@ describe('FeatureRegistry', () => { expect(withSubFeature.subFeatures[0].privilegeGroups[0].privileges).toHaveLength(0); }); }); + + describe('#applyOverrides', () => { + let registry: FeatureRegistry; + beforeEach(() => { + registry = new FeatureRegistry(); + const features: KibanaFeatureConfig[] = [ + { + id: 'featureA', + name: 'Feature A', + app: [], + order: 1, + category: { id: 'fooA', label: 'fooA' }, + privileges: { + all: { ui: [], savedObject: { all: [], read: [] } }, + read: { ui: [], savedObject: { all: [], read: [] } }, + }, + }, + { + id: 'featureB', + name: 'Feature B', + app: [], + order: 2, + category: { id: 'fooB', label: 'fooB' }, + privileges: null, + }, + { + id: 'featureC', + name: 'Feature C', + app: [], + order: 1, + category: { id: 'fooC', label: 'fooC' }, + privileges: { + all: { ui: [], savedObject: { all: [], read: [] } }, + read: { ui: [], savedObject: { all: [], read: [] } }, + }, + subFeatures: [ + { + name: 'subFeatureC', + privilegeGroups: [ + { + groupType: 'mutually_exclusive', + privileges: [ + { + id: 'subFeatureCOne', + name: 'subFeature C One', + includeIn: 'all', + ui: [], + savedObject: { all: [], read: [] }, + }, + ], + }, + ], + }, + ], + }, + { + id: 'featureD', + name: 'Feature D', + app: [], + order: 1, + category: { id: 'fooD', label: 'fooD' }, + privileges: { + all: { ui: [], savedObject: { all: [], read: [] } }, + read: { ui: [], savedObject: { all: [], read: [] } }, + }, + }, + { + id: 'featureE', + name: 'Feature E', + app: [], + order: 1, + category: { id: 'fooE', label: 'fooE' }, + privileges: { + all: { + ui: [], + savedObject: { all: [], read: [] }, + alerting: { alert: { all: ['one'] } }, + }, + read: { ui: [], savedObject: { all: [], read: [] } }, + }, + alerting: ['one'], + }, + ]; + features.forEach((f) => registry.registerKibanaFeature(f)); + }); + + it('rejects overrides for unknown features', () => { + expect(() => + registry.applyOverrides({ unknownFeature: {} }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot override feature \\"unknownFeature\\" since feature with such ID is not registered."` + ); + }); + + it('can override basic feature properties', () => { + registry.applyOverrides({ + featureA: { + hidden: true, + name: 'Feature A New', + category: 'management', + order: 123, + }, + }); + registry.lockRegistration(); + + const [featureA, featureB] = registry.getAllKibanaFeatures(); + expect(featureA.hidden).toBe(true); + expect(featureB.hidden).toBeUndefined(); + + expect(featureA.name).toBe('Feature A New'); + expect(featureB.name).toBe('Feature B'); + + expect(featureA.category).toEqual(DEFAULT_APP_CATEGORIES.management); + expect(featureB.category).toEqual({ id: 'fooB', label: 'fooB' }); + + expect(featureA.order).toBe(123); + expect(featureB.order).toBe(2); + }); + + it('rejects overrides for unknown privileges', () => { + expect(() => + registry.applyOverrides({ featureB: { privileges: { all: { disabled: true } } } }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot override privilege \\"all\\" of feature \\"featureB\\" since \\"all\\" privilege is not registered."` + ); + }); + + it('rejects overrides for `composedOf` referring to unknown feature', () => { + expect(() => + registry.applyOverrides({ + featureA: { + privileges: { + all: { composedOf: [{ feature: 'featureF', privileges: ['all'] }] }, + }, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot compose privilege \\"all\\" of feature \\"featureA\\" with privileges of feature \\"featureF\\" since such feature is not registered."` + ); + }); + + it('rejects overrides for `composedOf` referring to unknown feature privilege', () => { + expect(() => + registry.applyOverrides({ + featureA: { + privileges: { + all: { composedOf: [{ feature: 'featureB', privileges: ['none'] }] }, + }, + }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot compose privilege \\"all\\" of feature \\"featureA\\" with privilege \\"none\\" of feature \\"featureB\\" since such privilege is not registered."` + ); + }); + + it('can override `composedOf` referring to both feature and sub-feature privileges', () => { + registry.applyOverrides({ + featureA: { + privileges: { + all: { + composedOf: [ + { feature: 'featureC', privileges: ['subFeatureCOne'] }, + { feature: 'featureD', privileges: ['all'] }, + ], + }, + read: { composedOf: [{ feature: 'featureD', privileges: ['read'] }] }, + }, + }, + }); + registry.lockRegistration(); + + const [featureA] = registry.getAllKibanaFeatures(); + expect(featureA.privileges).toEqual({ + all: { + ui: [], + savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url'] }, + composedOf: [ + { feature: 'featureC', privileges: ['subFeatureCOne'] }, + { feature: 'featureD', privileges: ['all'] }, + ], + }, + read: { + ui: [], + savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url'] }, + composedOf: [{ feature: 'featureD', privileges: ['read'] }], + }, + }); + }); + + it('can override `composedOf` referring to a feature that requires custom RBAC', () => { + registry.applyOverrides({ + featureA: { + privileges: { + all: { composedOf: [{ feature: 'featureE', privileges: ['all'] }] }, + }, + }, + }); + registry.lockRegistration(); + + const [featureA] = registry.getAllKibanaFeatures(); + expect(featureA.privileges).toEqual({ + all: { + ui: [], + savedObject: { all: ['telemetry'], read: ['config', 'config-global', 'url'] }, + composedOf: [{ feature: 'featureE', privileges: ['all'] }], + }, + read: { + ui: [], + savedObject: { all: [], read: ['config', 'config-global', 'telemetry', 'url'] }, + }, + }); + }); + + it('rejects overrides for unknown sub-feature privileges', () => { + expect(() => + registry.applyOverrides({ + featureC: { subFeatures: { privileges: { all: { disabled: true } } } }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot override sub-feature privilege \\"all\\" of feature \\"featureC\\" since \\"all\\" sub-feature privilege is not registered. Known sub-feature privileges are: subFeatureCOne."` + ); + + expect(() => + registry.applyOverrides({ + featureA: { subFeatures: { privileges: { subFeatureCOne: { disabled: true } } } }, + }) + ).toThrowErrorMatchingInlineSnapshot( + `"Cannot override sub-feature privileges of feature \\"featureA\\" since it didn't register any."` + ); + }); + + it('can override sub-feature privileges', () => { + registry.applyOverrides({ + featureC: { + subFeatures: { privileges: { subFeatureCOne: { disabled: true, includeIn: 'none' } } }, + }, + }); + registry.lockRegistration(); + + const [, , featureC] = registry.getAllKibanaFeatures(); + expect(featureC.subFeatures).toEqual([ + { + config: { + name: 'subFeatureC', + privilegeGroups: [ + { + groupType: 'mutually_exclusive', + privileges: [ + { + disabled: true, + id: 'subFeatureCOne', + includeIn: 'none', + name: 'subFeature C One', + savedObject: { all: [], read: [] }, + ui: [], + }, + ], + }, + ], + }, + }, + ]); + }); + }); }); describe('Elasticsearch Features', () => { diff --git a/x-pack/plugins/features/server/feature_registry.ts b/x-pack/plugins/features/server/feature_registry.ts index 40c278b2fe4ed2..4726335ee3d014 100644 --- a/x-pack/plugins/features/server/feature_registry.ts +++ b/x-pack/plugins/features/server/feature_registry.ts @@ -7,14 +7,17 @@ import { cloneDeep, uniq } from 'lodash'; import { ILicense } from '@kbn/licensing-plugin/server'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { KibanaFeatureConfig, KibanaFeature, FeatureKibanaPrivileges, ElasticsearchFeatureConfig, ElasticsearchFeature, + SubFeaturePrivilegeConfig, } from '../common'; import { validateKibanaFeature, validateElasticsearchFeature } from './feature_schema'; +import type { ConfigOverridesType } from './config'; export class FeatureRegistry { private locked = false; @@ -61,6 +64,106 @@ export class FeatureRegistry { this.esFeatures[feature.id] = featureCopy; } + /** + * Updates definitions for the registered features using configuration overrides, if any. + */ + public applyOverrides(overrides: ConfigOverridesType) { + for (const [featureId, featureOverride] of Object.entries(overrides)) { + const feature = this.kibanaFeatures[featureId]; + if (!feature) { + throw new Error( + `Cannot override feature "${featureId}" since feature with such ID is not registered.` + ); + } + + if (featureOverride.hidden) { + feature.hidden = featureOverride.hidden; + } + + // Note that the name doesn't currently support localizable strings. We'll revisit this approach when i18n support + // becomes necessary. + if (featureOverride.name) { + feature.name = featureOverride.name; + } + + if (featureOverride.category) { + feature.category = DEFAULT_APP_CATEGORIES[featureOverride.category]; + } + + if (featureOverride.order != null) { + feature.order = featureOverride.order; + } + + if (featureOverride.privileges) { + for (const [privilegeId, privilegeOverride] of Object.entries(featureOverride.privileges)) { + const typedPrivilegeId = privilegeId as 'read' | 'all'; + const targetPrivilege = feature.privileges?.[typedPrivilegeId]; + if (!targetPrivilege) { + throw new Error( + `Cannot override privilege "${privilegeId}" of feature "${featureId}" since "${privilegeId}" privilege is not registered.` + ); + } + + for (const featureReference of privilegeOverride.composedOf ?? []) { + const referencedFeature = this.kibanaFeatures[featureReference.feature]; + if (!referencedFeature) { + throw new Error( + `Cannot compose privilege "${privilegeId}" of feature "${featureId}" with privileges of feature "${featureReference.feature}" since such feature is not registered.` + ); + } + + // Collect all known feature and sub-feature privileges for the referenced feature. + const knownPrivileges = new Map( + Object.entries(referencedFeature.privileges ?? {}).concat( + collectSubFeaturesPrivileges(referencedFeature) + ) + ); + + for (const privilegeReference of featureReference.privileges) { + const referencedPrivilege = knownPrivileges.get(privilegeReference); + if (!referencedPrivilege) { + throw new Error( + `Cannot compose privilege "${privilegeId}" of feature "${featureId}" with privilege "${privilegeReference}" of feature "${featureReference.feature}" since such privilege is not registered.` + ); + } + } + } + + // It's safe to assume that `feature.privileges` is defined here since we've checked it above. + feature.privileges![typedPrivilegeId] = { ...targetPrivilege, ...privilegeOverride }; + } + } + + if (featureOverride.subFeatures?.privileges) { + // Collect all known sub-feature privileges for the feature. + const knownPrivileges = new Map(collectSubFeaturesPrivileges(feature)); + if (knownPrivileges.size === 0) { + throw new Error( + `Cannot override sub-feature privileges of feature "${featureId}" since it didn't register any.` + ); + } + + for (const [privilegeId, privilegeOverride] of Object.entries( + featureOverride.subFeatures.privileges + )) { + const targetPrivilege = knownPrivileges.get(privilegeId); + if (!targetPrivilege) { + throw new Error( + `Cannot override sub-feature privilege "${privilegeId}" of feature "${featureId}" since "${privilegeId}" sub-feature privilege is not registered. Known sub-feature privileges are: ${Array.from( + knownPrivileges.keys() + )}.` + ); + } + + targetPrivilege.disabled = privilegeOverride.disabled; + if (privilegeOverride.includeIn) { + targetPrivilege.includeIn = privilegeOverride.includeIn; + } + } + } + } + } + public getAllKibanaFeatures(license?: ILicense, ignoreLicense = false): KibanaFeature[] { if (!this.locked) { throw new Error('Cannot retrieve Kibana features while registration is still open'); @@ -143,3 +246,15 @@ function applyAutomaticReadPrivilegeGrants( } }); } + +function collectSubFeaturesPrivileges(feature: KibanaFeatureConfig) { + return ( + feature.subFeatures?.flatMap((subFeature) => + subFeature.privilegeGroups.flatMap(({ privileges }) => + privileges.map( + (privilege) => [privilege.id, privilege] as [string, SubFeaturePrivilegeConfig] + ) + ) + ) ?? [] + ); +} diff --git a/x-pack/plugins/features/server/feature_schema.ts b/x-pack/plugins/features/server/feature_schema.ts index b332ea355dcc03..341bb926b277d3 100644 --- a/x-pack/plugins/features/server/feature_schema.ts +++ b/x-pack/plugins/features/server/feature_schema.ts @@ -187,6 +187,8 @@ const kibanaSubFeatureSchema = schema.object({ ), }); +// NOTE: This schema intentionally omits the `composedOf` and `hidden` properties to discourage consumers from using +// them during feature registration. This is because these properties should only be set via configuration overrides. const kibanaFeatureSchema = schema.object({ id: schema.string({ validate(value: string) { diff --git a/x-pack/plugins/features/server/index.ts b/x-pack/plugins/features/server/index.ts index b40094dee92d4f..48c292515ed27f 100644 --- a/x-pack/plugins/features/server/index.ts +++ b/x-pack/plugins/features/server/index.ts @@ -5,7 +5,9 @@ * 2.0. */ -import { PluginInitializerContext } from '@kbn/core/server'; +import type { PluginConfigDescriptor, PluginInitializerContext } from '@kbn/core/server'; +import type { TypeOf } from '@kbn/config-schema'; +import { ConfigSchema } from './config'; // These exports are part of public Features plugin contract, any change in signature of exported // functions or removal of exports should be considered as a breaking change. Ideally we should @@ -22,6 +24,7 @@ export type { export { KibanaFeature, ElasticsearchFeature } from '../common'; export type { PluginSetupContract, PluginStartContract } from './plugin'; +export const config: PluginConfigDescriptor> = { schema: ConfigSchema }; export const plugin = async (initializerContext: PluginInitializerContext) => { const { FeaturesPlugin } = await import('./plugin'); return new FeaturesPlugin(initializerContext); diff --git a/x-pack/plugins/features/server/plugin.test.ts b/x-pack/plugins/features/server/plugin.test.ts index ca88da04588462..d353ee0588d5f5 100644 --- a/x-pack/plugins/features/server/plugin.test.ts +++ b/x-pack/plugins/features/server/plugin.test.ts @@ -6,6 +6,7 @@ */ import { coreMock, savedObjectsServiceMock } from '@kbn/core/server/mocks'; +import { ConfigSchema } from './config'; import { FeaturesPlugin } from './plugin'; describe('Features Plugin', () => { @@ -120,4 +121,76 @@ describe('Features Plugin', () => { expect(coreSetup.capabilities.registerProvider).toHaveBeenCalledTimes(1); expect(coreSetup.capabilities.registerProvider).toHaveBeenCalledWith(expect.any(Function)); }); + + it('apply feature overrides', async () => { + const plugin = new FeaturesPlugin( + coreMock.createPluginInitializerContext( + ConfigSchema.validate( + { overrides: { featureA: { name: 'overriddenFeatureName', order: 321 } } }, + { serverless: true } + ) + ) + ); + const { registerKibanaFeature } = plugin.setup(coreSetup); + registerKibanaFeature({ + id: 'featureA', + name: 'featureAName', + app: [], + category: { id: 'foo', label: 'foo' }, + order: 123, + privileges: { + all: { savedObject: { all: ['one'], read: ['two'] }, ui: [] }, + read: { savedObject: { all: ['three'], read: ['four'] }, ui: [] }, + }, + }); + + const { getKibanaFeatures } = plugin.start(coreStart); + expect(getKibanaFeatures().find((feature) => feature.id === 'featureA')).toMatchInlineSnapshot(` + KibanaFeature { + "config": Object { + "app": Array [], + "category": Object { + "id": "foo", + "label": "foo", + }, + "id": "featureA", + "name": "overriddenFeatureName", + "order": 321, + "privileges": Object { + "all": Object { + "savedObject": Object { + "all": Array [ + "one", + "telemetry", + ], + "read": Array [ + "two", + "config", + "config-global", + "url", + ], + }, + "ui": Array [], + }, + "read": Object { + "savedObject": Object { + "all": Array [ + "three", + ], + "read": Array [ + "four", + "config", + "config-global", + "telemetry", + "url", + ], + }, + "ui": Array [], + }, + }, + }, + "subFeatures": Array [], + } + `); + }); }); diff --git a/x-pack/plugins/features/server/plugin.ts b/x-pack/plugins/features/server/plugin.ts index b396dc9a17972e..c6e8cdd96556cc 100644 --- a/x-pack/plugins/features/server/plugin.ts +++ b/x-pack/plugins/features/server/plugin.ts @@ -16,6 +16,7 @@ import { PluginInitializerContext, Capabilities as UICapabilities, } from '@kbn/core/server'; +import { ConfigType } from './config'; import { FeatureRegistry } from './feature_registry'; import { uiCapabilitiesForFeatures } from './ui_capabilities_for_features'; import { buildOSSFeatures } from './oss_features'; @@ -127,6 +128,12 @@ export class FeaturesPlugin public start(core: CoreStart): RecursiveReadonly { this.registerOssFeatures(core.savedObjects); + + const { overrides } = this.initializerContext.config.get(); + if (overrides) { + this.featureRegistry.applyOverrides(overrides); + } + this.featureRegistry.lockRegistration(); this.capabilities = uiCapabilitiesForFeatures( diff --git a/x-pack/plugins/features/server/routes/index.ts b/x-pack/plugins/features/server/routes/index.ts index 621bf4a4b0e876..97273776df6526 100644 --- a/x-pack/plugins/features/server/routes/index.ts +++ b/x-pack/plugins/features/server/routes/index.ts @@ -24,7 +24,7 @@ export function defineRoutes({ router, featureRegistry }: RouteDefinitionParams) options: { tags: ['access:features'], access: 'public', - description: `Get features`, + summary: `Get features`, }, validate: { query: schema.object({ ignoreValidLicenses: schema.boolean({ defaultValue: false }) }), diff --git a/x-pack/plugins/fleet/.storybook/context/cloud.ts b/x-pack/plugins/fleet/.storybook/context/cloud.ts index 9acbbd221059bd..00efa8702ac167 100644 --- a/x-pack/plugins/fleet/.storybook/context/cloud.ts +++ b/x-pack/plugins/fleet/.storybook/context/cloud.ts @@ -18,6 +18,7 @@ export const getCloud = ({ isCloudEnabled }: { isCloudEnabled: boolean }) => { profileUrl: 'https://profile.url', snapshotsUrl: 'https://snapshots.url', registerCloudService: () => {}, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, diff --git a/x-pack/plugins/fleet/common/constants/index.ts b/x-pack/plugins/fleet/common/constants/index.ts index 6e9af1e7d269c5..31a7cd6b70686f 100644 --- a/x-pack/plugins/fleet/common/constants/index.ts +++ b/x-pack/plugins/fleet/common/constants/index.ts @@ -37,8 +37,6 @@ export const FLEET_SERVER_INDICES_VERSION = 1; export const FLEET_SERVER_ARTIFACTS_INDEX = '.fleet-artifacts'; -export const FLEET_SERVER_SERVERS_INDEX = '.fleet-servers'; - export const FLEET_SERVER_INDICES = [ '.fleet-actions', '.fleet-actions-results', @@ -47,7 +45,6 @@ export const FLEET_SERVER_INDICES = [ '.fleet-enrollment-api-keys', '.fleet-policies', '.fleet-policies-leader', - FLEET_SERVER_SERVERS_INDEX, ]; // Nodes that can be queried by datastreams API diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index f572273a486a9b..9b50a140a7e939 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -32,7 +32,6 @@ export { MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, UNINSTALL_TOKENS_SAVED_OBJECT_TYPE, // Fleet server index - FLEET_SERVER_SERVERS_INDEX, FLEET_SERVER_ARTIFACTS_INDEX, AGENTS_INDEX, AGENT_POLICY_INDEX, diff --git a/x-pack/plugins/fleet/common/openapi/bundled.json b/x-pack/plugins/fleet/common/openapi/bundled.json index 35ef539cfe2997..62de596088edb7 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.json +++ b/x-pack/plugins/fleet/common/openapi/bundled.json @@ -606,6 +606,9 @@ }, "400": { "$ref": "#/components/responses/error" + }, + "429": { + "$ref": "#/components/responses/error" } }, "operationId": "install-package-by-upload", diff --git a/x-pack/plugins/fleet/common/openapi/bundled.yaml b/x-pack/plugins/fleet/common/openapi/bundled.yaml index 3f2745267a5d0f..ac1d7b76979ffa 100644 --- a/x-pack/plugins/fleet/common/openapi/bundled.yaml +++ b/x-pack/plugins/fleet/common/openapi/bundled.yaml @@ -392,6 +392,8 @@ paths: - items '400': $ref: '#/components/responses/error' + '429': + $ref: '#/components/responses/error' operationId: install-package-by-upload description: '' parameters: diff --git a/x-pack/plugins/fleet/common/openapi/components/responses/error.yaml b/x-pack/plugins/fleet/common/openapi/components/responses/error.yaml index 8199a81cb6b5a6..0f0c54f1c3d389 100644 --- a/x-pack/plugins/fleet/common/openapi/components/responses/error.yaml +++ b/x-pack/plugins/fleet/common/openapi/components/responses/error.yaml @@ -9,4 +9,4 @@ content: error: type: string message: - type: string \ No newline at end of file + type: string diff --git a/x-pack/plugins/fleet/common/openapi/paths/epm@packages.yaml b/x-pack/plugins/fleet/common/openapi/paths/epm@packages.yaml index f8b1ccaf46fe17..7eaf0b65849150 100644 --- a/x-pack/plugins/fleet/common/openapi/paths/epm@packages.yaml +++ b/x-pack/plugins/fleet/common/openapi/paths/epm@packages.yaml @@ -79,6 +79,8 @@ post: - items '400': $ref: ../components/responses/error.yaml + '429': + $ref: ../components/responses/error.yaml operationId: install-package-by-upload description: '' parameters: diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index c697edae904b35..082296fd75e113 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -53,6 +53,7 @@ export interface GlobalDataTag { // SO definition for this type is declared in server/types/interfaces export interface AgentPolicy extends Omit { id: string; + space_id?: string | undefined; status: ValueOf; package_policies?: PackagePolicy[]; is_managed: boolean; // required for created policy @@ -120,6 +121,7 @@ export interface FullAgentPolicyMonitoring { export interface FullAgentPolicy { id: string; + namespaces?: string[]; outputs: { [key: string]: FullAgentPolicyOutput; }; diff --git a/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts b/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts index 459fa5f53bfc5b..55c0e61057c9d8 100644 --- a/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/agents/agent_list.cy.ts @@ -9,7 +9,7 @@ import { FLEET_AGENT_LIST_PAGE } from '../../screens/fleet'; import { createAgentDoc } from '../../tasks/agents'; import { setupFleetServer } from '../../tasks/fleet_server'; -import { deleteFleetServerDocs, deleteAgentDocs, cleanupAgentPolicies } from '../../tasks/cleanup'; +import { deleteAgentDocs, cleanupAgentPolicies } from '../../tasks/cleanup'; import type { CreateAgentPolicyRequest } from '../../../common/types'; import { setUISettings } from '../../tasks/ui_settings'; @@ -87,7 +87,6 @@ function assertTableIsEmpty() { describe('View agents list', () => { before(() => { - deleteFleetServerDocs(true); deleteAgentDocs(true); cleanupAgentPolicies(); setupFleetServer(); @@ -103,7 +102,6 @@ describe('View agents list', () => { } }); after(() => { - deleteFleetServerDocs(true); deleteAgentDocs(true); cleanupAgentPolicies(); }); diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts index 5c653ea3fcf215..97964d230e74b7 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_agent_flyout.cy.ts @@ -6,7 +6,7 @@ */ import { ADD_AGENT_BUTTON, AGENT_FLYOUT } from '../screens/fleet'; -import { cleanupAgentPolicies, deleteFleetServerDocs, deleteAgentDocs } from '../tasks/cleanup'; +import { cleanupAgentPolicies, deleteAgentDocs } from '../tasks/cleanup'; import { createAgentDoc } from '../tasks/agents'; import { setFleetServerHost } from '../tasks/fleet_server'; import { FLEET, navigateTo } from '../tasks/navigation'; @@ -18,7 +18,6 @@ import { login } from '../tasks/login'; const FLEET_SERVER_POLICY_ID = 'fleet-server-policy'; function cleanUp() { - deleteFleetServerDocs(true); deleteAgentDocs(true); cleanupAgentPolicies(); } @@ -53,14 +52,6 @@ describe('Fleet add agent flyout', () => { index: '.fleet-agents', docs: [createAgentDoc('agent1', policyId, 'online', kibanaVersion)], }); - cy.task('insertDocs', { - index: '.fleet-servers', - docs: [ - { - '@timestamp': new Date().toISOString(), - }, - ], - }); setFleetServerHost(); }); diff --git a/x-pack/plugins/fleet/cypress/e2e/fleet_startup.cy.ts b/x-pack/plugins/fleet/cypress/e2e/fleet_startup.cy.ts index 21eefd56eedea4..523004f60261eb 100644 --- a/x-pack/plugins/fleet/cypress/e2e/fleet_startup.cy.ts +++ b/x-pack/plugins/fleet/cypress/e2e/fleet_startup.cy.ts @@ -19,7 +19,7 @@ import { import { cleanupAgentPolicies, unenrollAgent } from '../tasks/cleanup'; import { request } from '../tasks/common'; import { verifyPolicy, verifyAgentPackage, navigateToTab } from '../tasks/fleet'; -import { deleteFleetServer, setFleetServerHost } from '../tasks/fleet_server'; +import { setFleetServerHost } from '../tasks/fleet_server'; import { login } from '../tasks/login'; import { FLEET, navigateTo } from '../tasks/navigation'; @@ -28,8 +28,6 @@ describe('Fleet startup', () => { before(() => { unenrollAgent(); cleanupAgentPolicies(); - deleteFleetServer(); - setFleetServerHost(); }); diff --git a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts index c2d873d9b8dee9..5e179bc9207f1b 100644 --- a/x-pack/plugins/fleet/cypress/tasks/cleanup.ts +++ b/x-pack/plugins/fleet/cypress/tasks/cleanup.ts @@ -48,13 +48,6 @@ export function cleanupDownloadSources() { }); } -export function deleteFleetServerDocs(ignoreUnavailable: boolean = false) { - cy.task('deleteDocsByQuery', { - index: '.fleet-servers', - query: { match_all: {} }, - ignoreUnavailable, - }); -} export function deleteAgentDocs(ignoreUnavailable: boolean = false) { cy.task('deleteDocsByQuery', { index: '.fleet-agents', diff --git a/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts b/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts index e6bb58d7c2b9b6..9907312042da8a 100644 --- a/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts +++ b/x-pack/plugins/fleet/cypress/tasks/fleet_server.ts @@ -44,26 +44,10 @@ export async function setupFleetServer() { index: '.fleet-agents', docs: [createAgentDoc('fleet-server', policyId, 'online', kibanaVersion)], }); - cy.task('insertDocs', { - index: '.fleet-servers', - docs: [ - { - '@timestamp': new Date().toISOString(), - }, - ], - }); setFleetServerHost(); }); } -export function deleteFleetServer() { - cy.task('deleteDocsByQuery', { - index: '.fleet-servers', - query: { match_all: {} }, - ignoreUnavailable: true, - }); -} - export function setFleetServerHost(host = 'https://fleetserver:8220') { request({ method: 'POST', diff --git a/x-pack/plugins/fleet/dev_docs/data_model.md b/x-pack/plugins/fleet/dev_docs/data_model.md index 1e74afe3115b97..44183cb597ae2c 100644 --- a/x-pack/plugins/fleet/dev_docs/data_model.md +++ b/x-pack/plugins/fleet/dev_docs/data_model.md @@ -58,10 +58,6 @@ The total schema for actions is represented by the `FleetServerAgentAction` type - Cleanup model: N/A -### `.fleet-servers` - -- Cleanup model: N/A - ### `.fleet-artifacts` - Cleanup model: N/A diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx index 5fe50e7e207116..e2c8ae42d63e45 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/single_page_layout/hooks/form.tsx @@ -378,7 +378,7 @@ export function useOnSubmit({ notifications.toasts.addSuccess({ title: i18n.translate('xpack.fleet.createPackagePolicy.addedNotificationTitle', { - defaultMessage: `'{packagePolicyName}' integration added.`, + defaultMessage: `''{packagePolicyName}'' integration added.`, values: { packagePolicyName: packagePolicy.name, }, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/fleet_index_debugger.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/fleet_index_debugger.tsx index f84468fb147381..71d4b859819542 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/fleet_index_debugger.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/debug/components/fleet_index_debugger.tsx @@ -43,7 +43,6 @@ export const FleetIndexDebugger = () => { const indices = [ { label: '.fleet-agents', value: '.fleet-agents' }, { label: '.fleet-actions', value: '.fleet-actions' }, - { label: '.fleet-servers', value: '.fleet-servers' }, { label: '.fleet-enrollment-api-keys', value: '.fleet-enrollment-api-keys' }, ]; const [index, setIndex] = useState(); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/download_source_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/download_source_flyout/index.tsx index 292bb63e3c54c2..b6c2ef272d813b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/download_source_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/download_source_flyout/index.tsx @@ -24,13 +24,13 @@ import { EuiLink, EuiSwitch, EuiSpacer, - EuiBetaBadge, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { DownloadSource, FleetProxy } from '../../../../types'; import { FLYOUT_MAX_WIDTH } from '../../constants'; import { useBreadcrumbs, useStartServices } from '../../../../hooks'; +import { ProxyWarning } from '../fleet_proxies_table/proxy_warning'; import { useDowloadSourceFlyoutForm } from './use_download_source_flyout_form'; @@ -142,21 +142,7 @@ export const EditDownloadSourceFlyout: React.FunctionComponent - ), - }} + defaultMessage="Proxy" /> } helpText={ @@ -188,6 +174,8 @@ export const EditDownloadSourceFlyout: React.FunctionComponent + + = onClose, fleetProxy, }) => { - // const { docLinks } = useStartServices(); - const form = useFleetProxyForm(fleetProxy, onClose); const { inputs } = form; @@ -61,6 +62,8 @@ export const FleetProxyFlyout: React.FunctionComponent = + + = label={ - ), - }} + defaultMessage="Proxy" /> } > - inputs.proxyIdInput.setValue(options?.[0]?.value ?? '')} - selectedOptions={ - inputs.proxyIdInput.value !== '' - ? proxiesOptions.filter((option) => option.value === inputs.proxyIdInput.value) - : [] - } - options={proxiesOptions} - singleSelection={{ asPlainText: true }} - isDisabled={inputs.proxyIdInput.props.disabled} - isClearable={true} - placeholder={i18n.translate( - 'xpack.fleet.settings.editOutputFlyout.proxyIdPlaceholder', - { - defaultMessage: 'Select proxy', + <> + inputs.proxyIdInput.setValue(options?.[0]?.value ?? '')} + selectedOptions={ + inputs.proxyIdInput.value !== '' + ? proxiesOptions.filter( + (option) => option.value === inputs.proxyIdInput.value + ) + : [] } - )} - /> + options={proxiesOptions} + singleSelection={{ asPlainText: true }} + isDisabled={inputs.proxyIdInput.props.disabled} + isClearable={true} + placeholder={i18n.translate( + 'xpack.fleet.settings.editOutputFlyout.proxyIdPlaceholder', + { + defaultMessage: 'Select proxy', + } + )} + /> + + + )} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_proxies_table/proxy_warning.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_proxies_table/proxy_warning.tsx new file mode 100644 index 00000000000000..7fdf1ab325728a --- /dev/null +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_proxies_table/proxy_warning.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 { FormattedMessage } from '@kbn/i18n-react'; +import { EuiCallOut } from '@elastic/eui'; + +export const ProxyWarning: React.FunctionComponent<{}> = () => ( + + } + /> +); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/index.tsx index 0dcf808fbb4d73..bb018b93664839 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/settings/components/fleet_server_hosts_flyout/index.tsx @@ -26,7 +26,6 @@ import { EuiSwitch, EuiComboBox, EuiCallOut, - EuiBetaBadge, } from '@elastic/eui'; import { MultiRowInput } from '../multi_row_input'; @@ -34,6 +33,7 @@ import { useStartServices } from '../../../../hooks'; import { FLYOUT_MAX_WIDTH } from '../../constants'; import type { FleetServerHost, FleetProxy } from '../../../../types'; import { TextInput } from '../form'; +import { ProxyWarning } from '../fleet_proxies_table/proxy_warning'; import { useFleetServerHostsForm } from './use_fleet_server_host_form'; @@ -188,45 +188,35 @@ export const FleetServerHostsFlyout: React.FunctionComponent - ), - }} + defaultMessage="Proxy" /> } > - inputs.proxyIdInput.setValue(options?.[0]?.value ?? '')} - selectedOptions={ - inputs.proxyIdInput.value !== '' - ? proxiesOptions.filter((option) => option.value === inputs.proxyIdInput.value) - : [] - } - options={proxiesOptions} - singleSelection={{ asPlainText: true }} - isDisabled={inputs.proxyIdInput.props.disabled} - isClearable={true} - placeholder={i18n.translate( - 'xpack.fleet.settings.fleetServerHostsFlyout.proxyIdPlaceholder', - { - defaultMessage: 'Select proxy', + <> + inputs.proxyIdInput.setValue(options?.[0]?.value ?? '')} + selectedOptions={ + inputs.proxyIdInput.value !== '' + ? proxiesOptions.filter((option) => option.value === inputs.proxyIdInput.value) + : [] } - )} - /> + options={proxiesOptions} + singleSelection={{ asPlainText: true }} + isDisabled={inputs.proxyIdInput.props.disabled} + isClearable={true} + placeholder={i18n.translate( + 'xpack.fleet.settings.fleetServerHostsFlyout.proxyIdPlaceholder', + { + defaultMessage: 'Select proxy', + } + )} + /> + + + { const authz = useAuthz(); const { getHref } = useLink(); + const { docLinks } = useStartServices(); return ( <> @@ -46,14 +47,21 @@ export const FleetProxiesSection: React.FunctionComponent - - - + + + ), + }} /> diff --git a/x-pack/plugins/fleet/public/components/enrollment_instructions/install_section.tsx b/x-pack/plugins/fleet/public/components/enrollment_instructions/install_section.tsx index 372f81ca47f96a..b94291e48663ae 100644 --- a/x-pack/plugins/fleet/public/components/enrollment_instructions/install_section.tsx +++ b/x-pack/plugins/fleet/public/components/enrollment_instructions/install_section.tsx @@ -15,6 +15,7 @@ import type { K8sMode, CloudSecurityIntegration } from '../agent_enrollment_flyo import { PlatformSelector } from '../platform_selector'; import { RootPrivilegesCallout } from './root_privileges_callout'; +import { UnprivilegedInfo } from './unprivileged_info'; interface Props { installCommand: CommandsByPlatform; @@ -43,6 +44,7 @@ export const InstallSection: React.FunctionComponent = ({ <> + { + return ( + <> + +

    + --unprivileged, + command: sudo ./elastic-agent, + }} + /> +

    +
    + + + ); +}; diff --git a/x-pack/plugins/fleet/server/constants/index.ts b/x-pack/plugins/fleet/server/constants/index.ts index 87db7250513be2..4b71f9e16c8d68 100644 --- a/x-pack/plugins/fleet/server/constants/index.ts +++ b/x-pack/plugins/fleet/server/constants/index.ts @@ -58,7 +58,6 @@ export { PACKAGE_POLICY_DEFAULT_INDEX_PRIVILEGES, AGENT_POLICY_DEFAULT_MONITORING_DATASETS, // Fleet Server index - FLEET_SERVER_SERVERS_INDEX, ENROLLMENT_API_KEYS_INDEX, AGENTS_INDEX, // Preconfiguration diff --git a/x-pack/plugins/fleet/server/errors/handlers.ts b/x-pack/plugins/fleet/server/errors/handlers.ts index fef8cd1872413b..dfd92951c89190 100644 --- a/x-pack/plugins/fleet/server/errors/handlers.ts +++ b/x-pack/plugins/fleet/server/errors/handlers.ts @@ -43,6 +43,7 @@ import { PackagePolicyRequestError, FleetNotFoundError, PackageSavedObjectConflictError, + FleetTooManyRequestsError, } from '.'; type IngestErrorHandler = ( @@ -114,6 +115,10 @@ const getHTTPResponseCode = (error: FleetError): number => { if (error instanceof PackageUnsupportedMediaTypeError) { return 415; } + // Too many requests + if (error instanceof FleetTooManyRequestsError) { + return 429; + } // Internal Server Error if (error instanceof UninstallTokenError) { return 500; diff --git a/x-pack/plugins/fleet/server/errors/index.ts b/x-pack/plugins/fleet/server/errors/index.ts index 6a69581c11965b..02c72a5d8a25e0 100644 --- a/x-pack/plugins/fleet/server/errors/index.ts +++ b/x-pack/plugins/fleet/server/errors/index.ts @@ -44,7 +44,6 @@ export class PackageRemovalError extends FleetError {} export class PackageESError extends FleetError {} export class ConcurrentInstallOperationError extends FleetError {} export class PackageSavedObjectConflictError extends FleetError {} - export class KibanaSOReferenceError extends FleetError {} export class PackageAlreadyInstalledError extends FleetError {} @@ -81,6 +80,7 @@ export class FleetSetupError extends FleetError {} export class GenerateServiceTokenError extends FleetError {} export class FleetUnauthorizedError extends FleetError {} export class FleetNotFoundError extends FleetError {} +export class FleetTooManyRequestsError extends FleetError {} export class OutputUnauthorizedError extends FleetError {} export class OutputInvalidError extends FleetError {} diff --git a/x-pack/plugins/fleet/server/routes/download_source/handler.ts b/x-pack/plugins/fleet/server/routes/download_source/handler.ts index b82c3ad19de558..8807106de441ec 100644 --- a/x-pack/plugins/fleet/server/routes/download_source/handler.ts +++ b/x-pack/plugins/fleet/server/routes/download_source/handler.ts @@ -77,13 +77,9 @@ export const putDownloadSourcesHandler: RequestHandler< await downloadSourceService.update(soClient, request.params.sourceId, request.body); const downloadSource = await downloadSourceService.get(soClient, request.params.sourceId); if (downloadSource.is_default) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { - await agentPolicyService.bumpAllAgentPoliciesForDownloadSource( - soClient, - esClient, - downloadSource.id - ); + await agentPolicyService.bumpAllAgentPoliciesForDownloadSource(esClient, downloadSource.id); } const body: PutDownloadSourceResponse = { @@ -114,7 +110,7 @@ export const postDownloadSourcesHandler: RequestHandler< const { id, ...data } = request.body; const downloadSource = await downloadSourceService.create(soClient, data, { id }); if (downloadSource.is_default) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } const body: GetOneDownloadSourceResponse = { diff --git a/x-pack/plugins/fleet/server/routes/epm/handlers.ts b/x-pack/plugins/fleet/server/routes/epm/handlers.ts index e46b9d5b3445ae..709bd7b362a9f0 100644 --- a/x-pack/plugins/fleet/server/routes/epm/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/epm/handlers.ts @@ -65,7 +65,12 @@ import { getTemplateInputs, } from '../../services/epm/packages'; import type { BulkInstallResponse } from '../../services/epm/packages'; -import { defaultFleetErrorHandler, fleetErrorToResponseOptions, FleetError } from '../../errors'; +import { + defaultFleetErrorHandler, + fleetErrorToResponseOptions, + FleetError, + FleetTooManyRequestsError, +} from '../../errors'; import { appContextService, checkAllowedPackages } from '../../services'; import { getPackageUsageStats } from '../../services/epm/packages/get'; import { updatePackage } from '../../services/epm/packages/update'; @@ -80,6 +85,7 @@ import type { import { getDataStreams } from '../../services/epm/data_streams'; import { NamingCollisionError } from '../../services/epm/packages/custom_integrations/validation/check_naming_collision'; import { DatasetNamePrefixError } from '../../services/epm/packages/custom_integrations/validation/check_dataset_name_format'; +import { UPLOAD_RETRY_AFTER_MS } from '../../services/epm/packages/install'; const CACHE_CONTROL_10_MINUTES_HEADER: HttpResponseOptions['headers'] = { 'cache-control': 'max-age=600', @@ -451,7 +457,6 @@ export const installPackageByUploadHandler: FleetRequestHandler< const archiveBuffer = Buffer.from(request.body); const spaceId = fleetContext.spaceId; const user = (await appContextService.getSecurity()?.authc.getCurrentUser(request)) || undefined; - const authorizationHeader = HTTPAuthorizationHeader.parseFromRequest(request, user?.username); const res = await installPackage({ @@ -475,6 +480,18 @@ export const installPackageByUploadHandler: FleetRequestHandler< }; return response.ok({ body }); } else { + if (res.error instanceof FleetTooManyRequestsError) { + return response.customError({ + statusCode: 429, + body: { + message: res.error.message, + }, + headers: { + // retry-after expects seconds + 'retry-after': Math.ceil(UPLOAD_RETRY_AFTER_MS / 1000).toString(), + }, + }); + } return defaultFleetErrorHandler({ error: res.error, response }); } }; diff --git a/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts b/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts index b636ebb53a9eb5..a5905f406a6e72 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_proxies/handler.ts @@ -44,11 +44,11 @@ async function bumpRelatedPolicies( fleetServerHosts.some((host) => host.is_default) || outputs.some((output) => output.is_default || output.is_default_monitoring) ) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { await pMap( outputs, - (output) => agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, output.id), + (output) => agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, output.id), { concurrency: 20, } @@ -56,11 +56,7 @@ async function bumpRelatedPolicies( await pMap( fleetServerHosts, (fleetServerHost) => - agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts( - soClient, - esClient, - fleetServerHost.id - ), + agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts(esClient, fleetServerHost.id), { concurrency: 20, } @@ -69,11 +65,7 @@ async function bumpRelatedPolicies( await pMap( downloadSources, (downloadSource) => - agentPolicyService.bumpAllAgentPoliciesForDownloadSource( - soClient, - esClient, - downloadSource.id - ), + agentPolicyService.bumpAllAgentPoliciesForDownloadSource(esClient, downloadSource.id), { concurrency: 20, } diff --git a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts index 3a67ac5758cc57..f7159e6b5f4988 100644 --- a/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts +++ b/x-pack/plugins/fleet/server/routes/fleet_server_hosts/handler.ts @@ -69,7 +69,7 @@ export const postFleetServerHost: RequestHandler< { id } ); if (FleetServerHost.is_default) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } const body = { @@ -150,9 +150,9 @@ export const putFleetServerHostHandler: RequestHandler< }; if (item.is_default) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { - await agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts(soClient, esClient, item.id); + await agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts(esClient, item.id); } return response.ok({ body }); diff --git a/x-pack/plugins/fleet/server/routes/output/handler.ts b/x-pack/plugins/fleet/server/routes/output/handler.ts index a1cb04b9026c04..b35158637d1519 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.ts @@ -109,9 +109,9 @@ export const putOutputHandler: RequestHandler< await outputService.update(soClient, esClient, request.params.outputId, outputUpdate); const output = await outputService.get(soClient, request.params.outputId); if (output.is_default || output.is_default_monitoring) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { - await agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, output.id); + await agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, output.id); } const body: GetOneOutputResponse = { @@ -144,7 +144,7 @@ export const postOutputHandler: RequestHandler< ensureNoDuplicateSecrets(newOutput); const output = await outputService.create(soClient, esClient, newOutput, { id }); if (output.is_default || output.is_default_monitoring) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } const body: GetOneOutputResponse = { diff --git a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.test.ts b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.test.ts index 6862b36537ef53..b41debffb3e6be 100644 --- a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.test.ts +++ b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.test.ts @@ -4,21 +4,14 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { savedObjectsClientMock, elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { savedObjectsClientMock } from '@kbn/core/server/mocks'; -import { packagePolicyService, agentPolicyService } from '../../services'; -import { getAgentStatusForAgentPolicy } from '../../services/agents'; +import { agentPolicyService } from '../../services'; +import { getFleetServerPolicies } from '../../services/fleet_server'; -import { - getFleetServerPolicies, - hasActiveFleetServersForPolicies, - getDownloadSource, -} from './enrollment_settings_handler'; +import { getFleetServerOrAgentPolicies, getDownloadSource } from './enrollment_settings_handler'; jest.mock('../../services', () => ({ - packagePolicyService: { - list: jest.fn(), - }, agentPolicyService: { get: jest.fn(), getByIDs: jest.fn(), @@ -44,13 +37,12 @@ jest.mock('../../services', () => ({ }, })); -jest.mock('../../services/agents', () => ({ - getAgentStatusForAgentPolicy: jest.fn(), +jest.mock('../../services/fleet_server', () => ({ + getFleetServerPolicies: jest.fn(), })); describe('EnrollmentSettingsHandler utils', () => { const mockSoClient = savedObjectsClientMock.create(); - const mockEsClient = elasticsearchServiceMock.createInternalClient(); const mockAgentPolicies = [ { id: 'agent-policy-1', @@ -124,20 +116,21 @@ describe('EnrollmentSettingsHandler utils', () => { }, ]; - describe('getFleetServerPolicies', () => { + describe('getFleetServerOrAgentPolicies', () => { it('returns only fleet server policies if there are any when no agent policy ID is provided', async () => { - (packagePolicyService.list as jest.Mock).mockResolvedValueOnce({ - items: [{ policy_id: 'fs-policy-1' }, { policy_id: 'fs-policy-2' }], - }); - (agentPolicyService.getByIDs as jest.Mock).mockResolvedValueOnce(mockFleetServerPolicies); - const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerPolicies(mockSoClient); + (getFleetServerPolicies as jest.Mock).mockResolvedValueOnce(mockFleetServerPolicies); + const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerOrAgentPolicies( + mockSoClient + ); expect(fleetServerPolicies).toEqual(mockFleetServerPolicies); expect(scopedAgentPolicy).toBeUndefined(); }); it('returns no fleet server policies when there are none and no agent policy ID is provided', async () => { - (packagePolicyService.list as jest.Mock).mockResolvedValueOnce({ items: [] }); - const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerPolicies(mockSoClient); + (getFleetServerPolicies as jest.Mock).mockResolvedValueOnce([]); + const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerOrAgentPolicies( + mockSoClient + ); expect(fleetServerPolicies).toEqual([]); expect(scopedAgentPolicy).toBeUndefined(); }); @@ -147,7 +140,7 @@ describe('EnrollmentSettingsHandler utils', () => { ...mockFleetServerPolicies[1], package_policies: [mockPackagePolicies[1]], }); - const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerPolicies( + const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerOrAgentPolicies( mockSoClient, 'fs-policy-2' ); @@ -160,7 +153,7 @@ describe('EnrollmentSettingsHandler utils', () => { ...mockAgentPolicies[1], package_policies: [mockPackagePolicies[2]], }); - const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerPolicies( + const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerOrAgentPolicies( mockSoClient, 'agent-policy-2' ); @@ -170,7 +163,7 @@ describe('EnrollmentSettingsHandler utils', () => { it('returns no policies when specified agent policy ID is not found', async () => { (agentPolicyService.get as jest.Mock).mockResolvedValueOnce(undefined); - const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerPolicies( + const { fleetServerPolicies, scopedAgentPolicy } = await getFleetServerOrAgentPolicies( mockSoClient, 'agent-policy-3' ); @@ -179,73 +172,6 @@ describe('EnrollmentSettingsHandler utils', () => { }); }); - describe('hasActiveFleetServersForPolicies', () => { - it('returns false when no agent IDs are provided', async () => { - const hasActive = await hasActiveFleetServersForPolicies(mockEsClient, mockSoClient, []); - expect(hasActive).toBe(false); - }); - - it('returns true when at least one agent is online', async () => { - (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ - other: 0, - events: 0, - total: 1, - all: 1, - active: 0, - updating: 0, - offline: 0, - inactive: 0, - unenrolled: 0, - online: 1, - error: 0, - }); - const hasActive = await hasActiveFleetServersForPolicies(mockEsClient, mockSoClient, [ - 'policy-1', - ]); - expect(hasActive).toBe(true); - }); - - it('returns true when at least one agent is updating', async () => { - (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ - other: 0, - events: 0, - total: 1, - all: 1, - active: 0, - updating: 1, - offline: 0, - inactive: 0, - unenrolled: 0, - online: 0, - error: 0, - }); - const hasActive = await hasActiveFleetServersForPolicies(mockEsClient, mockSoClient, [ - 'policy-1', - ]); - expect(hasActive).toBe(true); - }); - - it('returns false when no agents are updating or online', async () => { - (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ - other: 0, - events: 0, - total: 3, - all: 3, - active: 1, - updating: 0, - offline: 1, - inactive: 1, - unenrolled: 1, - online: 0, - error: 1, - }); - const hasActive = await hasActiveFleetServersForPolicies(mockEsClient, mockSoClient, [ - 'policy-1', - ]); - expect(hasActive).toBe(false); - }); - }); - describe('getDownloadSource', () => { it('returns the default download source when no id is specified', async () => { const source = await getDownloadSource(mockSoClient); diff --git a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts index 766882bebe6404..1662fed3fc31b6 100644 --- a/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts +++ b/x-pack/plugins/fleet/server/routes/settings/enrollment_settings_handler.ts @@ -7,9 +7,9 @@ import type { TypeOf } from '@kbn/config-schema'; -import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; +import type { SavedObjectsClientContract } from '@kbn/core/server'; -import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, FLEET_SERVER_PACKAGE } from '../../../common/constants'; +import { FLEET_SERVER_PACKAGE } from '../../../common/constants'; import type { GetEnrollmentSettingsResponse, @@ -18,10 +18,10 @@ import type { } from '../../../common/types'; import type { FleetRequestHandler, GetEnrollmentSettingsRequestSchema } from '../../types'; import { defaultFleetErrorHandler } from '../../errors'; -import { agentPolicyService, packagePolicyService, downloadSourceService } from '../../services'; -import { getAgentStatusForAgentPolicy } from '../../services/agents'; +import { agentPolicyService, downloadSourceService } from '../../services'; import { getFleetServerHostsForAgentPolicy } from '../../services/fleet_server_host'; import { getFleetProxy } from '../../services/fleet_proxies'; +import { getFleetServerPolicies, hasFleetServersForPolicies } from '../../services/fleet_server'; export const getEnrollmentSettingsHandler: FleetRequestHandler< undefined, @@ -40,7 +40,7 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< try { // Get all possible fleet server or scoped normal agent policies const { fleetServerPolicies, scopedAgentPolicy: scopedAgentPolicyResponse } = - await getFleetServerPolicies(soClient, agentPolicyId); + await getFleetServerOrAgentPolicies(soClient, agentPolicyId); const scopedAgentPolicy = scopedAgentPolicyResponse || { id: undefined, name: undefined, @@ -51,10 +51,11 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< // Check if there is any active fleet server enrolled into the fleet server policies policies if (fleetServerPolicies) { settingsResponse.fleet_server.policies = fleetServerPolicies; - settingsResponse.fleet_server.has_active = await hasActiveFleetServersForPolicies( + settingsResponse.fleet_server.has_active = await hasFleetServersForPolicies( esClient, soClient, - fleetServerPolicies.map((p) => p.id) + fleetServerPolicies.map((p) => p.id), + true ); } @@ -99,7 +100,7 @@ export const getEnrollmentSettingsHandler: FleetRequestHandler< } }; -export const getFleetServerPolicies = async ( +export const getFleetServerOrAgentPolicies = async ( soClient: SavedObjectsClientContract, agentPolicyId?: string ): Promise<{ @@ -134,42 +135,9 @@ export const getFleetServerPolicies = async ( return {}; } - // If an agent policy is not specified, perform default behavior to retrieve all fleet server policies - const fleetServerPackagePolicies = await packagePolicyService.list(soClient, { - kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${FLEET_SERVER_PACKAGE}`, - }); - - // Extract associated fleet server agent policy IDs - const fleetServerAgentPolicyIds = [ - ...new Set(fleetServerPackagePolicies.items.map((p) => p.policy_id)), - ]; - - // Retrieve associated agent policies - const fleetServerAgentPolicies = fleetServerAgentPolicyIds.length - ? await agentPolicyService.getByIDs(soClient, fleetServerAgentPolicyIds) - : []; - - return { - fleetServerPolicies: fleetServerAgentPolicies.map(mapPolicy), - }; -}; - -export const hasActiveFleetServersForPolicies = async ( - esClient: ElasticsearchClient, - soClient: SavedObjectsClientContract, - agentPolicyIds: string[] -): Promise => { - if (agentPolicyIds.length > 0) { - const agentStatusesRes = await getAgentStatusForAgentPolicy( - esClient, - soClient, - undefined, - agentPolicyIds.map((id) => `policy_id:${id}`).join(' or ') - ); - - return agentStatusesRes.online > 0 || agentStatusesRes.updating > 0; - } - return false; + // If an agent policy is not specified, return all fleet server policies + const fleetServerPolicies = (await getFleetServerPolicies(soClient)).map(mapPolicy); + return { fleetServerPolicies }; }; export const getDownloadSource = async ( diff --git a/x-pack/plugins/fleet/server/routes/settings/index.ts b/x-pack/plugins/fleet/server/routes/settings/index.ts index 6a814eae0f8019..d8d8aee742c9a6 100644 --- a/x-pack/plugins/fleet/server/routes/settings/index.ts +++ b/x-pack/plugins/fleet/server/routes/settings/index.ts @@ -53,7 +53,7 @@ export const putSettingsHandler: FleetRequestHandler< try { const settings = await settingsService.saveSettings(soClient, request.body); - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient, { + await agentPolicyService.bumpAllAgentPolicies(esClient, { user: user || undefined, }); const body = { diff --git a/x-pack/plugins/fleet/server/routes/setup/handlers.ts b/x-pack/plugins/fleet/server/routes/setup/handlers.ts index 5cbdd87ebb142d..58555f233142a4 100644 --- a/x-pack/plugins/fleet/server/routes/setup/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/setup/handlers.ts @@ -25,9 +25,7 @@ export const getFleetStatusHandler: FleetRequestHandler = async (context, reques const isApiKeysEnabled = await appContextService .getSecurity() .authc.apiKeys.areAPIKeysEnabled(); - const isFleetServerMissing = !(await hasFleetServers( - coreContext.elasticsearch.client.asInternalUser - )); + const isFleetServerMissing = !(await hasFleetServers(esClient, soClient)); const isFleetServerStandalone = appContextService.getConfig()?.internal?.fleetServerStandalone ?? false; diff --git a/x-pack/plugins/fleet/server/saved_objects/index.ts b/x-pack/plugins/fleet/server/saved_objects/index.ts index ad958bc986d004..fa8d8881f33d00 100644 --- a/x-pack/plugins/fleet/server/saved_objects/index.ts +++ b/x-pack/plugins/fleet/server/saved_objects/index.ts @@ -742,7 +742,7 @@ export const getSavedObjectTypes = ( name: DOWNLOAD_SOURCE_SAVED_OBJECT_TYPE, indexPattern: INGEST_SAVED_OBJECT_INDEX, hidden: false, - namespaceType: useSpaceAwareness ? 'single' : 'agnostic', + namespaceType: 'agnostic', management: { importableAndExportable: false, }, diff --git a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts index bcc6956711b645..b8e64be4946511 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/full_agent_policy.ts @@ -85,7 +85,6 @@ export async function getFullAgentPolicy( downloadSourceUri, downloadSourceProxyUri, } = await fetchRelatedSavedObjects(soClient, agentPolicy); - // Build up an in-memory object for looking up Package Info, so we don't have // call `getPackageInfo` for every single policy, which incurs performance costs const packageInfoCache = new Map(); @@ -193,6 +192,10 @@ export async function getFullAgentPolicy( }, }; + if (agentPolicy.space_id) { + fullAgentPolicy.namespaces = [agentPolicy.space_id]; + } + const dataPermissions = (await storedPackagePoliciesToAgentPermissions( packageInfoCache, diff --git a/x-pack/plugins/fleet/server/services/agent_policies/utils.ts b/x-pack/plugins/fleet/server/services/agent_policies/utils.ts index 624b6815c05ab8..dc69ab6ec013da 100644 --- a/x-pack/plugins/fleet/server/services/agent_policies/utils.ts +++ b/x-pack/plugins/fleet/server/services/agent_policies/utils.ts @@ -13,13 +13,12 @@ import type { AgentPolicySOAttributes } from '../../types'; export const mapAgentPolicySavedObjectToAgentPolicy = ({ /* eslint-disable @typescript-eslint/naming-convention */ id, - attributes: { - name, - namespace, + namespaces, + version, + attributes, +}: SavedObject): AgentPolicy => { + const { monitoring_enabled, - revision, - updated_at, - updated_by, agent_features, agents, data_output_id, @@ -30,26 +29,22 @@ export const mapAgentPolicySavedObjectToAgentPolicy = ({ inactivity_timeout, is_default, is_default_fleet_server, - is_managed, is_preconfigured, - is_protected, monitoring_output_id, overrides, package_policies, schema_version, - status, unenroll_timeout, - }, -}: SavedObject): AgentPolicy => { + } = attributes || {}; + return { id, - name, - namespace, + version, + space_id: namespaces?.[0] ? namespaces?.[0] : undefined, description, is_default, is_default_fleet_server, has_fleet_server, - is_managed, monitoring_enabled, unenroll_timeout, inactivity_timeout, @@ -60,13 +55,9 @@ export const mapAgentPolicySavedObjectToAgentPolicy = ({ fleet_server_host_id, schema_version, agent_features, - is_protected, overrides, - status, package_policies, agents, - revision, - updated_at, - updated_by, + ...attributes, }; }; diff --git a/x-pack/plugins/fleet/server/services/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policy.test.ts index 690a4807b14af8..d5d4813fdb7e08 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -543,22 +543,27 @@ describe('Agent policy', () => { monitoring_enabled: ['metrics'], }); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + mockedAppContextService.getInternalUserSOClientWithoutSpaceExtension.mockReturnValueOnce( + soClient + ); + await agentPolicyService.bumpAllAgentPolicies(esClient, undefined); - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient, undefined); - - expect(soClient.bulkUpdate).toHaveBeenCalledWith([ - { - attributes: expect.objectContaining({ - fleet_server_hosts: ['http://fleetserver:8220'], - revision: NaN, - updated_by: 'system', + expect(soClient.bulkUpdate).toHaveBeenCalledWith( + [ + expect.objectContaining({ + attributes: expect.objectContaining({ + fleet_server_hosts: ['http://fleetserver:8220'], + revision: NaN, + updated_by: 'system', + }), + id: '93f74c0-e876-11ea-b7d3-8b2acec6f75c', + type: 'ingest_manager_settings', }), - id: '93f74c0-e876-11ea-b7d3-8b2acec6f75c', - references: [], - score: 1, - type: 'ingest_manager_settings', - }, - ]); + ], + expect.objectContaining({ + namespace: 'default', + }) + ); expect(agentPolicyUpdateEventHandler).toHaveBeenCalledTimes(1); }); @@ -571,8 +576,10 @@ describe('Agent policy', () => { monitoring_enabled: ['metrics'], }); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - - await agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, 'output-id-123'); + mockedAppContextService.getInternalUserSOClientWithoutSpaceExtension.mockReturnValueOnce( + soClient + ); + await agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, 'output-id-123'); expect(agentPolicyUpdateEventHandler).toHaveBeenCalledTimes(1); }); @@ -719,12 +726,10 @@ describe('Agent policy', () => { monitoring_enabled: ['metrics'], }); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - - await agentPolicyService.bumpAllAgentPoliciesForDownloadSource( - soClient, - esClient, - 'test-id-1' + mockedAppContextService.getInternalUserSOClientWithoutSpaceExtension.mockReturnValueOnce( + soClient ); + await agentPolicyService.bumpAllAgentPoliciesForDownloadSource(esClient, 'test-id-1'); expect(agentPolicyUpdateEventHandler).toHaveBeenCalledTimes(1); }); diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 6469479b77ef56..8108fca484019d 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -12,8 +12,10 @@ import pMap from 'p-map'; import { lt } from 'semver'; import type { ElasticsearchClient, + SavedObjectsBulkUpdateObject, SavedObjectsBulkUpdateResponse, SavedObjectsClientContract, + SavedObjectsFindResult, SavedObjectsUpdateResponse, } from '@kbn/core/server'; import { SavedObjectsUtils } from '@kbn/core/server'; @@ -114,13 +116,12 @@ const KEY_EDITABLE_FOR_MANAGED_POLICIES = ['namespace']; class AgentPolicyService { private triggerAgentPolicyUpdatedEvent = async ( - soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, action: 'created' | 'updated' | 'deleted', agentPolicyId: string, - options?: { skipDeploy?: boolean } + options?: { skipDeploy?: boolean; spaceId?: string } ) => { - return agentPolicyUpdateEventHandler(soClient, esClient, action, agentPolicyId, options); + return agentPolicyUpdateEventHandler(esClient, action, agentPolicyId, options); }; private async _update( @@ -181,7 +182,9 @@ class AgentPolicyService { }); if (options.bumpRevision || options.removeProtection) { - await this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'updated', id); + await this.triggerAgentPolicyUpdatedEvent(esClient, 'updated', id, { + spaceId: soClient.getCurrentNamespace(), + }); } logger.debug( `Agent policy ${id} update completed, revision: ${ @@ -347,8 +350,9 @@ class AgentPolicyService { ); await appContextService.getUninstallTokenService()?.generateTokenForPolicyId(newSo.id); - await this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'created', newSo.id, { + await this.triggerAgentPolicyUpdatedEvent(esClient, 'created', newSo.id, { skipDeploy: options.skipDeploy, + spaceId: soClient.getCurrentNamespace(), }); logger.debug(`Created new agent policy with id ${newSo.id}`); return { id: newSo.id, ...newSo.attributes }; @@ -391,11 +395,7 @@ class AgentPolicyService { throw new FleetError(agentPolicySO.error.message); } - const agentPolicy = { - id: agentPolicySO.id, - version: agentPolicySO.version, - ...agentPolicySO.attributes, - }; + const agentPolicy = mapAgentPolicySavedObjectToAgentPolicy(agentPolicySO); if (withPackagePolicies) { agentPolicy.package_policies = @@ -432,10 +432,7 @@ class AgentPolicyService { } } - const agentPolicy = { - id: agentPolicySO.id, - ...agentPolicySO.attributes, - }; + const agentPolicy = mapAgentPolicySavedObjectToAgentPolicy(agentPolicySO); if (options.withPackagePolicies) { const agentPolicyWithPackagePolicies = await this.get( soClient, @@ -524,10 +521,7 @@ class AgentPolicyService { const agentPolicies = await pMap( agentPoliciesSO.saved_objects, async (agentPolicySO) => { - const agentPolicy = { - id: agentPolicySO.id, - ...agentPolicySO.attributes, - }; + const agentPolicy = mapAgentPolicySavedObjectToAgentPolicy(agentPolicySO); if (withPackagePolicies) { agentPolicy.package_policies = (await packagePolicyService.findAllForAgentPolicy(soClient, agentPolicySO.id)) || []; @@ -766,10 +760,7 @@ class AgentPolicyService { search: escapeSearchQueryPhrase(outputId), perPage: SO_SEARCH_LIMIT, }) - ).saved_objects.map((so) => ({ - id: so.id, - ...so.attributes, - })); + ).saved_objects.map(mapAgentPolicySavedObjectToAgentPolicy); if (agentPolicies.length > 0) { const getAgentPolicy = (agentPolicy: AgentPolicy) => ({ @@ -827,10 +818,7 @@ class AgentPolicyService { search: escapeSearchQueryPhrase(fleetServerHostId), perPage: SO_SEARCH_LIMIT, }) - ).saved_objects.map((so) => ({ - id: so.id, - ...so.attributes, - })); + ).saved_objects.map(mapAgentPolicySavedObjectToAgentPolicy); if (agentPolicies.length > 0) { await pMap( @@ -846,66 +834,112 @@ class AgentPolicyService { } } - public async bumpAllAgentPoliciesForOutput( - soClient: SavedObjectsClientContract, + private async _bumpPolicies( + internalSoClientWithoutSpaceExtension: SavedObjectsClientContract, esClient: ElasticsearchClient, - outputId: string, + savedObjectsResults: Array>, options?: { user?: AuthenticatedUser } ): Promise> { - const currentPolicies = await soClient.find({ - type: SAVED_OBJECT_TYPE, - fields: ['revision', 'data_output_id', 'monitoring_output_id'], - searchFields: ['data_output_id', 'monitoring_output_id'], - search: escapeSearchQueryPhrase(outputId), - perPage: SO_SEARCH_LIMIT, - }); - const bumpedPolicies = currentPolicies.saved_objects.map((policy) => { - policy.attributes = { - ...policy.attributes, - revision: policy.attributes.revision + 1, - updated_at: new Date().toISOString(), - updated_by: options?.user ? options.user.username : 'system', - }; - return policy; - }); - const res = await soClient.bulkUpdate(bumpedPolicies); + const bumpedPolicies = savedObjectsResults.map( + (policy): SavedObjectsBulkUpdateObject => { + return { + id: policy.id, + type: policy.type, + attributes: { + ...policy.attributes, + revision: policy.attributes.revision + 1, + updated_at: new Date().toISOString(), + updated_by: options?.user ? options.user.username : 'system', + }, + version: policy.version, + namespace: policy.namespaces?.[0], + }; + } + ); + + const bumpedPoliciesBySpaceId = groupBy( + bumpedPolicies, + (policy) => policy.namespace || DEFAULT_SPACE_ID + ); + + const res = ( + await Promise.all( + Object.entries(bumpedPoliciesBySpaceId).map(([spaceId, policies]) => + internalSoClientWithoutSpaceExtension.bulkUpdate(policies, { + namespace: spaceId, + }) + ) + ) + ).reduce( + (acc, r) => { + if (r?.saved_objects) { + acc.saved_objects.push(...r.saved_objects); + } + return acc; + }, + { + saved_objects: [], + } + ); + await pMap( - currentPolicies.saved_objects, - (policy) => this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'updated', policy.id), + savedObjectsResults, + (policy) => + this.triggerAgentPolicyUpdatedEvent(esClient, 'updated', policy.id, { + spaceId: policy.namespaces?.[0], + }), { concurrency: 50 } ); return res; } - public async bumpAllAgentPolicies( - soClient: SavedObjectsClientContract, + public async bumpAllAgentPoliciesForOutput( esClient: ElasticsearchClient, + outputId: string, options?: { user?: AuthenticatedUser } ): Promise> { - const currentPolicies = await soClient.find({ - type: SAVED_OBJECT_TYPE, - fields: ['revision'], - perPage: SO_SEARCH_LIMIT, - }); - const bumpedPolicies = currentPolicies.saved_objects.map((policy) => { - policy.attributes = { - ...policy.attributes, - revision: policy.attributes.revision + 1, - updated_at: new Date().toISOString(), - updated_by: options?.user ? options.user.username : 'system', - }; - return policy; - }); - const res = await soClient.bulkUpdate(bumpedPolicies); + const internalSoClientWithoutSpaceExtension = + appContextService.getInternalUserSOClientWithoutSpaceExtension(); - await pMap( + const currentPolicies = + await internalSoClientWithoutSpaceExtension.find({ + type: SAVED_OBJECT_TYPE, + fields: ['revision', 'data_output_id', 'monitoring_output_id', 'namespaces'], + searchFields: ['data_output_id', 'monitoring_output_id'], + search: escapeSearchQueryPhrase(outputId), + perPage: SO_SEARCH_LIMIT, + namespaces: ['*'], + }); + return this._bumpPolicies( + internalSoClientWithoutSpaceExtension, + esClient, currentPolicies.saved_objects, - (policy) => this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'updated', policy.id), - { concurrency: 50 } + options ); + } - return res; + public async bumpAllAgentPolicies( + esClient: ElasticsearchClient, + options?: { user?: AuthenticatedUser } + ): Promise> { + const internalSoClientWithoutSpaceExtension = + appContextService.getInternalUserSOClientWithoutSpaceExtension(); + + const currentPolicies = + await internalSoClientWithoutSpaceExtension.find({ + type: SAVED_OBJECT_TYPE, + fields: ['name', 'revision', 'namespaces'], + perPage: SO_SEARCH_LIMIT, + namespaces: ['*'], + }); + + return this._bumpPolicies( + internalSoClientWithoutSpaceExtension, + esClient, + currentPolicies.saved_objects, + options + ); } public async delete( @@ -975,7 +1009,9 @@ class AgentPolicyService { } await soClient.delete(SAVED_OBJECT_TYPE, id); - await this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'deleted', id); + await this.triggerAgentPolicyUpdatedEvent(esClient, 'deleted', id, { + spaceId: soClient.getCurrentNamespace(), + }); // cleanup .fleet-policies docs on delete await this.deleteFleetServerPoliciesForPolicyId(esClient, id); @@ -1260,67 +1296,52 @@ class AgentPolicyService { } public async bumpAllAgentPoliciesForDownloadSource( - soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, downloadSourceId: string, options?: { user?: AuthenticatedUser } ): Promise> { - const currentPolicies = await soClient.find({ - type: SAVED_OBJECT_TYPE, - fields: ['revision', 'download_source_id'], - searchFields: ['download_source_id'], - search: escapeSearchQueryPhrase(downloadSourceId), - perPage: SO_SEARCH_LIMIT, - }); - const bumpedPolicies = currentPolicies.saved_objects.map((policy) => { - policy.attributes = { - ...policy.attributes, - revision: policy.attributes.revision + 1, - updated_at: new Date().toISOString(), - updated_by: options?.user ? options.user.username : 'system', - }; - return policy; - }); - const res = await soClient.bulkUpdate(bumpedPolicies); - await pMap( + const internalSoClientWithoutSpaceExtension = + appContextService.getInternalUserSOClientWithoutSpaceExtension(); + const currentPolicies = + await internalSoClientWithoutSpaceExtension.find({ + type: SAVED_OBJECT_TYPE, + fields: ['revision', 'download_source_id', 'namespaces'], + searchFields: ['download_source_id'], + search: escapeSearchQueryPhrase(downloadSourceId), + perPage: SO_SEARCH_LIMIT, + namespaces: ['*'], + }); + + return this._bumpPolicies( + internalSoClientWithoutSpaceExtension, + esClient, currentPolicies.saved_objects, - (policy) => this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'updated', policy.id), - { concurrency: 50 } + options ); - - return res; } public async bumpAllAgentPoliciesForFleetServerHosts( - soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, fleetServerHostId: string, options?: { user?: AuthenticatedUser } ): Promise> { - const currentPolicies = await soClient.find({ - type: SAVED_OBJECT_TYPE, - fields: ['revision', 'fleet_server_host_id'], - searchFields: ['fleet_server_host_id'], - search: escapeSearchQueryPhrase(fleetServerHostId), - perPage: SO_SEARCH_LIMIT, - }); - const bumpedPolicies = currentPolicies.saved_objects.map((policy) => { - policy.attributes = { - ...policy.attributes, - revision: policy.attributes.revision + 1, - updated_at: new Date().toISOString(), - updated_by: options?.user ? options.user.username : 'system', - }; - return policy; - }); - const res = await soClient.bulkUpdate(bumpedPolicies); - await pMap( + const internalSoClientWithoutSpaceExtension = + appContextService.getInternalUserSOClientWithoutSpaceExtension(); + const currentPolicies = + await internalSoClientWithoutSpaceExtension.find({ + type: SAVED_OBJECT_TYPE, + fields: ['revision', 'fleet_server_host_id', 'namespaces'], + searchFields: ['fleet_server_host_id'], + search: escapeSearchQueryPhrase(fleetServerHostId), + perPage: SO_SEARCH_LIMIT, + }); + + return this._bumpPolicies( + internalSoClientWithoutSpaceExtension, + esClient, currentPolicies.saved_objects, - (policy) => this.triggerAgentPolicyUpdatedEvent(soClient, esClient, 'updated', policy.id), - { concurrency: 50 } + options ); - - return res; } public async getInactivityTimeouts( diff --git a/x-pack/plugins/fleet/server/services/agent_policy_update.ts b/x-pack/plugins/fleet/server/services/agent_policy_update.ts index 639cf21cb7833a..54203900a7dc11 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy_update.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy_update.ts @@ -6,7 +6,7 @@ */ import type { KibanaRequest } from '@kbn/core/server'; -import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; +import type { ElasticsearchClient } from '@kbn/core/server'; import { generateEnrollmentAPIKey, deleteEnrollmentApiKeyForAgentPolicyId } from './api_keys'; import { unenrollForAgentPolicyId } from './agents'; @@ -29,18 +29,19 @@ const fakeRequest = { } as unknown as KibanaRequest; export async function agentPolicyUpdateEventHandler( - soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, action: string, agentPolicyId: string, - options?: { skipDeploy?: boolean } + options?: { skipDeploy?: boolean; spaceId?: string } ) { // `soClient` from ingest `appContextService` is used to create policy change actions // to ensure encrypted SOs are handled correctly - const internalSoClient = appContextService.getInternalUserSOClient(fakeRequest); + const internalSoClient = options?.spaceId + ? appContextService.getInternalUserSOClientForSpaceId(options?.spaceId) + : appContextService.getInternalUserSOClient(fakeRequest); if (action === 'created') { - await generateEnrollmentAPIKey(soClient, esClient, { + await generateEnrollmentAPIKey(internalSoClient, esClient, { name: 'Default', agentPolicyId, forceRecreate: true, @@ -55,7 +56,7 @@ export async function agentPolicyUpdateEventHandler( } if (action === 'deleted') { - await unenrollForAgentPolicyId(soClient, esClient, agentPolicyId); + await unenrollForAgentPolicyId(internalSoClient, esClient, agentPolicyId); await deleteEnrollmentApiKeyForAgentPolicyId(esClient, agentPolicyId); } } diff --git a/x-pack/plugins/fleet/server/services/agents/status.ts b/x-pack/plugins/fleet/server/services/agents/status.ts index 041298d57b4eb2..f4d0e312ba0276 100644 --- a/x-pack/plugins/fleet/server/services/agents/status.ts +++ b/x-pack/plugins/fleet/server/services/agents/status.ts @@ -130,14 +130,14 @@ export async function getAgentStatusForAgentPolicy( const allActive = allStatuses - combinedStatuses.unenrolled - combinedStatuses.inactive; return { ...combinedStatuses, + all: allStatuses, + active: allActive, /* @deprecated no agents will have other status */ other: 0, /* @deprecated Agent events do not exists anymore */ events: 0, /* @deprecated use active instead */ total: allActive, - all: allStatuses, - active: allActive, }; } export async function getIncomingDataByAgentsId( diff --git a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.test.ts b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.test.ts index 9200346961f157..ef2209c173510b 100644 --- a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.test.ts +++ b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.test.ts @@ -78,6 +78,40 @@ describe('enrollment api keys', () => { 'User creating enrollment API key [name=test-api-key (mock-uuid)] [policy_id=test-agent-policy]', }); }); + + it('should set namespaces if agent policy specify a space ID', async () => { + const soClient = savedObjectsClientMock.create(); + const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + + esClient.create.mockResolvedValue({ + _id: 'test-enrollment-api-key-id', + } as any); + + esClient.security.createApiKey.mockResolvedValue({ + api_key: 'test-api-key-value', + id: 'test-api-key-id', + } as any); + + mockedAgentPolicyService.get.mockResolvedValue({ + id: 'test-agent-policy', + space_id: 'test123', + } as any); + + await generateEnrollmentAPIKey(soClient, esClient, { + name: 'test-api-key', + expiration: '7d', + agentPolicyId: 'test-agent-policy', + forceRecreate: true, + }); + + expect(esClient.create).toHaveBeenCalledWith( + expect.objectContaining({ + body: expect.objectContaining({ + namespaces: ['test123'], + }), + }) + ); + }); }); describe('deleteEnrollmentApiKey', () => { diff --git a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts index 360723ebcf2204..02e1e9e25e194d 100644 --- a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts +++ b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts @@ -176,14 +176,11 @@ export async function generateEnrollmentAPIKey( } ): Promise { const id = uuidv4(); - const { name: providedKeyName, forceRecreate } = data; + const { name: providedKeyName, forceRecreate, agentPolicyId } = data; const logger = appContextService.getLogger(); logger.debug(`Creating enrollment API key ${data}`); - if (data.agentPolicyId) { - await validateAgentPolicyId(soClient, data.agentPolicyId); - } - const agentPolicyId = data.agentPolicyId; + const agentPolicy = await retrieveAgentPolicyId(soClient, agentPolicyId); if (providedKeyName && !forceRecreate) { let hasMore = true; @@ -276,6 +273,7 @@ export async function generateEnrollmentAPIKey( api_key: apiKey, name, policy_id: agentPolicyId, + namespaces: agentPolicy?.space_id ? [agentPolicy?.space_id] : undefined, created_at: new Date().toISOString(), }; @@ -354,10 +352,8 @@ export async function getEnrollmentAPIKeyById(esClient: ElasticsearchClient, api return enrollmentAPIKey; } -async function validateAgentPolicyId(soClient: SavedObjectsClientContract, agentPolicyId: string) { - try { - await agentPolicyService.get(soClient, agentPolicyId); - } catch (e) { +async function retrieveAgentPolicyId(soClient: SavedObjectsClientContract, agentPolicyId: string) { + return agentPolicyService.get(soClient, agentPolicyId).catch(async (e) => { if (e.isBoom && e.output.statusCode === 404) { throw Boom.badRequest( i18n.translate('xpack.fleet.serverError.agentPolicyDoesNotExist', { @@ -367,7 +363,7 @@ async function validateAgentPolicyId(soClient: SavedObjectsClientContract, agent ); } throw e; - } + }); } function esDocToEnrollmentApiKey(doc: { diff --git a/x-pack/plugins/fleet/server/services/app_context.ts b/x-pack/plugins/fleet/server/services/app_context.ts index 65a0fb6c08f356..533b57f6f76532 100644 --- a/x-pack/plugins/fleet/server/services/app_context.ts +++ b/x-pack/plugins/fleet/server/services/app_context.ts @@ -30,7 +30,7 @@ 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'; +import { SECURITY_EXTENSION_ID, SPACES_EXTENSION_ID } from '@kbn/core-saved-objects-server'; import type { FleetConfigType } from '../../common/types'; import type { ExperimentalFeatures } from '../../common/experimental_features'; @@ -194,13 +194,42 @@ class AppContextService { }); } - public getInternalUserSOClient(request: KibanaRequest) { + public getInternalUserSOClient(request?: KibanaRequest) { + if (!request) { + request = { + headers: {}, + getBasePath: () => '', + path: '/', + route: { settings: {} }, + url: { href: {} }, + raw: { req: { url: '/' } }, + isFakeRequest: true, + } as unknown as KibanaRequest; + } + // 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 getInternalUserSOClientWithoutSpaceExtension() { + const fakeRequest = { + headers: {}, + getBasePath: () => '', + path: '/', + route: { settings: {} }, + url: { href: {} }, + raw: { req: { url: '/' } }, + isFakeRequest: true, + } as unknown as KibanaRequest; + + // soClient as kibana internal users, be careful on how you use it, security is not enabled + return appContextService.getSavedObjects().getScopedClient(fakeRequest, { + excludedExtensions: [SECURITY_EXTENSION_ID, SPACES_EXTENSION_ID], + }); + } + public getInternalUserESClient() { if (!this.esClient) { throw new Error('Elasticsearch start service not set.'); 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 bbaa10728754b9..14f30687951206 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 @@ -426,7 +426,6 @@ describe('install', () => { }); afterEach(() => { (install._installPackage as jest.Mock).mockClear(); - // jest.resetAllMocks(); }); afterAll(() => { jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ @@ -834,10 +833,14 @@ describe('installAssetsForInputPackagePolicy', () => { describe('handleInstallPackageFailure', () => { const mockedLogger = jest.mocked(appContextService.getLogger()); + const savedObjectsClient = savedObjectsClientMock.create(); + beforeEach(() => { + mockedLogger.error.mockClear(); jest.mocked(install._installPackage).mockClear(); + mockGetBundledPackageByPkgKey.mockReset(); + jest.mocked(install._installPackage).mockResolvedValue({} as any); - mockedLogger.error.mockClear(); mockGetBundledPackageByPkgKey.mockResolvedValue(undefined); jest.spyOn(licenseService, 'hasAtLeast').mockReturnValue(true); jest.spyOn(Registry, 'splitPkgKey').mockImplementation((pkgKey: string) => { @@ -860,9 +863,7 @@ describe('handleInstallPackageFailure', () => { }); const pkgName = 'test_package'; - it('should do nothing if error is ', async () => { - const savedObjectsClient = savedObjectsClientMock.create(); - + it('should do nothing if error is ConcurrentInstallOperationError', async () => { const installedPkg: SavedObject = { id: 'test-package', references: [], @@ -893,8 +894,6 @@ describe('handleInstallPackageFailure', () => { }); it('Should rollback on upgrade on FleetError', async () => { - const savedObjectsClient = savedObjectsClientMock.create(); - const installedPkg: SavedObject = { id: 'test-package', references: [], @@ -933,11 +932,10 @@ describe('handleInstallPackageFailure', () => { }), }) ); + jest.mocked(getInstallationObject).mockReset(); }); it('Should update the installation status to: install_failed on rollback error', async () => { - const savedObjectsClient = savedObjectsClientMock.create(); - jest.mocked(install._installPackage).mockRejectedValue(new Error('test error')); const installedPkg: SavedObject = { 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 c5ce7e5f0eca8b..9f200e97c3cfd2 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/install.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/install.ts @@ -9,6 +9,7 @@ import apm from 'elastic-apm-node'; import { i18n } from '@kbn/i18n'; import semverLt from 'semver/functions/lt'; import type Boom from '@hapi/boom'; +import moment from 'moment'; import type { ElasticsearchClient, SavedObject, @@ -53,6 +54,7 @@ import { ConcurrentInstallOperationError, FleetUnauthorizedError, PackageNotFoundError, + FleetTooManyRequestsError, } from '../../../errors'; import { PACKAGES_SAVED_OBJECT_TYPE, MAX_TIME_COMPLETE_INSTALL } from '../../../constants'; import { dataStreamService, licenseService } from '../..'; @@ -89,7 +91,9 @@ import { checkDatasetsNameFormat } from './custom_integrations/validation/check_ import { addErrorToLatestFailedAttempts } from './install_errors_helpers'; import { installIndexTemplatesAndPipelines } from './install_index_template_pipeline'; import { optimisticallyAddEsAssetReferences } from './es_assets_reference'; +import { setLastUploadInstallCache, getLastUploadInstallCache } from './utils'; +export const UPLOAD_RETRY_AFTER_MS = 10000; // 10s const MAX_ENSURE_INSTALL_TIME = 60 * 1000; export async function isPackageInstalled(options: { @@ -361,6 +365,7 @@ interface InstallUploadedArchiveParams { ignoreMappingUpdateErrors?: boolean; skipDataStreamRollover?: boolean; isBundledPackage?: boolean; + skipRateLimitCheck?: boolean; } function getTelemetryEvent(pkgName: string, pkgVersion: string): PackageUpdateEvent { @@ -887,11 +892,33 @@ async function installPackageByUpload({ ignoreMappingUpdateErrors, skipDataStreamRollover, isBundledPackage, + skipRateLimitCheck, }: InstallUploadedArchiveParams): Promise { + const logger = appContextService.getLogger(); + // if an error happens during getInstallType, report that we don't know let installType: InstallType = 'unknown'; const installSource = isBundledPackage ? 'bundled' : 'upload'; + + const timeToWaitString = moment + .utc(moment.duration(UPLOAD_RETRY_AFTER_MS).asMilliseconds()) + .format('s[s]'); + try { + // Check cached timestamp for rate limiting + const lastInstalledBy = getLastUploadInstallCache(); + + if (lastInstalledBy && !skipRateLimitCheck) { + const msSinceLastFetched = Date.now() - (lastInstalledBy || 0); + if (msSinceLastFetched < UPLOAD_RETRY_AFTER_MS) { + logger.error( + `Install by Upload - Too many requests. Wait ${timeToWaitString} before uploading again.` + ); + throw new FleetTooManyRequestsError( + `Too many requests. Please wait ${timeToWaitString} before uploading again.` + ); + } + } const { packageInfo } = await generatePackageInfoFromArchiveBuffer(archiveBuffer, contentType); const pkgName = packageInfo.name; @@ -928,6 +955,8 @@ async function installPackageByUpload({ assetsMap, paths, }; + // update the timestamp of latest installation + setLastUploadInstallCache(); return await installPackageCommon({ packageInstallContext, @@ -1006,6 +1035,7 @@ export async function installPackage(args: InstallPackageParams): Promise = new Map(); + +export const setLastUploadInstallCache = () => { + const logger = appContextService.getLogger(); + const key = 'upload'; + const time = Date.now(); + logger.debug(`Setting timestamp ${time} to cache for install by ${key}`); + return lastInstalledByUpload.set(key, time); +}; + +export const getLastUploadInstallCache = () => { + return lastInstalledByUpload.get('upload'); +}; diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts index aef5bb9fcc9165..b5a2a38b73685d 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.test.ts @@ -15,9 +15,13 @@ import { createAppContextStartContractMock } from '../../mocks'; import { agentPolicyService } from '../agent_policy'; import { packagePolicyService } from '../package_policy'; -import { getAgentsByKuery, getAgentStatusById } from '../agents'; +import { getAgentsByKuery, getAgentStatusById, getAgentStatusForAgentPolicy } from '../agents'; -import { checkFleetServerVersionsForSecretsStorage } from '.'; +import { + checkFleetServerVersionsForSecretsStorage, + hasFleetServersForPolicies, + getFleetServerPolicies, +} from '.'; jest.mock('../agent_policy'); jest.mock('../package_policy'); @@ -111,3 +115,177 @@ describe('checkFleetServerVersionsForSecretsStorage', () => { expect(result).toBe(true); }); }); + +describe('getFleetServerPolicies', () => { + const soClient = savedObjectsClientMock.create(); + const mockPackagePolicies = [ + { + id: 'package-policy-1', + name: 'Package Policy 1', + package: { + name: 'fleet_server', + title: 'Fleet Server', + version: '1.0.0', + }, + policy_id: 'fs-policy-1', + }, + { + id: 'package-policy-2', + name: 'Package Policy 2', + package: { + name: 'fleet_server', + title: 'Fleet Server', + version: '1.0.0', + }, + policy_id: 'fs-policy-2', + }, + { + id: 'package-policy-3', + name: 'Package Policy 3', + package: { + name: 'system', + title: 'System', + version: '1.0.0', + }, + policy_id: 'agent-policy-2', + }, + ]; + const mockFleetServerPolicies = [ + { + id: 'fs-policy-1', + name: 'FS Policy 1', + is_managed: true, + is_default_fleet_server: true, + has_fleet_server: true, + download_source_id: undefined, + fleet_server_host_id: undefined, + }, + { + id: 'fs-policy-2', + name: 'FS Policy 2', + is_managed: true, + is_default_fleet_server: false, + has_fleet_server: false, + download_source_id: undefined, + fleet_server_host_id: undefined, + }, + ]; + + it('should return no policies if there are no fleet server package policies', async () => { + (mockedPackagePolicyService.list as jest.Mock).mockResolvedValueOnce({ + items: [], + }); + const result = await getFleetServerPolicies(soClient); + expect(result).toEqual([]); + }); + + it('should return agent policies with fleet server package policies', async () => { + (mockedPackagePolicyService.list as jest.Mock).mockResolvedValueOnce({ + items: mockPackagePolicies, + }); + (mockedAgentPolicyService.getByIDs as jest.Mock).mockResolvedValueOnce(mockFleetServerPolicies); + const result = await getFleetServerPolicies(soClient); + expect(result).toEqual(mockFleetServerPolicies); + }); +}); + +describe('hasActiveFleetServersForPolicies', () => { + const mockSoClient = savedObjectsClientMock.create(); + const mockEsClient = elasticsearchServiceMock.createInternalClient(); + + it('returns false when no agent IDs are provided', async () => { + const hasFs = await hasFleetServersForPolicies(mockEsClient, mockSoClient, []); + expect(hasFs).toBe(false); + }); + + describe('activeOnly is true', () => { + it('returns true when at least one agent is online', async () => { + (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ + other: 0, + events: 0, + total: 1, + all: 1, + active: 0, + updating: 0, + offline: 0, + inactive: 0, + unenrolled: 0, + online: 1, + error: 0, + }); + const hasFs = await hasFleetServersForPolicies( + mockEsClient, + mockSoClient, + ['policy-1'], + true + ); + expect(hasFs).toBe(true); + }); + + it('returns true when at least one agent is updating', async () => { + (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ + other: 0, + events: 0, + total: 1, + all: 1, + active: 0, + updating: 1, + offline: 0, + inactive: 0, + unenrolled: 0, + online: 0, + error: 0, + }); + const hasFs = await hasFleetServersForPolicies( + mockEsClient, + mockSoClient, + ['policy-1'], + true + ); + expect(hasFs).toBe(true); + }); + + it('returns false when no agents are updating or online', async () => { + (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ + other: 0, + events: 0, + total: 3, + all: 3, + active: 1, + updating: 0, + offline: 1, + inactive: 1, + unenrolled: 1, + online: 0, + error: 1, + }); + const hasFs = await hasFleetServersForPolicies( + mockEsClient, + mockSoClient, + ['policy-1'], + true + ); + expect(hasFs).toBe(false); + }); + }); + + describe('activeOnly is false', () => { + it('returns true when at least one agent is found regardless of its status', async () => { + (getAgentStatusForAgentPolicy as jest.Mock).mockResolvedValueOnce({ + other: 0, + events: 0, + total: 0, + all: 1, + active: 0, + updating: 0, + offline: 1, + inactive: 0, + unenrolled: 0, + online: 0, + error: 0, + }); + const hasFs = await hasFleetServersForPolicies(mockEsClient, mockSoClient, ['policy-1']); + expect(hasFs).toBe(true); + }); + }); +}); diff --git a/x-pack/plugins/fleet/server/services/fleet_server/index.ts b/x-pack/plugins/fleet/server/services/fleet_server/index.ts index 192cb1d626f58a..cebebe2aa94b8b 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/index.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/index.ts @@ -9,26 +9,78 @@ import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/ import semverGte from 'semver/functions/gte'; import semverCoerce from 'semver/functions/coerce'; -import { FLEET_SERVER_SERVERS_INDEX, SO_SEARCH_LIMIT } from '../../constants'; +import type { AgentPolicy } from '../../../common/types'; +import { PACKAGE_POLICY_SAVED_OBJECT_TYPE, FLEET_SERVER_PACKAGE } from '../../../common/constants'; + +import { SO_SEARCH_LIMIT } from '../../constants'; import { getAgentsByKuery, getAgentStatusById } from '../agents'; import { packagePolicyService } from '../package_policy'; import { agentPolicyService } from '../agent_policy'; +import { getAgentStatusForAgentPolicy } from '../agents'; import { appContextService } from '..'; /** - * Check if at least one fleet server is connected + * Retrieve all agent policies which has a Fleet Server package policy */ -export async function hasFleetServers(esClient: ElasticsearchClient) { - const res = await esClient.search<{}, {}>({ - index: FLEET_SERVER_SERVERS_INDEX, - ignore_unavailable: true, - filter_path: 'hits.total', - track_total_hits: true, - rest_total_hits_as_int: true, +export const getFleetServerPolicies = async ( + soClient: SavedObjectsClientContract +): Promise => { + const fleetServerPackagePolicies = await packagePolicyService.list(soClient, { + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name:${FLEET_SERVER_PACKAGE}`, }); - return (res.hits.total as number) > 0; + // Extract associated fleet server agent policy IDs + const fleetServerAgentPolicyIds = [ + ...new Set(fleetServerPackagePolicies.items.map((p) => p.policy_id)), + ]; + + // Retrieve associated agent policies + const fleetServerAgentPolicies = fleetServerAgentPolicyIds.length + ? await agentPolicyService.getByIDs(soClient, fleetServerAgentPolicyIds) + : []; + + return fleetServerAgentPolicies; +}; + +/** + * Check if there is at least one agent enrolled into the given agent policies. + * Assumes that `agentPolicyIds` contains list of Fleet Server agent policies. + * `activeOnly` flag can be used to filter only active agents. + */ +export const hasFleetServersForPolicies = async ( + esClient: ElasticsearchClient, + soClient: SavedObjectsClientContract, + agentPolicyIds: string[], + activeOnly: boolean = false +): Promise => { + if (agentPolicyIds.length > 0) { + const agentStatusesRes = await getAgentStatusForAgentPolicy( + esClient, + soClient, + undefined, + agentPolicyIds.map((id) => `policy_id:${id}`).join(' or ') + ); + + return activeOnly + ? agentStatusesRes.online > 0 || agentStatusesRes.updating > 0 + : agentStatusesRes.all > 0; + } + return false; +}; + +/** + * Check if at least one fleet server agent exists, regardless of its online status + */ +export async function hasFleetServers( + esClient: ElasticsearchClient, + soClient: SavedObjectsClientContract +) { + return await hasFleetServersForPolicies( + esClient, + soClient, + (await getFleetServerPolicies(soClient)).map((policy) => policy.id) + ); } /** diff --git a/x-pack/plugins/fleet/server/services/output.ts b/x-pack/plugins/fleet/server/services/output.ts index 9a339fb33ec78d..f42867f0686bb9 100644 --- a/x-pack/plugins/fleet/server/services/output.ts +++ b/x-pack/plugins/fleet/server/services/output.ts @@ -1076,7 +1076,7 @@ class OutputService { { preset }, { fromPreconfiguration: true } ); - await agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, output.id); + await agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, output.id); }, { concurrency: 5, diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index f4e6eab5374c01..83a229263e7e60 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -327,6 +327,7 @@ describe('policy preconfiguration', () => { mockConfiguredPolicies.clear(); spyAgentPolicyServiceUpdate.mockClear(); spyAgentPolicyServicBumpAllAgentPoliciesForOutput.mockClear(); + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReset(); }); describe('with no bundled packages', () => { @@ -335,6 +336,7 @@ describe('policy preconfiguration', () => { it('should perform a no-op when passed no policies or packages', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -354,6 +356,7 @@ describe('policy preconfiguration', () => { it('should install packages successfully', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -373,6 +376,7 @@ describe('policy preconfiguration', () => { it('should install packages and configure agent policies successfully', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -405,6 +409,7 @@ describe('policy preconfiguration', () => { it('should install packages and configure agent policies successfully if using simplified package policy', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -471,6 +476,7 @@ describe('policy preconfiguration', () => { it('should install prerelease packages if needed', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -490,6 +496,7 @@ describe('policy preconfiguration', () => { it('should pass skipDatastreamRollover flag if configured', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -514,6 +521,7 @@ describe('policy preconfiguration', () => { it('should not add new package policy to existing non managed policies', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockedPackagePolicyService.findAllForAgentPolicy.mockResolvedValue([ { name: 'test_package1' } as PackagePolicy, ]); @@ -564,6 +572,7 @@ describe('policy preconfiguration', () => { it('should add new package policy to existing managed policies', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockedPackagePolicyService.findAllForAgentPolicy.mockResolvedValue([ { name: 'test_package1' } as PackagePolicy, ]); @@ -623,6 +632,7 @@ describe('policy preconfiguration', () => { it('should update keep_monitoring_enabled for existing managed policies', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockedPackagePolicyService.findAllForAgentPolicy.mockResolvedValue([ { name: 'test_package1' } as PackagePolicy, ]); @@ -685,6 +695,7 @@ describe('policy preconfiguration', () => { it('should update keep_monitoring_enabled for existing managed policies (even is the SO is out-of-sync)', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockedPackagePolicyService.findAllForAgentPolicy.mockResolvedValue([ { name: 'test_package1' } as PackagePolicy, ]); @@ -747,7 +758,7 @@ describe('policy preconfiguration', () => { it('should not try to recreate preconfigure package policy that has been renamed', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockedPackagePolicyService.findAllForAgentPolicy.mockResolvedValue([ { name: 'Renamed package policy', id: 'test_package1' } as PackagePolicy, ]); @@ -797,6 +808,7 @@ describe('policy preconfiguration', () => { it('should throw an error when trying to install duplicate packages', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); await expect( ensurePreconfiguredPackagesAndPolicies( @@ -819,6 +831,7 @@ describe('policy preconfiguration', () => { it('should not create a policy and throw an error if install fails for required package', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const policies: PreconfiguredAgentPolicy[] = [ { name: 'Test policy', @@ -852,6 +865,7 @@ describe('policy preconfiguration', () => { it('should not create a policy and throw an error if package is not installed for an unknown reason', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const policies: PreconfiguredAgentPolicy[] = [ { @@ -886,6 +900,7 @@ describe('policy preconfiguration', () => { it('should return a non fatal error if support_agentless is defined in stateful', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ agentless: true, } as any); @@ -922,6 +937,7 @@ describe('policy preconfiguration', () => { it('should not return an error if support_agentless is defined in serverless and agentless is enabled', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ agentless: true, } as any); @@ -957,6 +973,7 @@ describe('policy preconfiguration', () => { it('should return an error if agentless feature flag is disabled on serverless', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); jest.mocked(appContextService.getExperimentalFeatures).mockReturnValue({ agentless: false, } as any); @@ -993,6 +1010,7 @@ describe('policy preconfiguration', () => { it('should not attempt to recreate or modify an agent policy if its ID is unchanged', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies: policiesA, nonFatalErrors: nonFatalErrorsA } = await ensurePreconfiguredPackagesAndPolicies( @@ -1048,6 +1066,7 @@ describe('policy preconfiguration', () => { it('should update a managed policy if top level fields are changed', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); mockConfiguredPolicies.set('test-id', { name: 'Test policy', @@ -1101,6 +1120,7 @@ describe('policy preconfiguration', () => { it('should not update a managed policy if a top level field has not changed', async () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const policy: PreconfiguredAgentPolicy = { name: 'Test policy', namespace: 'default', @@ -1213,6 +1233,7 @@ describe('policy preconfiguration', () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest.mocked(appContextService).getInternalUserSOClientForSpaceId.mockReturnValue(soClient); const { policies, packages, nonFatalErrors } = await ensurePreconfiguredPackagesAndPolicies( soClient, @@ -1251,6 +1272,9 @@ describe('policy preconfiguration', () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; + jest + .mocked(appContextService) + .getInternalUserSOClientForSpaceId.mockReturnValue(soClient); // Install an older version of a test package mockInstalledPackages.set('test_package', { diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.ts b/x-pack/plugins/fleet/server/services/preconfiguration.ts index 9d0e7bc2b151a3..4ab0a9977a5a6f 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.ts @@ -8,6 +8,7 @@ import type { ElasticsearchClient, SavedObjectsClientContract } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; import { groupBy, omit, pick, isEqual } from 'lodash'; +import { DEFAULT_NAMESPACE_STRING } from '@kbn/core-saved-objects-utils-server'; import apm from 'elastic-apm-node'; @@ -177,7 +178,7 @@ export async function ensurePreconfiguredPackagesAndPolicies( const namespacedSoClient = preconfiguredAgentPolicy.space_id ? appContextService.getInternalUserSOClientForSpaceId(preconfiguredAgentPolicy.space_id) - : defaultSoClient; + : appContextService.getInternalUserSOClientForSpaceId(DEFAULT_NAMESPACE_STRING); const { created, policy } = await agentPolicyService.ensurePreconfiguredAgentPolicy( namespacedSoClient, diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_proxies.ts b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_proxies.ts index 6e2685fa8a0972..03787b8e6be65e 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_proxies.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_proxies.ts @@ -101,12 +101,11 @@ async function createOrUpdatePreconfiguredFleetProxies( fleetServerHosts.some((host) => host.is_default) || outputs.some((output) => output.is_default || output.is_default_monitoring) ) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { await pMap( outputs, - (output) => - agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, output.id), + (output) => agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, output.id), { concurrency: 20, } @@ -115,7 +114,6 @@ async function createOrUpdatePreconfiguredFleetProxies( fleetServerHosts, (fleetServerHost) => agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts( - soClient, esClient, fleetServerHost.id ), diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.test.ts index 22651dfae14052..de7578129a09b3 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.test.ts @@ -159,6 +159,7 @@ describe('getCloudFleetServersHosts', () => { deploymentId: 'deployment-id-1', cloudHost: 'us-east-1.aws.found.io', apm: {}, + onboarding: {}, isServerlessEnabled: true, serverless: { projectId: undefined, @@ -176,6 +177,7 @@ describe('getCloudFleetServersHosts', () => { deploymentId: 'deployment-id-1', cloudHost: 'us-east-1.aws.found.io', apm: {}, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -198,6 +200,7 @@ describe('getCloudFleetServersHosts', () => { cloudHost: 'test.fr', cloudDefaultPort: '9243', apm: {}, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -233,6 +236,7 @@ describe('createCloudFleetServerHostIfNeeded', () => { isCloudEnabled: true, deploymentId: 'deployment-id-1', apm: {}, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, @@ -256,6 +260,7 @@ describe('createCloudFleetServerHostIfNeeded', () => { deploymentId: 'deployment-id-1', cloudHost: 'us-east-1.aws.found.io', apm: {}, + onboarding: {}, isServerlessEnabled: false, serverless: { projectId: undefined, diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.ts b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.ts index 5959cc25288cec..aae140b5843b06 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration/fleet_server_host.ts @@ -137,9 +137,9 @@ export async function createOrUpdatePreconfiguredFleetServerHosts( { fromPreconfiguration: true } ); if (data.is_default) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { - await agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts(soClient, esClient, id); + await agentPolicyService.bumpAllAgentPoliciesForFleetServerHosts(esClient, id); } } }) diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/outputs.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration/outputs.test.ts index d640f74f4b03bb..f6feffd24df535 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration/outputs.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration/outputs.test.ts @@ -6,6 +6,7 @@ */ import { elasticsearchServiceMock, savedObjectsClientMock } from '@kbn/core/server/mocks'; +import { appContextService } from '..'; import type { PreconfiguredOutput } from '../../../common/types'; import type { Output } from '../../types'; @@ -29,6 +30,7 @@ const mockedOutputService = outputService as jest.Mocked; jest.mock('../app_context', () => ({ appContextService: { + getInternalUserSOClientWithoutSpaceExtension: jest.fn(), getLogger: () => new Proxy( {}, @@ -48,6 +50,16 @@ const spyAgentPolicyServicBumpAllAgentPoliciesForOutput = jest.spyOn( describe('output preconfiguration', () => { beforeEach(async () => { + const internalSoClientWithoutSpaceExtension = savedObjectsClientMock.create(); + jest + .mocked(appContextService.getInternalUserSOClientWithoutSpaceExtension) + .mockReturnValue(internalSoClientWithoutSpaceExtension); + internalSoClientWithoutSpaceExtension.find.mockResolvedValue({ + saved_objects: [], + page: 0, + per_page: 0, + total: 0, + }); mockedOutputService.create.mockReset(); mockedOutputService.update.mockReset(); mockedOutputService.delete.mockReset(); @@ -439,7 +451,6 @@ describe('output preconfiguration', () => { it('should update output if non preconfigured ES output with the same id exists', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); mockedOutputService.bulkGet.mockResolvedValue([ { id: 'existing-es-output-1', @@ -480,7 +491,6 @@ describe('output preconfiguration', () => { it('should update output if preconfigured ES output exists and changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-es-output-1', @@ -500,7 +510,6 @@ describe('output preconfiguration', () => { it('should update output if preconfigured output exists and changed to is_internal: true', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-es-output-1', @@ -521,7 +530,6 @@ describe('output preconfiguration', () => { it('should update output if a preconfigured logstash ouput exists and has changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-logstash-output-1', @@ -545,7 +553,6 @@ describe('output preconfiguration', () => { it('should update output if a preconfigured logstash ouput with secrets exists and has changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-logstash-output-with-secrets-1', @@ -569,7 +576,6 @@ describe('output preconfiguration', () => { it('should update output if preconfigured kafka output exists and changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-kafka-output-1', @@ -589,7 +595,6 @@ describe('output preconfiguration', () => { it('should update ouput if a preconfigured kafka with secrets exists and has changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-kafka-output-with-secrets-1', @@ -614,7 +619,6 @@ describe('output preconfiguration', () => { it('should update output if preconfigured remote ES output exists and changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-remote-es-output-1', @@ -635,7 +639,6 @@ describe('output preconfiguration', () => { it('should update ouput if a preconfigured remote ES with secrets exists and has changed', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-remote-es-output-with-secrets-1', @@ -658,7 +661,6 @@ describe('output preconfiguration', () => { it('should update output if a preconfigured logstash output with plain value secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-logstash-output-with-secrets-2', @@ -683,7 +685,6 @@ describe('output preconfiguration', () => { it('should update output if a preconfigured kafka output with plain value secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-kafka-output-with-secrets-2', @@ -709,7 +710,6 @@ describe('output preconfiguration', () => { it('should update output if a preconfigured remote ES output with plain value secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-remote-es-output-with-secrets-2', @@ -734,7 +734,6 @@ describe('output preconfiguration', () => { it('should not update output if preconfigured ES output exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-es-output-1', @@ -754,7 +753,6 @@ describe('output preconfiguration', () => { it('should not update output if preconfigured logstash output exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-logstash-output-1', @@ -778,7 +776,6 @@ describe('output preconfiguration', () => { it('should not update output if preconfigured kafka output exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-kafka-output-1', @@ -802,7 +799,6 @@ describe('output preconfiguration', () => { it('should not update output if preconfigured remote ES output exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-remote-es-output-1', @@ -824,7 +820,6 @@ describe('output preconfiguration', () => { it('should not update output if a preconfigured logstash output with secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-logstash-output-with-secrets-1', @@ -849,7 +844,6 @@ describe('output preconfiguration', () => { it('should not update output if a preconfigured kafka output with secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-kafka-output-with-secrets-1', @@ -875,7 +869,6 @@ describe('output preconfiguration', () => { it('should not update output if a preconfigured remote ES output with secrets exists and did not change', async () => { const soClient = savedObjectsClientMock.create(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - soClient.find.mockResolvedValue({ saved_objects: [], page: 0, per_page: 0, total: 0 }); await createOrUpdatePreconfiguredOutputs(soClient, esClient, [ { id: 'existing-remote-es-output-with-secrets-1', diff --git a/x-pack/plugins/fleet/server/services/preconfiguration/outputs.ts b/x-pack/plugins/fleet/server/services/preconfiguration/outputs.ts index a6e76fead77972..fa7103bebb3b45 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration/outputs.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration/outputs.ts @@ -129,9 +129,9 @@ export async function createOrUpdatePreconfiguredOutputs( }); // Bump revision of all policies using that output if (outputData.is_default || outputData.is_default_monitoring) { - await agentPolicyService.bumpAllAgentPolicies(soClient, esClient); + await agentPolicyService.bumpAllAgentPolicies(esClient); } else { - await agentPolicyService.bumpAllAgentPoliciesForOutput(soClient, esClient, id); + await agentPolicyService.bumpAllAgentPoliciesForOutput(esClient, id); } } } diff --git a/x-pack/plugins/fleet/tsconfig.json b/x-pack/plugins/fleet/tsconfig.json index d4807a5ef53b28..8bee11fed5d0e5 100644 --- a/x-pack/plugins/fleet/tsconfig.json +++ b/x-pack/plugins/fleet/tsconfig.json @@ -110,5 +110,6 @@ "@kbn/react-kibana-context-render", "@kbn/fields-metadata-plugin", "@kbn/test-jest-helpers", + "@kbn/core-saved-objects-utils-server", ] } diff --git a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx index 04e519a83b534b..726c41f3994502 100644 --- a/x-pack/plugins/global_search_bar/public/components/search_bar.tsx +++ b/x-pack/plugins/global_search_bar/public/components/search_bar.tsx @@ -71,6 +71,7 @@ export const SearchBar: FC = (opts) => { const [searchableTypes, setSearchableTypes] = useState([]); const [showAppend, setShowAppend] = useState(true); const UNKNOWN_TAG_ID = '__unknown__'; + const [isLoading, setIsLoading] = useState(false); useEffect(() => { if (initialLoad) { @@ -126,7 +127,9 @@ export const SearchBar: FC = (opts) => { searchSubscription.current = null; } + setIsLoading(true); const suggestions = loadSuggestions(searchValue.toLowerCase()); + setIsLoading(false); let aggregatedResults: GlobalSearchResult[] = []; if (searchValue.length !== 0) { @@ -152,7 +155,7 @@ export const SearchBar: FC = (opts) => { // so the SearchOption won't highlight anything if only one call is fired // in practice, this is hard to spot, unlikely to happen, and is a negligible issue setSearchTerm(rawParams.term ?? ''); - + setIsLoading(true); searchSubscription.current = globalSearch.find(searchParams, {}).subscribe({ next: ({ results }) => { if (searchValue.length > 0) { @@ -169,11 +172,14 @@ export const SearchBar: FC = (opts) => { setOptions(aggregatedResults, suggestions, searchParams.tags); }, error: (err) => { + setIsLoading(false); // Not doing anything on error right now because it'll either just show the previous // results or empty results which is basically what we want anyways reportEvent.error({ message: err, searchValue }); }, - complete: () => {}, + complete: () => { + setIsLoading(false); + }, }); } }, @@ -320,6 +326,7 @@ export const SearchBar: FC = (opts) => { return ( { @@ -696,7 +695,6 @@ export class IndexTable extends Component { id="selectAllIndexes" checked={this.areAllItemsSelected()} onChange={this.toggleAll} - type="inList" aria-label={i18n.translate( 'xpack.idxMgmt.indexTable.selectAllIndicesAriaLabel', { diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts index 16d56be207268d..bfbd3316a4b18d 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts @@ -29,19 +29,16 @@ export const getFormActions = (testBed: TestBed) => { component.update(); }; - const toggleVersionSwitch = () => { - act(() => { - form.toggleEuiSwitch('versionToggle'); + const toggleSwitch = async (testSubject: string) => { + await act(async () => { + form.toggleEuiSwitch(testSubject); }); component.update(); }; - const toggleMetaSwitch = () => { - act(() => { - form.toggleEuiSwitch('metaToggle'); - }); - }; + const getToggleValue = (testSubject: string): boolean => + find(testSubject).props()['aria-checked']; const setMetaField = (value: object) => { find('metaEditor').getDOMNode().setAttribute('data-currentvalue', JSON.stringify(value)); @@ -49,10 +46,10 @@ export const getFormActions = (testBed: TestBed) => { }; return { + getToggleValue, clickSubmitButton, clickShowRequestLink, - toggleVersionSwitch, - toggleMetaSwitch, + toggleSwitch, setMetaField, }; }; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx index 01efbc30638705..58701ffb1dd642 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx @@ -19,7 +19,9 @@ import { scopedHistoryMock, uiSettingsServiceMock, applicationServiceMock, + overlayServiceMock, } from '@kbn/core/public/mocks'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; import { usageCollectionPluginMock } from '@kbn/usage-collection-plugin/public/mocks'; @@ -66,6 +68,8 @@ const appServices = { share: { url: new MockUrlService(), }, + overlays: overlayServiceMock.createStartContract(), + http: httpServiceMock.createStartContract({ basePath: '/mock' }), }; export const setupEnvironment = () => { diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx index fb0ab215393f46..3acda54c401dd6 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx @@ -62,25 +62,21 @@ describe('', () => { test('should toggle the version field', async () => { const { actions, exists } = testBed; - // Version field should be hidden by default - expect(exists('versionField')).toBe(false); + // Version field toggle should be disabled by default + expect(actions.getToggleValue('versionToggle')).toBe(false); - actions.toggleVersionSwitch(); + await actions.toggleSwitch('versionToggle'); expect(exists('versionField')).toBe(true); }); test('should toggle the _meta field', async () => { - const { exists, component, actions } = testBed; + const { exists, actions } = testBed; - // Meta editor should be hidden by default - expect(exists('metaEditor')).toBe(false); + // Meta field toggle should be disabled by default + expect(actions.getToggleValue('metaToggle')).toBe(false); - await act(async () => { - actions.toggleMetaSwitch(); - }); - - component.update(); + await actions.toggleSwitch('metaToggle'); expect(exists('metaEditor')).toBe(true); }); @@ -149,12 +145,10 @@ describe('', () => { }); test('should send the correct payload', async () => { - const { component, actions } = testBed; + const { actions } = testBed; + + await actions.toggleSwitch('metaToggle'); - await act(async () => { - actions.toggleMetaSwitch(); - }); - component.update(); const metaData = { field1: 'hello', field2: 10, diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/bulk_request_panel.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/bulk_request_panel.tsx new file mode 100644 index 00000000000000..527f7d3689fe7f --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/bulk_request_panel.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiSpacer, + EuiPanel, + EuiCodeBlock, + EuiText, + EuiSwitch, + EuiSwitchEvent, +} from '@elastic/eui'; + +const bulkRequestExample = `PUT books/_bulk?pipeline=my-pipeline +{ "create":{ } } +{ "name": "Snow Crash", "author": "Neal Stephenson" } +{ "create":{ } } +{ "name": "Revelation Space", "author": "Alastair Reynolds" } +`; + +const singleRequestExample = `POST books/_doc?pipeline=my-pipeline-name +{ + "name": "Snow Crash", + "author": "Neal Stephenson" +} +`; + +export const BulkRequestPanel = () => { + const [showBulkToggle, setShowBulkToggle] = useState(true); + + return ( + + + + + + + + + + + } + checked={showBulkToggle} + onChange={(e: EuiSwitchEvent) => setShowBulkToggle(e.target.checked)} + /> + + + + + {showBulkToggle ? bulkRequestExample : singleRequestExample} + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/collapsible_panel.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/collapsible_panel.tsx new file mode 100644 index 00000000000000..1a736b83cf5f81 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/collapsible_panel.tsx @@ -0,0 +1,107 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState, useEffect, ReactNode } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { + EuiSpacer, + EuiSwitch, + EuiPanel, + EuiAccordion, + EuiAccordionProps, + useGeneratedHtmlId, + EuiSwitchEvent, + EuiSwitchProps, +} from '@elastic/eui'; +import { useFormContext, useFormData } from '../../../shared_imports'; + +export interface CollapsiblePanelRenderProps { + isEnabled: boolean; +} + +interface Props { + title: ReactNode | string; + fieldName: string; + initialToggleState: boolean; + toggleProps?: Partial; + accordionProps?: Partial; + children: (options: CollapsiblePanelRenderProps) => ReactNode; +} + +type AccordionStatus = 'open' | 'closed'; + +export const CollapsiblePanel: React.FunctionComponent = ({ + title, + children, + fieldName, + toggleProps, + accordionProps, + initialToggleState, +}) => { + const form = useFormContext(); + const [formData] = useFormData({ form }); + + const accordionId = useGeneratedHtmlId({ prefix: 'collapsiblerPanel' }); + const [isEnabled, setIsEnabled] = useState(initialToggleState); + const [trigger, setTrigger] = useState(isEnabled ? 'open' : 'closed'); + + // We need to keep track of the initial field value for when the user + // disable the enabled toggle (set field value to null) and then re-enable it. + // In this scenario we want to show the initial value of the form. + const [initialValue, setInitialValue] = useState(); + useEffect(() => { + if (initialValue === undefined && formData[fieldName]) { + setInitialValue(formData[fieldName]); + } + }, [formData, initialValue, fieldName]); + + const onToggleChange = (e: EuiSwitchEvent) => { + const isChecked = !!e.target.checked; + + setIsEnabled(isChecked); + setTrigger(isChecked ? 'open' : 'closed'); + + if (isChecked) { + form.setFieldValue(fieldName, initialValue || ''); + } else { + form.setFieldValue(fieldName, ''); + } + }; + + const onAccordionToggle = (isOpen: boolean) => { + const newState = isOpen ? 'open' : 'closed'; + setTrigger(newState); + }; + + return ( + + + } + checked={isEnabled} + onChange={onToggleChange} + /> + } + > + + {children({ isEnabled })} + + + ); +}; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx index 65e19b2178baf4..30637d00f495c7 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx @@ -6,14 +6,18 @@ */ import React, { useState, useCallback, useRef } from 'react'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { EuiButton, EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import { useForm, Form, FormConfig } from '../../../shared_imports'; +import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; import { Pipeline, Processor } from '../../../../common/types'; +import { useForm, Form, FormConfig, useFormIsModified } from '../../../shared_imports'; +import { useKibana } from '../../../shared_imports'; import { OnUpdateHandlerArg, OnUpdateHandler } from '../pipeline_editor'; +import { deepEqualIgnoreUndefined } from './utils'; import { PipelineRequestFlyout } from './pipeline_request_flyout'; import { PipelineFormFields } from './pipeline_form_fields'; import { PipelineFormError } from './pipeline_form_error'; @@ -48,7 +52,16 @@ export const PipelineForm: React.FunctionComponent = ({ onCancel, canEditName, }) => { + const { + overlays, + history, + application: { navigateToUrl }, + http, + } = useKibana().services; + const [isRequestVisible, setIsRequestVisible] = useState(false); + const [areProcessorsDirty, setAreProcessorsDirty] = useState(false); + const [hasSubmittedForm, setHasSubmittedForm] = useState(false); const { processors: initialProcessors, @@ -74,6 +87,11 @@ export const PipelineForm: React.FunctionComponent = ({ if (processorStateRef.current) { const state = processorStateRef.current; if (await state.validate()) { + // We only want to show unsaved changed prompts to the user when the form + // hasnt been submitted. + setHasSubmittedForm(true); + + // Save the form state, this will also trigger a redirect to pipelines list onSave({ ...formData, ...state.getData() }); } } @@ -85,6 +103,8 @@ export const PipelineForm: React.FunctionComponent = ({ onSubmit: handleSave, }); + const isFormDirty = useFormIsModified({ form }); + const onEditorFlyoutOpen = useCallback(() => { setIsRequestVisible(false); }, [setIsRequestVisible]); @@ -107,10 +127,48 @@ export const PipelineForm: React.FunctionComponent = ({ ); const onProcessorsChangeHandler = useCallback( - (arg) => (processorStateRef.current = arg), - [] + (arg) => { + processorStateRef.current = arg; + + const currentProcessorsState = processorStateRef.current?.getData(); + + // Calculate if the current processor state has changed compared to the + // initial processors state. + setAreProcessorsDirty( + !deepEqualIgnoreUndefined( + { + processors: processorsState?.processors || [], + onFailure: processorsState?.onFailure || [], + }, + { + processors: currentProcessorsState?.processors || [], + onFailure: currentProcessorsState?.on_failure || [], + } + ) + ); + }, + [processorsState] ); + /* + We need to check if the form is dirty and also if the form has been submitted. + Because on form submission we also redirect the user to the pipelines list, + and this could otherwise trigger an unwanted unsaved changes prompt. + */ + useUnsavedChangesPrompt({ + titleText: i18n.translate('xpack.ingestPipelines.form.unsavedPrompt.title', { + defaultMessage: `Exit pipeline creation without saving changes?`, + }), + messageText: i18n.translate('xpack.ingestPipelines.form.unsavedPrompt.body', { + defaultMessage: `The data will be lost if you leave this page without saving the pipeline changes`, + }), + hasUnsavedChanges: (isFormDirty || areProcessorsDirty) && !hasSubmittedForm, + openConfirm: overlays.openConfirm, + history, + http, + navigateToUrl, + }); + return ( <>
    = ({ canEditName={canEditName} /> + + {/* Form submission */} diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx index 97911aab2aa816..79732e6187824f 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx @@ -5,14 +5,22 @@ * 2.0. */ -import React, { useState } from 'react'; +import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; -import { EuiSpacer, EuiSwitch } from '@elastic/eui'; +import { + EuiSpacer, + EuiFlexGroup, + EuiFlexItem, + useIsWithinBreakpoints, + EuiText, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { BulkRequestPanel } from './bulk_request_panel'; +import { CollapsiblePanel, CollapsiblePanelRenderProps } from './collapsible_panel'; import { Processor } from '../../../../common/types'; -import { getUseField, getFormRow, Field, JsonEditorField } from '../../../shared_imports'; +import { getFormRow, getUseField, Field, JsonEditorField } from '../../../shared_imports'; import { ProcessorsEditorContextProvider, @@ -36,20 +44,20 @@ interface Props { const UseField = getUseField({ component: Field }); const FormRow = getFormRow({ titleTag: 'h3' }); +const COLUMN_MAX_WIDTH = 420; + export const PipelineFormFields: React.FunctionComponent = ({ processors, onFailure, onLoadJson, onProcessorsUpdate, - isEditing, hasVersion, hasMeta, onEditorFlyoutOpen, canEditName, + isEditing, }) => { - const [isVersionVisible, setIsVersionVisible] = useState(hasVersion); - - const [isMetaVisible, setIsMetaVisible] = useState(hasMeta); + const shouldHaveFixedWidth = useIsWithinBreakpoints(['l', 'xl']); return ( <> @@ -57,24 +65,10 @@ export const PipelineFormFields: React.FunctionComponent = ({ } description={ - <> - - - - } - checked={isVersionVisible} - onChange={(e) => setIsVersionVisible(e.target.checked)} - data-test-subj="versionToggle" - /> - + } > = ({ euiFieldProps: { disabled: canEditName === false || Boolean(isEditing) }, }} /> - - {isVersionVisible && ( - - )} + + {/* Description field */} = ({ /> - {/* Pipeline Processors Editor */} - - - + - {/* _meta field */} - - } - description={ - <> - - - - - + + {/* Pipeline Processors Editor */} + + + + + + + + + + + + } + fieldName="version" + toggleProps={{ + 'data-test-subj': 'versionToggle', + }} + accordionProps={{ + 'data-test-subj': 'versionAccordion', + }} + initialToggleState={hasVersion} + > + {({ isEnabled }: CollapsiblePanelRenderProps) => ( + <> + - } - checked={isMetaVisible} - onChange={(e) => setIsMetaVisible(e.target.checked)} - data-test-subj="metaToggle" - /> - - } - > - {isMetaVisible && ( - + )} + + + + + + + + + + } + fieldName="_meta" + toggleProps={{ + 'data-test-subj': 'metaToggle', }} - /> - )} - + accordionProps={{ + 'data-test-subj': 'metaAccordion', + }} + initialToggleState={hasMeta} + > + {({ isEnabled }: CollapsiblePanelRenderProps) => ( + <> + + + + + + + + + )} + + + + + + + ); }; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.test.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.test.ts new file mode 100644 index 00000000000000..081400a8f599d0 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.test.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { removeUndefinedValues, deepEqualIgnoreUndefined } from './utils'; + +describe('deepEqualIgnoreUndefined', () => { + const testObjectA = Object.freeze({ + a: 1, + b: { + c: 2, + d: undefined, + }, + }); + + const testObjectB = Object.freeze({ + a: 1, + b: { + c: 2, + d: undefined, + }, + }); + + it('knows how to remove undefined values', () => { + expect(removeUndefinedValues(testObjectA)).toStrictEqual({ + a: 1, + b: { + c: 2, + }, + }); + }); + + it('knows how to compare two objects and see if they are equal ignoring undefined values', () => { + expect(deepEqualIgnoreUndefined(testObjectA, testObjectB)).toBe(true); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.ts new file mode 100644 index 00000000000000..df6b16b3ef2b7b --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/utils.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { transform, isObject, isEqual } from 'lodash'; + +export function removeUndefinedValues(obj: object) { + // If the input is an object, recursively clean each key-value pair. + if (isObject(obj)) { + // Use transform to iterate over the object and build a new result object. + return transform( + obj, + (result: Record, value: any, key: string) => { + const cleanedValue = removeUndefinedValues(value); + if (cleanedValue !== undefined) { + // Only add the key-value pair if the value is not undefined. + result[key as keyof typeof obj] = cleanedValue; + } + }, + {} + ); + } + return obj; +} + +export function deepEqualIgnoreUndefined(obj1: object, obj2: object) { + // Clean both objects by removing undefined values. + const cleanedObj1 = removeUndefinedValues(obj1); + const cleanedObj2 = removeUndefinedValues(obj2); + + return isEqual(cleanedObj1, cleanedObj2); +} diff --git a/x-pack/plugins/ingest_pipelines/public/application/index.tsx b/x-pack/plugins/ingest_pipelines/public/application/index.tsx index 982fc487957d1e..6ec215db8b043c 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/index.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/index.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; import { ApplicationStart } from '@kbn/core/public'; -import { NotificationsSetup, IUiSettingsClient } from '@kbn/core/public'; +import { NotificationsSetup, IUiSettingsClient, OverlayStart, HttpStart } from '@kbn/core/public'; import { ManagementAppMountParams } from '@kbn/management-plugin/public'; import type { ConsolePluginStart } from '@kbn/console-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; @@ -48,6 +48,8 @@ export interface AppServices { application: ApplicationStart; license: ILicense | null; consolePlugin?: ConsolePluginStart; + overlays: OverlayStart; + http: HttpStart; } type StartServices = Pick; diff --git a/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts b/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts index ea6a229cfb73ca..4b6ca4f35cd3ff 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/mount_management_section.ts @@ -28,7 +28,7 @@ export async function mountManagementSection( ) { const { element, setBreadcrumbs, history, license } = params; const [coreStart, depsStart] = await getStartServices(); - const { docLinks, application, executionContext } = coreStart; + const { docLinks, application, executionContext, overlays } = coreStart; documentationService.setup(docLinks); breadcrumbService.setup(setBreadcrumbs); @@ -49,6 +49,8 @@ export async function mountManagementSection( executionContext, license, consolePlugin: depsStart.console, + overlays, + http, }; return renderApp(element, services, { ...coreStart, http }); diff --git a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts index 420da38be6c545..0e24e3c984af91 100644 --- a/x-pack/plugins/ingest_pipelines/public/shared_imports.ts +++ b/x-pack/plugins/ingest_pipelines/public/shared_imports.ts @@ -62,6 +62,7 @@ export { FormDataProvider, getFieldValidityAndErrorMessage, useFormData, + useFormIsModified, } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; export { fieldFormatters, fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; diff --git a/x-pack/plugins/ingest_pipelines/tsconfig.json b/x-pack/plugins/ingest_pipelines/tsconfig.json index 8d14d5f11412dd..1f8fd6eb5f7589 100644 --- a/x-pack/plugins/ingest_pipelines/tsconfig.json +++ b/x-pack/plugins/ingest_pipelines/tsconfig.json @@ -33,7 +33,9 @@ "@kbn/code-editor", "@kbn/react-kibana-context-render", "@kbn/console-plugin", - "@kbn/react-kibana-context-theme" + "@kbn/react-kibana-context-theme", + "@kbn/unsaved-changes-prompt", + "@kbn/core-http-browser-mocks" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx index 61748339d2a723..2beefab2f14397 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/last_value.test.tsx @@ -21,6 +21,7 @@ import type { FormBasedLayer } from '../../types'; import { TermsIndexPatternColumn } from './terms'; import { EuiSwitch, EuiSwitchEvent } from '@elastic/eui'; import { buildExpression, parseExpression } from '@kbn/expressions-plugin/common'; +import { FormRow } from './shared_components'; const uiSettingsMock = {} as IUiSettingsClient; @@ -877,6 +878,7 @@ describe('last_value', () => { expect(new Harness(instance).showArrayValuesSwitchDisabled).toBeTruthy(); }); + it('should not display an array for the last value if the column is referenced', () => { const updateLayerSpy = jest.fn(); const instance = shallow( @@ -892,6 +894,72 @@ describe('last_value', () => { expect(new Harness(instance).arrayValuesSwitchNotExisiting).toBeTruthy(); }); + + it('should show valid sort field for date field', () => { + const instance = shallow( + + ); + + expect(instance.find(FormRow).prop('isInvalid')).toBe(false); + }); + + it('should show invalid sort field for missing field', () => { + const instance = shallow( + + ); + + expect(instance.find(FormRow).prop('isInvalid')).toBe(true); + }); + + it('should show invalid sort field for non-date field', () => { + const instance = shallow( + + ); + + expect(instance.find(FormRow).prop('isInvalid')).toBe(true); + }); }); }); 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 b508534a19800a..337ec8052d0ed3 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 @@ -69,7 +69,7 @@ const supportedTypes = new Set([ 'date_range', ]); -function getInvalidSortFieldMessage( +function getInvalidSortFieldMessages( sortField: string, columnId: string, indexPattern?: IndexPattern @@ -226,7 +226,7 @@ export const lastValueOperation: OperationDefinition< const column = layer.columns[columnId] as LastValueIndexPatternColumn; return [ ...getInvalidFieldMessage(layer, columnId, indexPattern), - ...getInvalidSortFieldMessage(column.params.sortField, columnId, indexPattern), + ...getInvalidSortFieldMessages(column.params.sortField, columnId, indexPattern), ...getColumnReducedTimeRangeError(layer, columnId, indexPattern), ]; }, @@ -331,11 +331,8 @@ export const lastValueOperation: OperationDefinition< }); const dateFields = getDateFields(indexPattern); - const isSortFieldInvalid = !!getInvalidSortFieldMessage( - currentColumn.params.sortField, - '', - indexPattern - ); + const isSortFieldInvalid = + getInvalidSortFieldMessages(currentColumn.params.sortField, '', indexPattern).length > 0; const usingTopValues = Object.keys(layer.columns).some( (_columnId) => layer.columns[_columnId].operationType === 'terms' diff --git a/x-pack/plugins/logstash/server/routes/pipeline/delete.ts b/x-pack/plugins/logstash/server/routes/pipeline/delete.ts index 83c6124b49e141..17de5261dc4b77 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/delete.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/delete.ts @@ -16,7 +16,7 @@ export function registerPipelineDeleteRoute(router: LogstashPluginRouter) { path: '/api/logstash/pipeline/{id}', options: { access: 'public', - description: `Delete a managed Logstash pipeline`, + summary: `Delete a managed Logstash pipeline`, }, validate: { params: schema.object({ diff --git a/x-pack/plugins/logstash/server/routes/pipeline/load.ts b/x-pack/plugins/logstash/server/routes/pipeline/load.ts index 33775866ccdec9..cde032799b3f54 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/load.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/load.ts @@ -18,7 +18,7 @@ export function registerPipelineLoadRoute(router: LogstashPluginRouter) { path: '/api/logstash/pipeline/{id}', options: { access: 'public', - description: `Get a managed Logstash pipeline`, + summary: `Get a managed Logstash pipeline`, }, validate: { params: schema.object({ diff --git a/x-pack/plugins/logstash/server/routes/pipeline/save.ts b/x-pack/plugins/logstash/server/routes/pipeline/save.ts index c40bee2630c739..9e837bf9bd4160 100644 --- a/x-pack/plugins/logstash/server/routes/pipeline/save.ts +++ b/x-pack/plugins/logstash/server/routes/pipeline/save.ts @@ -23,7 +23,7 @@ export function registerPipelineSaveRoute( path: '/api/logstash/pipeline/{id}', options: { access: 'public', - description: `Create a managed Logstash pipeline`, + summary: `Create a managed Logstash pipeline`, }, validate: { params: schema.object({ diff --git a/x-pack/plugins/logstash/server/routes/pipelines/delete.ts b/x-pack/plugins/logstash/server/routes/pipelines/delete.ts index f6d3d795cdee6b..edf235a7357b0d 100644 --- a/x-pack/plugins/logstash/server/routes/pipelines/delete.ts +++ b/x-pack/plugins/logstash/server/routes/pipelines/delete.ts @@ -37,7 +37,7 @@ export function registerPipelinesDeleteRoute(router: LogstashPluginRouter) { { path: '/api/logstash/pipelines/delete', options: { - description: `Delete managed Logstash pipelines`, + summary: `Delete managed Logstash pipelines`, }, validate: { body: schema.object({ diff --git a/x-pack/plugins/logstash/server/routes/pipelines/list.ts b/x-pack/plugins/logstash/server/routes/pipelines/list.ts index e342acb72233b8..30b4e1d08802cc 100644 --- a/x-pack/plugins/logstash/server/routes/pipelines/list.ts +++ b/x-pack/plugins/logstash/server/routes/pipelines/list.ts @@ -28,7 +28,7 @@ export function registerPipelinesListRoute(router: LogstashPluginRouter) { { path: '/api/logstash/pipelines', options: { - description: `Get all managed Logstash pipelines`, + summary: `Get all managed Logstash pipelines`, }, validate: false, }, diff --git a/x-pack/plugins/maps/public/classes/sources/esql_source/convert_to_geojson.ts b/x-pack/plugins/maps/public/classes/sources/esql_source/convert_to_geojson.ts index a446f976b56774..e524c419e59ec0 100644 --- a/x-pack/plugins/maps/public/classes/sources/esql_source/convert_to_geojson.ts +++ b/x-pack/plugins/maps/public/classes/sources/esql_source/convert_to_geojson.ts @@ -8,11 +8,11 @@ // @ts-ignore import { parse } from 'wellknown'; import { Feature, FeatureCollection, GeoJsonProperties } from 'geojson'; -import type { ESQLSearchReponse } from '@kbn/es-types'; +import type { ESQLSearchResponse } from '@kbn/es-types'; import { EMPTY_FEATURE_COLLECTION } from '../../../../common/constants'; import { isGeometryColumn } from './esql_utils'; -export function convertToGeoJson(resp: ESQLSearchReponse): FeatureCollection { +export function convertToGeoJson(resp: ESQLSearchResponse): FeatureCollection { const geometryColumnIndex = resp.columns.findIndex(isGeometryColumn); if (geometryColumnIndex === -1) { return EMPTY_FEATURE_COLLECTION; diff --git a/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx b/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx index a40e8daf79d4a5..da689d12eaee54 100644 --- a/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/esql_source/esql_source.tsx @@ -14,7 +14,7 @@ import { Adapters } from '@kbn/inspector-plugin/common/adapters'; import { getIndexPatternFromESQLQuery, getLimitFromESQLQuery } from '@kbn/esql-utils'; import { buildEsQuery } from '@kbn/es-query'; import type { Filter, Query } from '@kbn/es-query'; -import type { ESQLSearchParams, ESQLSearchReponse } from '@kbn/es-types'; +import type { ESQLSearchParams, ESQLSearchResponse } from '@kbn/es-types'; import { getEsQueryConfig } from '@kbn/data-service/src/es_query'; import { getTime } from '@kbn/data-plugin/public'; import { FIELD_ORIGIN, SOURCE_TYPES, VECTOR_SHAPE_TYPE } from '../../../../common/constants'; @@ -238,7 +238,7 @@ export class ESQLSource requestResponder.ok({ json: rawResponse, requestParams }); - const esqlSearchResponse = rawResponse as unknown as ESQLSearchReponse; + const esqlSearchResponse = rawResponse as unknown as ESQLSearchResponse; const resultsCount = esqlSearchResponse.values.length; return { data: convertToGeoJson(esqlSearchResponse), diff --git a/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js b/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js index d1597cce0fb081..2846b4de6f6edd 100644 --- a/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js +++ b/x-pack/plugins/ml/public/application/components/custom_selection_table/custom_selection_table.js @@ -197,7 +197,6 @@ export function CustomSelectionTable({ label={mobile ? selectAll : null} checked={areAllItemsSelected()} onChange={toggleAll} - type={mobile ? null : 'inList'} /> ); } @@ -283,7 +282,6 @@ export function CustomSelectionTable({ data-test-subj={`${item[tableItemId]}-checkbox`} checked={isItemSelected(item[tableItemId])} onChange={() => toggleItem(item[tableItemId])} - type="inList" /> )} {singleSelection && ( diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx index bb344a2b373a16..6e93775486ed7f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_creation/components/advanced_step/advanced_step_form.tsx @@ -402,6 +402,7 @@ export const AdvancedStepForm: FC = ({ { defaultMessage: 'Define the name of the prediction field in the results. The default is _prediction.', + ignoreTag: true, } )} > diff --git a/x-pack/plugins/ml/server/routes/saved_objects.ts b/x-pack/plugins/ml/server/routes/saved_objects.ts index a184a85eacd32c..6d13b815ee3389 100644 --- a/x-pack/plugins/ml/server/routes/saved_objects.ts +++ b/x-pack/plugins/ml/server/routes/saved_objects.ts @@ -78,7 +78,7 @@ export function savedObjectsRoutes( .get({ path: `${ML_EXTERNAL_BASE_PATH}/saved_objects/sync`, access: 'public', - description: 'Synchronize machine learning saved objects', + summary: 'Synchronize machine learning saved objects', options: { tags: [ 'access:ml:canCreateJob', diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/errors/error_details.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/errors/error_details.cy.ts index e61762629a5371..31030036c1ae11 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/errors/error_details.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/errors/error_details.cy.ts @@ -6,7 +6,7 @@ */ import { getErrorGroupingKey } from '@kbn/apm-synthtrace-client/src/lib/apm/instance'; -import { generateLongId } from '@kbn/apm-synthtrace-client/src/lib/utils/generate_id'; +import { generateLongIdWithSeed } from '@kbn/apm-synthtrace-client/src/lib/utils/generate_id'; import url from 'url'; import { synthtrace } from '../../../synthtrace'; @@ -71,7 +71,7 @@ describe('Error details', () => { }); describe('when error has data', () => { - const errorGroupingKey = generateLongId('Error 1'); + const errorGroupingKey = generateLongIdWithSeed('Error 1'); const errorGroupingKeyShort = errorGroupingKey.slice(0, 5); const errorDetailsPageHref = url.format({ pathname: `/app/apm/services/opbeans-java/errors/${errorGroupingKey}`, diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts index 5f40687274fb5f..915ea4de95bc80 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/transaction_details/large_trace_in_waterfall/large_traces_in_waterfall.cy.ts @@ -42,7 +42,9 @@ describe('Large Trace in waterfall', () => { }); it('renders waterfall items', () => { - cy.getByTestSubj('waterfallItem').should('have.length.greaterThan', 200); + // it renders a virtual list, so the number of items rendered is not the same as the number of items in the trace + cy.getByTestSubj('waterfallItem').should('have.length.at.least', 39); + cy.getByTestSubj('waterfall').should('have.css', 'height').and('eq', '10011px'); }); it('shows warning about trace size', () => { @@ -70,7 +72,9 @@ describe('Large Trace in waterfall', () => { }); it('renders waterfall items', () => { - cy.getByTestSubj('waterfallItem').should('have.length.greaterThan', 400); + // it renders a virtual list, so the number of items rendered is not the same as the number of items in the trace + cy.getByTestSubj('waterfallItem').should('have.length.at.least', 39); + cy.getByTestSubj('waterfall').should('have.css', 'height').and('eq', '10011px'); }); it('does not show the warning about trace size', () => { diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/dependency_operation_detail_view/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/dependency_operation_detail_view/index.tsx index 6505ed76972903..63a7bf42c66504 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/dependency_operation_detail_view/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/dependency_operation_detail_view/index.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiPanel, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { omit, orderBy } from 'lodash'; -import React, { useEffect, useMemo, useRef } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { useHistory } from 'react-router-dom'; import { ChartPointerEventContextProvider } from '../../../context/chart_pointer_event/chart_pointer_event_context'; import { useApmParams } from '../../../hooks/use_apm_params'; @@ -20,6 +20,7 @@ import { ResettingHeightRetainer } from '../../shared/height_retainer/resetting_ import { push, replace } from '../../shared/links/url_helpers'; import { useWaterfallFetcher } from '../transaction_details/use_waterfall_fetcher'; import { WaterfallWithSummary } from '../transaction_details/waterfall_with_summary'; +import { TransactionTab } from '../transaction_details/waterfall_with_summary/transaction_tabs'; import { DependencyOperationDistributionChart } from './dependency_operation_distribution_chart'; import { DetailViewHeader } from './detail_view_header'; import { maybeRedirectToAvailableSpanSample } from './maybe_redirect_to_available_span_sample'; @@ -115,9 +116,37 @@ export function DependencyOperationDetailView() { const isWaterfallLoading = spanFetch.status === FETCH_STATUS.NOT_INITIATED || (spanFetch.status === FETCH_STATUS.LOADING && samples.length === 0) || - waterfallFetch.status === FETCH_STATUS.LOADING || - !waterfallFetch.waterfall.entryWaterfallTransaction; + (waterfallFetch.status === FETCH_STATUS.LOADING && + !waterfallFetch.waterfall.entryWaterfallTransaction); + const onSampleClick = useCallback( + (sample: any) => { + push(history, { query: { spanId: sample.spanId } }); + }, + [history] + ); + + const onTabClick = useCallback( + (nextDetailTab: TransactionTab) => { + push(history, { + query: { + detailTab: nextDetailTab, + }, + }); + }, + [history] + ); + + const onShowCriticalPathChange = useCallback( + (nextShowCriticalPath: boolean) => { + push(history, { + query: { + showCriticalPath: nextShowCriticalPath ? 'true' : 'false', + }, + }); + }, + [history] + ); return ( @@ -147,31 +176,18 @@ export function DependencyOperationDetailView() { { - push(history, { query: { spanId: sample.spanId } }); - }} - onTabClick={(tab) => { - push(history, { - query: { - detailTab: tab, - }, - }); - }} + onSampleClick={onSampleClick} + onTabClick={onTabClick} serviceName={waterfallFetch.waterfall.entryWaterfallTransaction?.doc.service.name} waterfallItemId={waterfallItemId} detailTab={detailTab} selectedSample={selectedSample || null} showCriticalPath={showCriticalPath} - onShowCriticalPathChange={(nextShowCriticalPath) => { - push(history, { - query: { - showCriticalPath: nextShowCriticalPath ? 'true' : 'false', - }, - }); - }} + onShowCriticalPathChange={onShowCriticalPathChange} /> diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/trace_explorer/trace_explorer_waterfall.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/trace_explorer/trace_explorer_waterfall.tsx index 3a65c865f574cb..1bda6985e534e1 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/trace_explorer/trace_explorer_waterfall.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/trace_explorer/trace_explorer_waterfall.tsx @@ -4,14 +4,17 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect } from 'react'; +import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public'; +import React, { useCallback, useEffect } from 'react'; import { useHistory } from 'react-router-dom'; import { useApmParams } from '../../../hooks/use_apm_params'; import { useTimeRange } from '../../../hooks/use_time_range'; import { useTraceExplorerSamples } from '../../../hooks/use_trace_explorer_samples'; +import { ResettingHeightRetainer } from '../../shared/height_retainer/resetting_height_container'; import { push, replace } from '../../shared/links/url_helpers'; import { useWaterfallFetcher } from '../transaction_details/use_waterfall_fetcher'; import { WaterfallWithSummary } from '../transaction_details/waterfall_with_summary'; +import { TransactionTab } from '../transaction_details/waterfall_with_summary/transaction_tabs'; export function TraceExplorerWaterfall() { const history = useHistory(); @@ -52,39 +55,61 @@ export function TraceExplorerWaterfall() { end, }); + const onSampleClick = useCallback( + (sample: any) => { + push(history, { + query: { + traceId: sample.traceId, + transactionId: sample.transactionId, + waterfallItemId: '', + }, + }); + }, + [history] + ); + + const onTabClick = useCallback( + (nextDetailTab: TransactionTab) => { + push(history, { + query: { + detailTab: nextDetailTab, + }, + }); + }, + [history] + ); + + const onShowCriticalPathChange = useCallback( + (nextShowCriticalPath: boolean) => { + push(history, { + query: { + showCriticalPath: nextShowCriticalPath ? 'true' : 'false', + }, + }); + }, + [history] + ); + + const isWaterfallLoading = + waterfallFetchResult.status === FETCH_STATUS.LOADING && + !waterfallFetchResult.waterfall.entryWaterfallTransaction; + return ( - { - push(history, { - query: { - traceId: sample.traceId, - transactionId: sample.transactionId, - waterfallItemId: '', - }, - }); - }} - onTabClick={(nextDetailTab) => { - push(history, { - query: { - detailTab: nextDetailTab, - }, - }); - }} - detailTab={detailTab} - waterfallItemId={waterfallItemId} - serviceName={waterfallFetchResult.waterfall.entryWaterfallTransaction?.doc.service.name} - showCriticalPath={showCriticalPath} - onShowCriticalPathChange={(nextShowCriticalPath) => { - push(history, { - query: { - showCriticalPath: nextShowCriticalPath ? 'true' : 'false', - }, - }); - }} - /> + + + ); } diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/distribution/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/distribution/index.tsx index 31c989169f26f2..f7a976b3cc82d1 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/distribution/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/distribution/index.tsx @@ -92,6 +92,20 @@ export function TransactionDistribution({ [history] ); + const onSampleClick = useCallback( + (sample: { transactionId: string; traceId: string }) => { + history.push({ + ...history.location, + search: fromQuery({ + ...toQuery(history.location.search), + transactionId: sample.transactionId, + traceId: sample.traceId, + }), + }); + }, + [history] + ); + return (
    @@ -111,21 +125,13 @@ export function TransactionDistribution({ { - history.push({ - ...history.location, - search: fromQuery({ - ...toQuery(history.location.search), - transactionId: sample.transactionId, - traceId: sample.traceId, - }), - }); - }} + onSampleClick={onSampleClick} onTabClick={onTabClick} serviceName={serviceName} waterfallItemId={waterfallItemId} detailTab={detailTab as TransactionTab | undefined} - waterfallFetchResult={waterfallFetchResult} + waterfallFetchResult={waterfallFetchResult.waterfall} + waterfallFetchStatus={waterfallFetchResult.status} traceSamplesFetchStatus={traceSamplesFetchResult.status} traceSamples={traceSamplesFetchResult.data?.traceSamples} showCriticalPath={showCriticalPath} diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/index.tsx index c4008570f5c0ba..4c52c2df57432e 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/index.tsx @@ -25,9 +25,10 @@ import { FETCH_STATUS } from '../../../../hooks/use_fetcher'; import { WaterfallFetchResult } from '../use_waterfall_fetcher'; interface Props { - waterfallFetchResult: WaterfallFetchResult; + waterfallFetchResult: WaterfallFetchResult['waterfall']; traceSamples?: TSample[]; traceSamplesFetchStatus: FETCH_STATUS; + waterfallFetchStatus: FETCH_STATUS; environment: Environment; onSampleClick: (sample: TSample) => void; onTabClick: (tab: TransactionTab) => void; @@ -41,6 +42,7 @@ interface Props { export function WaterfallWithSummary({ waterfallFetchResult, + waterfallFetchStatus, traceSamples, traceSamplesFetchStatus, environment, @@ -58,12 +60,12 @@ export function WaterfallWithSummary({ const isControlled = selectedSample !== undefined; const isLoading = - waterfallFetchResult.status === FETCH_STATUS.LOADING || + waterfallFetchStatus === FETCH_STATUS.LOADING || traceSamplesFetchStatus === FETCH_STATUS.LOADING; // When traceId is not present, call to waterfallFetchResult will not be initiated const isSucceded = - (waterfallFetchResult.status === FETCH_STATUS.SUCCESS || - waterfallFetchResult.status === FETCH_STATUS.NOT_INITIATED) && + (waterfallFetchStatus === FETCH_STATUS.SUCCESS || + waterfallFetchStatus === FETCH_STATUS.NOT_INITIATED) && traceSamplesFetchStatus === FETCH_STATUS.SUCCESS; useEffect(() => { @@ -86,7 +88,7 @@ export function WaterfallWithSummary({ : 0 : sampleActivePage; - const { entryTransaction } = waterfallFetchResult.waterfall; + const { entryTransaction } = waterfallFetchResult; if (!entryTransaction && traceSamples?.length === 0 && isSucceded) { return ( @@ -136,7 +138,7 @@ export function WaterfallWithSummary({ @@ -153,8 +155,8 @@ export function WaterfallWithSummary({ ) : ( @@ -167,7 +169,7 @@ export function WaterfallWithSummary({ serviceName={serviceName} waterfallItemId={waterfallItemId} onTabClick={onTabClick} - waterfall={waterfallFetchResult.waterfall} + waterfall={waterfallFetchResult} isLoading={isLoading} showCriticalPath={showCriticalPath} onShowCriticalPathChange={onShowCriticalPathChange} diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx index c8077310575945..d0197f23d5fd52 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/accordion_waterfall.tsx @@ -15,20 +15,24 @@ import { EuiToolTip, } from '@elastic/eui'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import { groupBy } from 'lodash'; import { transparentize } from 'polished'; -import React, { useState } from 'react'; +import React, { useEffect, useRef } from 'react'; +import { WindowScroller, AutoSizer } from 'react-virtualized'; +import { areEqual, ListChildComponentProps, VariableSizeList as List } from 'react-window'; import { asBigNumber } from '../../../../../../../common/utils/formatters'; -import { getCriticalPath } from '../../../../../../../common/critical_path/get_critical_path'; import { useTheme } from '../../../../../../hooks/use_theme'; import { Margins } from '../../../../../shared/charts/timeline'; -import { IWaterfall, IWaterfallSpanOrTransaction } from './waterfall_helpers/waterfall_helpers'; +import { + IWaterfallNodeFlatten, + IWaterfall, + IWaterfallSpanOrTransaction, +} from './waterfall_helpers/waterfall_helpers'; import { WaterfallItem } from './waterfall_item'; +import { WaterfallContextProvider } from './context/waterfall_context'; +import { useWaterfallContext } from './context/use_waterfall'; interface AccordionWaterfallProps { isOpen: boolean; - item: IWaterfallSpanOrTransaction; - level: number; duration: IWaterfall['duration']; waterfallItemId?: string; waterfall: IWaterfall; @@ -38,24 +42,27 @@ interface AccordionWaterfallProps { maxLevelOpen: number; } -const ACCORDION_HEIGHT = '48px'; +type WaterfallProps = Omit< + AccordionWaterfallProps, + 'item' | 'maxLevelOpen' | 'showCriticalPath' | 'waterfall' | 'isOpen' +>; + +interface WaterfallNodeProps extends WaterfallProps { + node: IWaterfallNodeFlatten; +} + +const ACCORDION_HEIGHT = 48; const StyledAccordion = euiStyled(EuiAccordion).withConfig({ - shouldForwardProp: (prop) => !['childrenCount', 'marginLeftLevel', 'hasError'].includes(prop), + shouldForwardProp: (prop) => !['marginLeftLevel', 'hasError'].includes(prop), })< EuiAccordionProps & { - childrenCount: number; marginLeftLevel: number; hasError: boolean; } >` - .waterfall_accordion { - border-top: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; - } - .euiAccordion__childWrapper { - transition: none; - } + border-top: 1px solid ${({ theme }) => theme.eui.euiColorLightShade}; ${(props) => { const borderLeft = props.hasError @@ -63,7 +70,7 @@ const StyledAccordion = euiStyled(EuiAccordion).withConfig({ : `1px solid ${props.theme.eui.euiColorLightShade};`; return `.button_${props.id} { width: 100%; - height: ${ACCORDION_HEIGHT}; + height: ${ACCORDION_HEIGHT}px; margin-left: ${props.marginLeftLevel}px; border-left: ${borderLeft} &:hover { @@ -78,111 +85,166 @@ const StyledAccordion = euiStyled(EuiAccordion).withConfig({ } `; -export function AccordionWaterfall(props: AccordionWaterfallProps) { - const { - item, - level, - duration, - waterfall, - waterfallItemId, - timelineMargins, - onClickWaterfallItem, - showCriticalPath, - maxLevelOpen, - } = props; - const theme = useTheme(); +export function AccordionWaterfall({ + maxLevelOpen, + showCriticalPath, + waterfall, + isOpen, + ...props +}: AccordionWaterfallProps) { + return ( + + + + ); +} - const [isOpen, setIsOpen] = useState(props.isOpen); +function Waterfall(props: WaterfallProps) { + const listRef = useRef(null); + const rowSizeMapRef = useRef(new Map()); + const { traceList } = useWaterfallContext(); - let children = waterfall.childrenByParentId[item.id] || []; + const onRowLoad = (index: number, size: number) => { + rowSizeMapRef.current.set(index, size); + }; - const criticalPath = showCriticalPath ? getCriticalPath(waterfall) : undefined; + const getRowSize = (index: number) => { + // adds 1px for the border top + return rowSizeMapRef.current.get(index) || ACCORDION_HEIGHT + 1; + }; - const criticalPathSegmentsById = groupBy(criticalPath?.segments, (segment) => segment.item.id); + const onScroll = ({ scrollTop }: { scrollTop: number }) => { + listRef.current?.scrollTo(scrollTop); + }; - let displayedColor = item.color; + return ( + + {({ registerChild }) => ( + + {({ width }) => ( +
    + + {VirtualRow} + +
    + )} +
    + )} +
    + ); +} - if (showCriticalPath) { - children = children.filter((child) => criticalPathSegmentsById[child.id]?.length); - displayedColor = transparentize(0.5, item.color); - } +const VirtualRow = React.memo( + ({ + index, + style, + data, + }: ListChildComponentProps< + Omit & { + traceList: IWaterfallNodeFlatten[]; + onLoad: (index: number, size: number) => void; + } + >) => { + const { onLoad, traceList, ...props } = data; - const errorCount = waterfall.getErrorCount(item.id); + const ref = React.useRef(null); + useEffect(() => { + onLoad(index, ref.current?.getBoundingClientRect().height ?? ACCORDION_HEIGHT); + }, [index, onLoad]); - // To indent the items creating the parent/child tree - const marginLeftLevel = 8 * level; + return ( +
    + +
    + ); + }, + areEqual +); - function toggleAccordion() { - setIsOpen((isCurrentOpen) => !isCurrentOpen); - } +const WaterfallNode = React.memo((props: WaterfallNodeProps) => { + const theme = useTheme(); + const { duration, waterfallItemId, onClickWaterfallItem, timelineMargins, node } = props; + const { criticalPathSegmentsById, getErrorCount, updateTreeNode, showCriticalPath } = + useWaterfallContext(); - const hasToggle = !!children.length; + const displayedColor = showCriticalPath ? transparentize(0.5, node.item.color) : node.item.color; + const marginLeftLevel = 8 * node.level; + const hasToggle = !!node.childrenToLoad; + const errorCount = getErrorCount(node.item.id); + + const segments = criticalPathSegmentsById[node.item.id] + ?.filter((segment) => segment.self) + .map((segment) => ({ + id: segment.item.id, + color: theme.eui.euiColorAccent, + left: (segment.offset - node.item.offset - node.item.skew) / node.item.duration, + width: segment.duration / node.item.duration, + })); + + const toggleAccordion = () => { + updateTreeNode({ ...node, expanded: !node.expanded }); + }; + + const onWaterfallItemClick = (flyoutDetailTab: string) => { + onClickWaterfallItem(node.item, flyoutDetailTab); + }; return ( + { - onClickWaterfallItem(item, flyoutDetailTab); - }} - segments={criticalPathSegmentsById[item.id] - ?.filter((segment) => segment.self) - .map((segment) => ({ - color: theme.eui.euiColorAccent, - left: (segment.offset - item.offset - item.skew) / item.duration, - width: segment.duration / item.duration, - }))} + onClick={onWaterfallItemClick} + segments={segments} /> } arrowDisplay="none" - initialIsOpen={true} - forceState={isOpen ? 'open' : 'closed'} + initialIsOpen + forceState={node.expanded ? 'open' : 'closed'} onToggle={toggleAccordion} - > - {isOpen && - children.map((child) => ( - level} - level={level + 1} - item={child} - /> - ))} - + /> ); -} +}); function ToggleAccordionButton({ show, @@ -206,7 +268,7 @@ function ToggleAccordionButton({ display: 'flex', }} > - + {/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
    ; + showCriticalPath: boolean; + traceList: IWaterfallNodeFlatten[]; + getErrorCount: (waterfallItemId: string) => number; + updateTreeNode: (newTree: IWaterfallNodeFlatten) => void; + } & Pick +>({ + criticalPathSegmentsById: {} as Dictionary, + showCriticalPath: false, + traceList: [], + getErrorCount: () => 0, + updateTreeNode: () => undefined, +}); + +export function WaterfallContextProvider({ + showCriticalPath, + waterfall, + maxLevelOpen, + children, + isOpen, +}: PropsWithChildren) { + const [tree, setTree] = useState(null); + const criticalPathSegmentsById = useMemo(() => { + if (!showCriticalPath) { + return {}; + } + + const criticalPath = getCriticalPath(waterfall); + return groupBy(criticalPath.segments, (segment) => segment.item.id); + }, [showCriticalPath, waterfall]); + + const traceList = useMemo(() => { + return convertTreeToList(tree); + }, [tree]); + + const getErrorCount = useCallback( + (waterfallItemId) => waterfall.getErrorCount(waterfallItemId), + [waterfall] + ); + + const updateTreeNode = useCallback( + (updatedNode: IWaterfallNodeFlatten) => { + if (!tree) return; + + const newTree = updateTraceTreeNode({ + root: tree, + updatedNode, + waterfall, + path: { + criticalPathSegmentsById, + showCriticalPath, + }, + }); + + if (newTree) { + setTree(newTree); + } + }, + [criticalPathSegmentsById, showCriticalPath, tree, waterfall] + ); + + useEffect(() => { + const root = buildTraceTree({ + waterfall, + maxLevelOpen, + isOpen, + path: { + criticalPathSegmentsById, + showCriticalPath, + }, + }); + + setTree(root); + }, [criticalPathSegmentsById, isOpen, maxLevelOpen, showCriticalPath, waterfall]); + + return ( + + {children} + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/index.tsx index 54ff6f86fb734e..dbdc877742e1cd 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/index.tsx @@ -11,7 +11,12 @@ import { History } from 'history'; import React, { useMemo, useState } from 'react'; import { useHistory } from 'react-router-dom'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import { Timeline } from '../../../../../shared/charts/timeline'; +import { css } from '@emotion/react'; +import { useTheme } from '../../../../../../hooks/use_theme'; +import { + VerticalLinesContainer, + TimelineAxisContainer, +} from '../../../../../shared/charts/timeline'; import { fromQuery, toQuery } from '../../../../../shared/links/url_helpers'; import { getAgentMarks } from '../marks/get_agent_marks'; import { getErrorMarks } from '../marks/get_error_marks'; @@ -22,7 +27,6 @@ import { IWaterfall, IWaterfallItem } from './waterfall_helpers/waterfall_helper const Container = euiStyled.div` transition: 0.1s padding ease; position: relative; - overflow: hidden; `; const toggleFlyout = ({ @@ -59,35 +63,35 @@ function getWaterfallMaxLevel(waterfall: IWaterfall) { if (!entryId) { return 0; } + let maxLevel = 1; - function countLevels(id: string, currentLevel: number) { + const visited = new Set(); + const queue: Array<{ id: string; level: number }> = [{ id: entryId, level: 1 }]; + + while (queue.length > 0) { + const { id, level } = queue.shift()!; const children = waterfall.childrenByParentId[id] || []; - if (children.length) { - children.forEach((child) => { - // Skip processing when a child node has the same ID as its parent - // to prevent infinite loop - if (child.id !== id) { - countLevels(child.id, currentLevel + 1); - } - }); - } else { - if (maxLevel < currentLevel) { - maxLevel = currentLevel; + + maxLevel = Math.max(maxLevel, level); + visited.add(id); + + children.forEach((child) => { + if (child.id !== id && !visited.has(child.id)) { + queue.push({ id: child.id, level: level + 1 }); + visited.add(child.id); } - } + }); } - countLevels(entryId, 1); return maxLevel; } -// level starts with 0 -const maxLevelOpen = 2; + +const MAX_DEPTH_OPEN_LIMIT = 2; export function Waterfall({ waterfall, waterfallItemId, showCriticalPath }: Props) { const history = useHistory(); + const theme = useTheme(); const [isAccordionOpen, setIsAccordionOpen] = useState(true); - const itemContainerHeight = 58; // TODO: This is a nasty way to calculate the height of the svg element. A better approach should be found - const waterfallHeight = itemContainerHeight * waterfall.items.length; const { duration } = waterfall; @@ -124,47 +128,59 @@ export function Waterfall({ waterfall, waterfallItemId, showCriticalPath }: Prop })} /> )} -
    -
    - { - setIsAccordionOpen((isOpen) => !isOpen); - }} - /> - -
    - - {!waterfall.entryWaterfallTransaction ? null : ( - - toggleFlyout({ history, item, flyoutDetailTab }) - } - showCriticalPath={showCriticalPath} - maxLevelOpen={ - waterfall.traceDocsTotal > 500 ? maxLevelOpen : waterfall.traceDocsTotal - } - /> - )} - + +
    + { + setIsAccordionOpen((isOpen) => !isOpen); + }} + /> +
    + + + {!waterfall.entryWaterfallTransaction ? null : ( + + toggleFlyout({ history, item, flyoutDetailTab }) + } + showCriticalPath={showCriticalPath} + maxLevelOpen={ + waterfall.traceDocsTotal > 500 ? MAX_DEPTH_OPEN_LIMIT : waterfall.traceDocsTotal + } + /> + )} + + { - describe('getWaterfall', () => { - const hits = [ - { - processor: { event: 'transaction' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-node' }, - transaction: { - duration: { us: 49660 }, - name: 'GET /api', - id: 'myTransactionId1', - }, - timestamp: { us: 1549324795784006 }, - } as Transaction, - { - parent: { id: 'mySpanIdA' }, - processor: { event: 'span' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-ruby' }, - transaction: { id: 'myTransactionId2' }, - timestamp: { us: 1549324795825633 }, - span: { - duration: { us: 481 }, - name: 'SELECT FROM products', - id: 'mySpanIdB', - }, - } as Span, - { - parent: { id: 'myTransactionId2' }, - processor: { event: 'span' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-ruby' }, - transaction: { id: 'myTransactionId2' }, - span: { - duration: { us: 6161 }, - name: 'Api::ProductsController#index', - id: 'mySpanIdA', - }, - timestamp: { us: 1549324795824504 }, - } as Span, - { - parent: { id: 'mySpanIdA' }, - processor: { event: 'span' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-ruby' }, - transaction: { id: 'myTransactionId2' }, - span: { - duration: { us: 532 }, - name: 'SELECT FROM product', - id: 'mySpanIdC', - }, - timestamp: { us: 1549324795827905 }, - } as Span, - { - parent: { id: 'myTransactionId1' }, - processor: { event: 'span' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-node' }, - transaction: { id: 'myTransactionId1' }, - span: { - duration: { us: 47557 }, - name: 'GET opbeans-ruby:3000/api/products', - id: 'mySpanIdD', - }, - timestamp: { us: 1549324795785760 }, - } as Span, - { - parent: { id: 'mySpanIdD' }, - processor: { event: 'transaction' }, - trace: { id: 'myTraceId' }, - service: { name: 'opbeans-ruby' }, - transaction: { - duration: { us: 8634 }, - name: 'Api::ProductsController#index', - id: 'myTransactionId2', - marks: { - agent: { - domInteractive: 382, - domComplete: 383, - timeToFirstByte: 14, - }, - }, - }, - timestamp: { us: 1549324795823304 }, - } as unknown as Transaction, - ]; - const errorDocs = [ - { - processor: { event: 'error' }, - parent: { id: 'myTransactionId1' }, - timestamp: { us: 1549324795810000 }, - trace: { id: 'myTraceId' }, - transaction: { id: 'myTransactionId1' }, - error: { - id: 'error1', - grouping_key: 'errorGroupingKey1', - log: { - message: 'error message', + const hits = [ + { + processor: { event: 'transaction' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { + duration: { us: 49660 }, + name: 'GET /api', + id: 'myTransactionId1', + }, + timestamp: { us: 1549324795784006 }, + } as Transaction, + { + parent: { id: 'mySpanIdA' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-ruby' }, + transaction: { id: 'myTransactionId2' }, + timestamp: { us: 1549324795825633 }, + span: { + duration: { us: 481 }, + name: 'SELECT FROM products', + id: 'mySpanIdB', + }, + } as Span, + { + parent: { id: 'myTransactionId2' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-ruby' }, + transaction: { id: 'myTransactionId2' }, + span: { + duration: { us: 6161 }, + name: 'Api::ProductsController#index', + id: 'mySpanIdA', + }, + timestamp: { us: 1549324795824504 }, + } as Span, + { + parent: { id: 'mySpanIdA' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-ruby' }, + transaction: { id: 'myTransactionId2' }, + span: { + duration: { us: 532 }, + name: 'SELECT FROM product', + id: 'mySpanIdC', + }, + timestamp: { us: 1549324795827905 }, + } as Span, + { + parent: { id: 'myTransactionId1' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { id: 'myTransactionId1' }, + span: { + duration: { us: 47557 }, + name: 'GET opbeans-ruby:3000/api/products', + id: 'mySpanIdD', + }, + timestamp: { us: 1549324795785760 }, + } as Span, + { + parent: { id: 'mySpanIdD' }, + processor: { event: 'transaction' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-ruby' }, + transaction: { + duration: { us: 8634 }, + name: 'Api::ProductsController#index', + id: 'myTransactionId2', + marks: { + agent: { + domInteractive: 382, + domComplete: 383, + timeToFirstByte: 14, }, }, - service: { name: 'opbeans-ruby' }, - agent: { - name: 'ruby', - version: '2', + }, + timestamp: { us: 1549324795823304 }, + } as unknown as Transaction, + ]; + const errorDocs = [ + { + processor: { event: 'error' }, + parent: { id: 'myTransactionId1' }, + timestamp: { us: 1549324795810000 }, + trace: { id: 'myTraceId' }, + transaction: { id: 'myTransactionId1' }, + error: { + id: 'error1', + grouping_key: 'errorGroupingKey1', + log: { + message: 'error message', }, - } as unknown as APMError, - ]; + }, + service: { name: 'opbeans-ruby' }, + agent: { + name: 'ruby', + version: '2', + }, + } as unknown as APMError, + ]; + describe('getWaterfall', () => { it('should return full waterfall', () => { const apiResp = { traceItems: { @@ -750,4 +755,229 @@ describe('waterfall_helpers', () => { expect(getOrphanTraceItemsCount(traceItems)).toBe(1); }); }); + + describe('#trace tree', () => { + const waterfall = getWaterfall({ + traceItems: { + traceDocs: hits, + errorDocs, + exceedsMax: false, + spanLinksCountById: {}, + traceDocsTotal: hits.length, + maxTraceItems: 5000, + }, + entryTransaction: { + processor: { event: 'transaction' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { + duration: { us: 49660 }, + name: 'GET /api', + id: 'myTransactionId1', + }, + timestamp: { us: 1549324795784006 }, + } as Transaction, + }); + + const tree: IWaterfallNode = { + id: 'myTransactionId1', + item: { + docType: 'transaction', + doc: { + agent: { name: 'nodejs' }, + processor: { event: 'transaction' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { + duration: { us: 49660 }, + name: 'GET /api', + id: 'myTransactionId1', + type: 'request', + }, + timestamp: { us: 1549324795784006 }, + }, + id: 'myTransactionId1', + duration: 49660, + offset: 0, + skew: 0, + legendValues: { serviceName: 'opbeans-node', spanType: '' }, + color: '', + spanLinksCount: { linkedParents: 0, linkedChildren: 0 }, + }, + children: [ + { + id: '0-mySpanIdD-0', + item: { + docType: 'span', + doc: { + agent: { name: 'nodejs' }, + parent: { id: 'myTransactionId1' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { id: 'myTransactionId1' }, + span: { + duration: { us: 47557 }, + name: 'GET opbeans-ruby:3000/api/products', + id: 'mySpanIdD', + type: 'request', + }, + timestamp: { us: 1549324795785760 }, + }, + id: 'mySpanIdD', + parentId: 'myTransactionId1', + duration: 47557, + offset: 1754, + skew: 0, + legendValues: { serviceName: 'opbeans-node', spanType: '' }, + color: '', + spanLinksCount: { linkedParents: 0, linkedChildren: 0 }, + }, + children: [], + childrenToLoad: 1, + level: 1, + expanded: false, + hasInitializedChildren: false, + }, + ], + level: 0, + childrenToLoad: 1, + expanded: true, + hasInitializedChildren: true, + }; + + describe('buildTraceTree', () => { + it('should build the trace tree correctly', () => { + const result = buildTraceTree({ + waterfall, + path: { + criticalPathSegmentsById: {}, + showCriticalPath: false, + }, + maxLevelOpen: 1, + isOpen: true, + }); + + expect(result).toEqual( + expect.objectContaining({ + item: expect.objectContaining({ id: 'myTransactionId1' }), + level: 0, + expanded: true, + hasInitializedChildren: true, + }) + ); + + expect(result?.children[0]).toEqual( + expect.objectContaining({ + item: expect.objectContaining({ id: 'mySpanIdD' }), + level: 1, + expanded: false, + childrenToLoad: 1, + children: [], + hasInitializedChildren: false, + }) + ); + }); + }); + + describe('convertTreeToList', () => { + it('should convert the trace tree to a list correctly', () => { + const result = convertTreeToList(tree); + + expect(result).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + item: expect.objectContaining({ id: 'myTransactionId1' }), + level: 0, + expanded: true, + hasInitializedChildren: true, + childrenToLoad: 1, + }), + expect.objectContaining({ + item: expect.objectContaining({ id: 'mySpanIdD' }), + level: 1, + expanded: false, + hasInitializedChildren: false, + childrenToLoad: 1, + }), + ]) + ); + }); + }); + + describe('updateTraceTreeNode', () => { + it('should update the "mySpanIdD" node setting "expanded" to true', () => { + const updatedNode: IWaterfallNodeFlatten = { + id: '0-mySpanIdD-0', + item: { + docType: 'span', + doc: { + agent: { name: 'nodejs' }, + parent: { id: 'myTransactionId1' }, + processor: { event: 'span' }, + trace: { id: 'myTraceId' }, + service: { name: 'opbeans-node' }, + transaction: { id: 'myTransactionId1' }, + span: { + duration: { us: 47557 }, + name: 'GET opbeans-ruby:3000/api/products', + id: 'mySpanIdD', + type: 'request', + }, + timestamp: { us: 1549324795785760 }, + }, + id: 'mySpanIdD', + parentId: 'myTransactionId1', + duration: 47557, + offset: 1754, + skew: 0, + legendValues: { serviceName: 'opbeans-node', spanType: '' }, + color: '', + spanLinksCount: { linkedParents: 0, linkedChildren: 0 }, + }, + childrenToLoad: 1, + level: 1, + expanded: true, + hasInitializedChildren: false, + }; + + const result = updateTraceTreeNode({ + root: tree, + updatedNode, + waterfall, + path: { + criticalPathSegmentsById: {}, + showCriticalPath: false, + }, + }); + + expect(result).toEqual( + expect.objectContaining({ + item: expect.objectContaining({ id: 'myTransactionId1' }), + level: 0, + expanded: true, + hasInitializedChildren: true, + }) + ); + + expect(result?.children[0]).toEqual( + expect.objectContaining({ + item: expect.objectContaining({ id: 'mySpanIdD' }), + level: 1, + expanded: true, + hasInitializedChildren: true, + }) + ); + + expect(result?.children[0].children[0]).toEqual( + expect.objectContaining({ + item: expect.objectContaining({ id: 'myTransactionId2' }), + level: 2, + expanded: false, + hasInitializedChildren: false, + }) + ); + }); + }); + }); }); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts index 4d96da07e42feb..b9a8f1d8cd15c9 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_helpers/waterfall_helpers.ts @@ -6,8 +6,9 @@ */ import { euiPaletteColorBlind } from '@elastic/eui'; -import { first, flatten, groupBy, isEmpty, sortBy, uniq } from 'lodash'; +import { Dictionary, first, flatten, groupBy, isEmpty, sortBy, uniq } from 'lodash'; import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import { CriticalPathSegment } from '../../../../../../../../common/critical_path/types'; import type { APIReturnType } from '../../../../../../../services/rest/create_call_apm_api'; import type { Transaction } from '../../../../../../../../typings/es_schemas/ui/transaction'; import { @@ -93,6 +94,23 @@ export interface IWaterfallLegend { color: string; } +export interface IWaterfallNode { + id: string; + item: IWaterfallItem; + // children that are loaded + children: IWaterfallNode[]; + // total number of children that needs to be loaded + childrenToLoad: number; + // collapsed or expanded state + expanded: boolean; + // level in the tree + level: number; + // flag to indicate if children are loaded + hasInitializedChildren: boolean; +} + +export type IWaterfallNodeFlatten = Omit; + function getLegendValues(transactionOrSpan: WaterfallTransaction | WaterfallSpan) { return { [WaterfallLegendType.ServiceName]: transactionOrSpan.service.name, @@ -462,3 +480,186 @@ export function getWaterfall(apiResponse: TraceAPIResponse): IWaterfall { orphanTraceItemsCount, }; } + +function getChildren({ + path, + waterfall, + waterfallItemId, +}: { + waterfallItemId: string; + waterfall: IWaterfall; + path: { + criticalPathSegmentsById: Dictionary; + showCriticalPath: boolean; + }; +}) { + const children = waterfall.childrenByParentId[waterfallItemId] ?? []; + return path.showCriticalPath + ? children.filter((child) => path.criticalPathSegmentsById[child.id]?.length) + : children; +} + +function buildTree({ + root, + waterfall, + maxLevelOpen, + path, +}: { + root: IWaterfallNode; + waterfall: IWaterfall; + maxLevelOpen: number; + path: { + criticalPathSegmentsById: Dictionary; + showCriticalPath: boolean; + }; +}) { + const tree = { ...root }; + const queue: IWaterfallNode[] = [tree]; + + for (let queueIndex = 0; queueIndex < queue.length; queueIndex++) { + const node = queue[queueIndex]; + + const children = getChildren({ path, waterfall, waterfallItemId: node.item.id }); + + // Set childrenToLoad for all nodes enqueued. + // this allows lazy loading of child nodes + node.childrenToLoad = children.length; + + if (maxLevelOpen > node.level) { + children.forEach((child, index) => { + const level = node.level + 1; + + const currentNode: IWaterfallNode = { + id: `${level}-${child.id}-${index}`, + item: child, + children: [], + level, + expanded: level < maxLevelOpen, + childrenToLoad: 0, + hasInitializedChildren: false, + }; + + node.children.push(currentNode); + queue.push(currentNode); + }); + + node.hasInitializedChildren = true; + } + } + + return tree; +} + +export function buildTraceTree({ + waterfall, + maxLevelOpen, + isOpen, + path, +}: { + waterfall: IWaterfall; + maxLevelOpen: number; + isOpen: boolean; + path: { + criticalPathSegmentsById: Dictionary; + showCriticalPath: boolean; + }; +}): IWaterfallNode | null { + const entry = waterfall.entryWaterfallTransaction; + if (!entry) { + return null; + } + + const root: IWaterfallNode = { + id: entry.id, + item: entry, + children: [], + level: 0, + expanded: isOpen, + childrenToLoad: 0, + hasInitializedChildren: false, + }; + + return buildTree({ root, maxLevelOpen, waterfall, path }); +} + +export const convertTreeToList = (root: IWaterfallNode | null): IWaterfallNodeFlatten[] => { + if (!root) { + return []; + } + + const result: IWaterfallNodeFlatten[] = []; + const stack: IWaterfallNode[] = [root]; + + while (stack.length > 0) { + const node = stack.pop()!; + + const { children, ...nodeWithoutChildren } = node; + result.push(nodeWithoutChildren); + + if (node.expanded) { + for (let i = node.children.length - 1; i >= 0; i--) { + stack.push(node.children[i]); + } + } + } + + return result; +}; + +export const updateTraceTreeNode = ({ + root, + updatedNode, + waterfall, + path, +}: { + root: IWaterfallNode; + updatedNode: IWaterfallNodeFlatten; + waterfall: IWaterfall; + path: { + criticalPathSegmentsById: Dictionary; + showCriticalPath: boolean; + }; +}) => { + if (!root) { + return; + } + + const tree = { ...root }; + const stack: Array<{ parent: IWaterfallNode | null; index: number; node: IWaterfallNode }> = [ + { parent: null, index: 0, node: root }, + ]; + + while (stack.length > 0) { + const { parent, index, node } = stack.pop()!; + + if (node.id === updatedNode.id) { + Object.assign(node, updatedNode); + + if (updatedNode.expanded && !updatedNode.hasInitializedChildren) { + Object.assign( + node, + buildTree({ + root: node, + waterfall, + maxLevelOpen: node.level + 1, // Only one level above the current node will be loaded + path, + }) + ); + } + + if (parent) { + parent.children[index] = node; + } else { + Object.assign(tree, node); + } + + return tree; + } + + for (let i = node.children.length - 1; i >= 0; i--) { + stack.push({ parent: node, index: i, node: node.children[i] }); + } + } + + return tree; +}; diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_item.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_item.tsx index 6260c37ffdc5a8..11d0f9bba92985 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_item.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfall/waterfall_item.tsx @@ -7,7 +7,7 @@ import { EuiBadge, EuiIcon, EuiText, EuiTitle, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { ReactNode, useRef, useState, useEffect } from 'react'; +import React, { ReactNode, useRef, useEffect, useState } from 'react'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; import { useTheme } from '../../../../../../hooks/use_theme'; import { isMobileAgentName, isRumAgentName } from '../../../../../../../common/agent_name'; @@ -115,6 +115,7 @@ interface IWaterfallItemProps { errorCount: number; marginLeftLevel: number; segments?: Array<{ + id: string; left: number; width: number; color: string; @@ -267,6 +268,7 @@ export function WaterfallItem({ {segments?.map((segment) => ( +
    + + + + 0 μs + + + 200 μs + + + 400 μs + + + 600 μs + + + 800 μs + + + 1,000 μs + + + +
    + + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 14px; + color: #69707d; + cursor: pointer; + opacity: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.c1 { + width: 11px; + height: 11px; + margin-right: 0; + background: #98a2b3; + border-radius: 100%; +} + + +
    + +
    +
    +
    +
    + + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 14px; + color: #69707d; + cursor: pointer; + opacity: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.c1 { + width: 11px; + height: 11px; + margin-right: 0; + background: #98a2b3; + border-radius: 100%; +} + + +
    + +
    +
    +
    +
    + + .c0 { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -webkit-align-items: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 14px; + color: #69707d; + cursor: pointer; + opacity: 1; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.c1 { + width: 11px; + height: 11px; + margin-right: 0; + background: #98a2b3; + border-radius: 100%; +} + + +
    + +
    +
    +
    +
    +
    +`; + +exports[`Timeline VerticalLinesContainer should render with data 1`] = `
    +> + + + + + + + + + + + + + + +
    `; diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/index.tsx index 8c3f4ab7104e4f..8b0a966b91b442 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/index.tsx @@ -22,39 +22,59 @@ export interface Margins { left: number; } -interface TimelineProps { +export interface TimelineProps { marks?: Mark[]; xMin?: number; xMax?: number; - height: number; margins: Margins; - width?: number; } -function TimeLineContainer({ width, xMin, xMax, height, marks, margins }: TimelineProps) { - if (xMax == null || !width) { +export function TimelineAxisContainer({ xMax, xMin, margins, marks }: TimelineProps) { + const [width, setWidth] = useState(0); + if (xMax === undefined) { return null; } - const plotValues = getPlotValues({ width, xMin, xMax, height, margins }); - const topTraceDuration = xMax - (xMin ?? 0); return ( - <> - - - + setWidth(size.width)}> + {(resizeRef) => { + const plotValues = getPlotValues({ width, xMin, xMax, margins }); + const topTraceDuration = xMax - (xMin ?? 0); + return ( +
    + +
    + ); + }} +
    ); } -export function Timeline(props: TimelineProps) { +export function VerticalLinesContainer({ xMax, xMin, margins, marks }: TimelineProps) { const [width, setWidth] = useState(0); + if (xMax == null) { + return null; + } + return ( setWidth(size.width)}> - {(resizeRef) => ( -
    - -
    - )} + {(resizeRef) => { + const plotValues = getPlotValues({ width, xMin, xMax, margins }); + const topTraceDuration = xMax - (xMin ?? 0); + return ( +
    + +
    + ); + }}
    ); } diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/plot_utils.ts b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/plot_utils.ts index 67fdc04d6529c0..a099c2c39313ac 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/plot_utils.ts +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/plot_utils.ts @@ -14,13 +14,11 @@ export function getPlotValues({ width, xMin = 0, xMax, - height, margins, }: { width: number; xMin?: number; xMax: number; - height: number; margins: Margins; }) { const xScale = scaleLinear() @@ -28,7 +26,6 @@ export function getPlotValues({ .range([margins.left, width - margins.right]); return { - height, margins, tickValues: xScale.ticks(7), width, diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline.test.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline.test.tsx index 82483f609a4691..e6b9d300002297 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline.test.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline.test.tsx @@ -12,10 +12,10 @@ import { mockMoment, toJson, } from '../../../../utils/test_helpers'; -import { Timeline } from '.'; +import { TimelineAxisContainer, TimelineProps, VerticalLinesContainer } from '.'; import { AgentMark } from '../../../app/transaction_details/waterfall_with_summary/waterfall_container/marks/get_agent_marks'; -describe('Timeline', () => { +describe.each([[TimelineAxisContainer], [VerticalLinesContainer]])(`Timeline`, (Component) => { let consoleMock: jest.SpyInstance; beforeAll(() => { @@ -27,19 +27,15 @@ describe('Timeline', () => { consoleMock.mockRestore(); }); - it('should render with data', () => { - const props = { - traceRootDuration: 200000, - width: 1000, - duration: 200000, - height: 116, + it(`${Component.name} should render with data`, () => { + const props: TimelineProps = { + xMax: 1000, margins: { top: 100, left: 50, right: 50, bottom: 0, }, - animation: null, marks: [ { id: 'timeToFirstByte', @@ -62,17 +58,14 @@ describe('Timeline', () => { ] as AgentMark[], }; - const wrapper = mountWithTheme(); + const wrapper = mountWithTheme(); expect(toJson(wrapper)).toMatchSnapshot(); }); - it('should not crash if traceRootDuration is 0', () => { - const props = { - traceRootDuration: 0, - width: 1000, + it(`${Component.name} should not crash if traceRootDuration is 0`, () => { + const props: TimelineProps = { xMax: 0, - height: 116, margins: { top: 100, left: 50, @@ -81,7 +74,7 @@ describe('Timeline', () => { }, }; - const mountTimeline = () => mountWithTheme(); + const mountTimeline = () => mountWithTheme(); expect(mountTimeline).not.toThrow(); }); diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline_axis.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline_axis.tsx index 766008d0c623f4..96bc7da552f90e 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline_axis.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/timeline_axis.tsx @@ -6,7 +6,7 @@ */ import { inRange } from 'lodash'; -import React, { ReactNode } from 'react'; +import React from 'react'; import { getDurationFormatter } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; import { Mark } from '.'; @@ -30,7 +30,6 @@ const getXAxisTickValues = (tickValues: number[], topTraceDuration?: number) => }; interface TimelineAxisProps { - header?: ReactNode; plotValues: PlotValues; marks?: Mark[]; topTraceDuration: number; @@ -54,11 +53,7 @@ export function TimelineAxis({ plotValues, marks = [], topTraceDuration }: Timel return (
    diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/vertical_lines.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/vertical_lines.tsx index 60e89e6b0075f7..96ab6a51e49f38 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/vertical_lines.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/charts/timeline/vertical_lines.tsx @@ -17,7 +17,7 @@ interface VerticalLinesProps { } export function VerticalLines({ topTraceDuration, plotValues, marks = [] }: VerticalLinesProps) { - const { width, height, margins, tickValues, xScale } = plotValues; + const { width, margins, tickValues, xScale } = plotValues; const markTimes = marks.filter((mark) => mark.verticalLine).map(({ offset }) => offset); @@ -38,7 +38,7 @@ export function VerticalLines({ topTraceDuration, plotValues, marks = [] }: Vert return ( ))} @@ -62,7 +62,7 @@ export function VerticalLines({ topTraceDuration, plotValues, marks = [] }: Vert x1={position} x2={position} y1={0} - y2={height} + y2="100%" stroke={theme.eui.euiColorMediumShade} /> ))} @@ -72,7 +72,7 @@ export function VerticalLines({ topTraceDuration, plotValues, marks = [] }: Vert x1={topTraceDurationPosition} x2={topTraceDurationPosition} y1={0} - y2={height} + y2="100%" stroke={theme.eui.euiColorMediumShade} /> )} diff --git a/x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts b/x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts index aeeea398220a08..153b9f4e2ae332 100644 --- a/x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts +++ b/x-pack/plugins/observability_solution/asset_manager/common/constants_entities.ts @@ -6,8 +6,14 @@ */ export const ENTITY_VERSION = 'v1'; -export const ENTITY_BASE_PREFIX = `.entities-observability.summary-${ENTITY_VERSION}`; -export const ENTITY_TRANSFORM_PREFIX = `entities-observability-summary-${ENTITY_VERSION}`; -export const ENTITY_DEFAULT_FREQUENCY = '1m'; -export const ENTITY_DEFAULT_SYNC_DELAY = '60s'; -export const ENTITY_API_PREFIX = '/api/entities'; +export const ENTITY_BASE_PREFIX = '.entities-observability'; +export const ENTITY_HISTORY_BASE_PREFIX = `${ENTITY_BASE_PREFIX}.history-${ENTITY_VERSION}`; +export const ENTITY_LATEST_BASE_PREFIX = `${ENTITY_BASE_PREFIX}.latest-${ENTITY_VERSION}`; +export const ENTITY_HISTORY_TRANSFORM_PREFIX = `entity-history-${ENTITY_VERSION}`; +export const ENTITY_LATEST_TRANSFORM_PREFIX = `entity-latest-${ENTITY_VERSION}`; +export const ENTITY_DEFAULT_HISTORY_FREQUENCY = '1m'; +export const ENTITY_DEFAULT_HISTORY_SYNC_DELAY = '60s'; +export const ENTITY_DEFAULT_LATEST_FREQUENCY = '30s'; +export const ENTITY_DEFAULT_LATEST_SYNC_DELAY = '1s'; +export const ENTITY_DEFAULT_METADATA_LIMIT = 1000; +export const ENTITY_INTERNAL_API_PREFIX = '/internal/api/entities'; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts index cb820d14de4877..c6fbc127230a60 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_ingest_pipeline.ts @@ -7,34 +7,57 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; -import { generateProcessors } from './ingest_pipeline/generate_processors'; import { retryTransientEsErrors } from './helpers/retry'; -import { EntitySecurityException } from './errors/entity_security_exception'; -import { generateIngestPipelineId } from './ingest_pipeline/generate_ingest_pipeline_id'; +import { generateLatestProcessors } from './ingest_pipeline/generate_latest_processors'; +import { generateLatestIngestPipelineId } from './ingest_pipeline/generate_latest_ingest_pipeline_id'; +import { generateHistoryProcessors } from './ingest_pipeline/generate_history_processors'; +import { generateHistoryIngestPipelineId } from './ingest_pipeline/generate_history_ingest_pipeline_id'; -export async function createAndInstallIngestPipeline( +export async function createAndInstallHistoryIngestPipeline( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger, spaceId: string ) { - const processors = generateProcessors(definition, spaceId); - const id = generateIngestPipelineId(definition); try { + const historyProcessors = generateHistoryProcessors(definition, spaceId); + const historyId = generateHistoryIngestPipelineId(definition); await retryTransientEsErrors( () => esClient.ingest.putPipeline({ - id, - processors, + id: historyId, + processors: historyProcessors, }), { logger } ); } catch (e) { - logger.error(`Cannot create entity ingest pipeline for [${definition.id}] entity definition`); - if (e.meta?.body?.error?.type === 'security_exception') { - throw new EntitySecurityException(e.meta.body.error.reason, definition); - } + logger.error( + `Cannot create entity history ingest pipelines for [${definition.id}] entity defintion` + ); + throw e; + } +} +export async function createAndInstallLatestIngestPipeline( + esClient: ElasticsearchClient, + definition: EntityDefinition, + logger: Logger, + spaceId: string +) { + try { + const latestProcessors = generateLatestProcessors(definition, spaceId); + const latestId = generateLatestIngestPipelineId(definition); + await retryTransientEsErrors( + () => + esClient.ingest.putPipeline({ + id: latestId, + processors: latestProcessors, + }), + { logger } + ); + } catch (e) { + logger.error( + `Cannot create entity latest ingest pipelines for [${definition.id}] entity defintion` + ); throw e; } - return id; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts index f8cd02250d8983..aca51df235feab 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/create_and_install_transform.ts @@ -7,24 +7,38 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; -import { generateTransform } from './transform/generate_transform'; import { retryTransientEsErrors } from './helpers/retry'; -import { EntitySecurityException } from './errors/entity_security_exception'; +import { generateLatestTransform } from './transform/generate_latest_transform'; +import { generateHistoryTransform } from './transform/generate_history_transform'; -export async function createAndInstallTransform( +export async function createAndInstallHistoryTransform( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger ) { - const transform = generateTransform(definition); try { - await retryTransientEsErrors(() => esClient.transform.putTransform(transform), { logger }); + const historyTransform = generateHistoryTransform(definition); + await retryTransientEsErrors(() => esClient.transform.putTransform(historyTransform), { + logger, + }); } catch (e) { - logger.error(`Cannot create entity transform for [${definition.id}] entity definition`); - if (e.meta?.body?.error?.type === 'security_exception') { - throw new EntitySecurityException(e.meta.body.error.reason, definition); - } + logger.error(`Cannot create entity history transform for [${definition.id}] entity definition`); + throw e; + } +} + +export async function createAndInstallLatestTransform( + esClient: ElasticsearchClient, + definition: EntityDefinition, + logger: Logger +) { + try { + const latestTransform = generateLatestTransform(definition); + await retryTransientEsErrors(() => esClient.transform.putTransform(latestTransform), { + logger, + }); + } catch (e) { + logger.error(`Cannot create entity latest transform for [${definition.id}] entity definition`); throw e; } - return transform.transform_id; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts index b05dee0f0f2512..dec1ef3b585dcb 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_index.ts @@ -7,16 +7,21 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; -import { generateIndexName } from './helpers/generate_index_name'; +import { generateHistoryIndexName, generateLatestIndexName } from './helpers/generate_index_name'; -export async function deleteIndex( +export async function deleteIndices( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger ) { - const indexName = generateIndexName(definition); try { - await esClient.indices.delete({ index: indexName, ignore_unavailable: true }); + const response = await esClient.indices.resolveIndex({ + name: `${generateHistoryIndexName(definition)}.*,${generateLatestIndexName(definition)}`, + }); + const indices = response.indices.map((doc) => doc.name); + if (indices.length) { + await esClient.indices.delete({ index: indices, ignore_unavailable: true }); + } } catch (e) { logger.error(`Unable to remove entity definition index [${definition.id}}]`); throw e; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts index 1e42282369ef32..80fa96b8109ef4 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/delete_ingest_pipeline.ts @@ -7,21 +7,38 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; -import { generateIngestPipelineId } from './ingest_pipeline/generate_ingest_pipeline_id'; import { retryTransientEsErrors } from './helpers/retry'; +import { generateLatestIngestPipelineId } from './ingest_pipeline/generate_latest_ingest_pipeline_id'; +import { generateHistoryIngestPipelineId } from './ingest_pipeline/generate_history_ingest_pipeline_id'; -export async function deleteIngestPipeline( +export async function deleteHistoryIngestPipeline( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger ) { - const pipelineId = generateIngestPipelineId(definition); try { + const historyPipelineId = generateHistoryIngestPipelineId(definition); await retryTransientEsErrors(() => - esClient.ingest.deletePipeline({ id: pipelineId }, { ignore: [404] }) + esClient.ingest.deletePipeline({ id: historyPipelineId }, { ignore: [404] }) ); } catch (e) { - logger.error(`Unable to delete ingest pipeline [${pipelineId}]`); + logger.error(`Unable to delete history ingest pipeline [${definition.id}].`); + throw e; + } +} + +export async function deleteLatestIngestPipeline( + esClient: ElasticsearchClient, + definition: EntityDefinition, + logger: Logger +) { + try { + const latestPipelineId = generateLatestIngestPipelineId(definition); + await retryTransientEsErrors(() => + esClient.ingest.deletePipeline({ id: latestPipelineId }, { ignore: [404] }) + ); + } catch (e) { + logger.error(`Unable to delete latest ingest pipeline [${definition.id}].`); throw e; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts index c7e0d114c5afb2..10b802c8540e5b 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/errors/entity_security_exception.ts @@ -5,14 +5,9 @@ * 2.0. */ -import { EntityDefinition } from '@kbn/entities-schema'; - export class EntitySecurityException extends Error { - public definition: EntityDefinition; - - constructor(message: string, def: EntityDefinition) { + constructor(message: string) { super(message); this.name = 'EntitySecurityException'; - this.definition = def; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts index fdb808466ba834..3e07c6860a30a5 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/fixtures/entity_definition.ts @@ -7,22 +7,21 @@ import { entityDefinitionSchema } from '@kbn/entities-schema'; export const entityDefinition = entityDefinitionSchema.parse({ - id: 'admin-console-logs-service', + id: 'admin-console-services', name: 'Services for Admin Console', type: 'service', indexPatterns: ['kbn-data-forge-fake_stack.*'], - timestampField: '@timestamp', - identityFields: ['log.logger'], - identityTemplate: 'service:{{log.logger}}', - metadata: ['tags', 'host.name', 'kubernetes.pod.name'], - staticFields: { - projectId: '1234', + history: { + timestampField: '@timestamp', + interval: '1m', }, - lookback: '5m', + identityFields: ['log.logger', { field: 'event.category', optional: true }], + displayNameTemplate: '{{log.logger}}{{#event.category}}:{{.}}{{/event.category}}', + metadata: ['tags', 'host.name'], metrics: [ { name: 'logRate', - equation: 'A / 5', + equation: 'A', metrics: [ { name: 'A', @@ -33,12 +32,12 @@ export const entityDefinition = entityDefinitionSchema.parse({ }, { name: 'errorRate', - equation: 'A / 5', + equation: 'A', metrics: [ { name: 'A', aggregation: 'doc_count', - filter: 'log.level: error', + filter: 'log.level: "ERROR"', }, ], }, diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts index 365104f3571ebf..151ebe75c7065b 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/generate_index_name.ts @@ -6,8 +6,15 @@ */ import { EntityDefinition } from '@kbn/entities-schema'; -import { ENTITY_BASE_PREFIX } from '../../../../common/constants_entities'; +import { + ENTITY_HISTORY_BASE_PREFIX, + ENTITY_LATEST_BASE_PREFIX, +} from '../../../../common/constants_entities'; -export function generateIndexName(definition: EntityDefinition) { - return `${ENTITY_BASE_PREFIX}.${definition.id}`; +export function generateLatestIndexName(definition: EntityDefinition) { + return `${ENTITY_LATEST_BASE_PREFIX}.${definition.id}`; +} + +export function generateHistoryIndexName(definition: EntityDefinition) { + return `${ENTITY_HISTORY_BASE_PREFIX}.${definition.id}`; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts index 421289d1c04791..c6ce2d9924fa3f 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/helpers/retry.ts @@ -8,6 +8,7 @@ import { setTimeout } from 'timers/promises'; import { errors as EsErrors } from '@elastic/elasticsearch'; import type { Logger } from '@kbn/logging'; +import { EntitySecurityException } from '../errors/entity_security_exception'; const MAX_ATTEMPTS = 5; @@ -48,6 +49,10 @@ export const retryTransientEsErrors = async ( return retryTransientEsErrors(esCall, { logger, attempt: retryCount }); } + if (e.meta?.body?.error?.type === 'security_exception') { + throw new EntitySecurityException(e.meta.body.error.reason); + } + throw e; } }; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap new file mode 100644 index 00000000000000..8783bab7b5589d --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_history_processors.test.ts.snap @@ -0,0 +1,111 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generateHistoryProcessors(definition) should genearte a valid pipeline 1`] = ` +Array [ + Object { + "set": Object { + "field": "event.ingested", + "value": "{{{_ingest.timestamp}}}", + }, + }, + Object { + "set": Object { + "field": "entity.spaceId", + "value": "default", + }, + }, + Object { + "set": Object { + "field": "entity.definitionId", + "value": "admin-console-services", + }, + }, + Object { + "set": Object { + "field": "entity.displayName", + "value": "{{entity.identityFields.log.logger}}{{#entity.identityFields.event.category}}:{{.}}{{/entity.identityFields.event.category}}", + }, + }, + Object { + "script": Object { + "description": "Generated the entity.id field", + "source": " + // This function will recursively collect all the values of a HashMap of HashMaps + Collection collectValues(HashMap subject) { + Collection values = new ArrayList(); + // Iterate through the values + for(Object value: subject.values()) { + // If the value is a HashMap, recurse + if (value instanceof HashMap) { + values.addAll(collectValues((HashMap) value)); + } else { + values.add(String.valueOf(value)); + } + } + return values; + } + + // Create the string builder + StringBuilder entityId = new StringBuilder(); + + if (ctx[\\"entity\\"][\\"identityFields\\"] != null) { + // Get the values as a collection + Collection values = collectValues(ctx[\\"entity\\"][\\"identityFields\\"]); + + // Convert to a list and sort + List sortedValues = new ArrayList(values); + Collections.sort(sortedValues); + + // Create comma delimited string + for(String instanceValue: sortedValues) { + entityId.append(instanceValue); + entityId.append(\\":\\"); + } + + // Assign the slo.instanceId + ctx[\\"entity\\"][\\"id\\"] = entityId.length() > 0 ? entityId.substring(0, entityId.length() - 1) : \\"unknown\\"; + } + ", + }, + }, + Object { + "fingerprint": Object { + "fields": Array [ + "entity.id", + ], + "method": "MurmurHash3", + "target_field": "entity.id", + }, + }, + Object { + "script": Object { + "source": "if (ctx.entity?.metadata?.tags != null) { + ctx[\\"tags\\"] = ctx.entity.metadata.tags.keySet(); +} +if (ctx.entity?.metadata?.host?.name != null) { + ctx[\\"host\\"] = new HashMap(); + ctx[\\"host\\"][\\"name\\"] = ctx.entity.metadata.host.name.keySet(); +} +", + }, + }, + Object { + "remove": Object { + "field": "entity.metadata", + "ignore_missing": true, + }, + }, + Object { + "date_index_name": Object { + "date_formats": Array [ + "UNIX_MS", + "ISO8601", + "yyyy-MM-dd'T'HH:mm:ss.SSSXX", + ], + "date_rounding": "M", + "field": "@timestamp", + "index_name_prefix": ".entities-observability.history-v1.admin-console-services.default.", + }, + }, +] +`; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap new file mode 100644 index 00000000000000..3b6cee7db59f7f --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_latest_processors.test.ts.snap @@ -0,0 +1,48 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generateLatestProcessors(definition) should genearte a valid pipeline 1`] = ` +Array [ + Object { + "set": Object { + "field": "event.ingested", + "value": "{{{_ingest.timestamp}}}", + }, + }, + Object { + "set": Object { + "field": "entity.spaceId", + "value": "default", + }, + }, + Object { + "set": Object { + "field": "entity.definitionId", + "value": "admin-console-services", + }, + }, + Object { + "script": Object { + "source": "if (ctx.entity?.metadata?.tags.data != null) { + ctx[\\"tags\\"] = ctx.entity.metadata.tags.data.keySet(); +} +if (ctx.entity?.metadata?.host?.name.data != null) { + ctx[\\"host\\"] = new HashMap(); + ctx[\\"host\\"][\\"name\\"] = ctx.entity.metadata.host.name.data.keySet(); +} +", + }, + }, + Object { + "remove": Object { + "field": "entity.metadata", + "ignore_missing": true, + }, + }, + Object { + "set": Object { + "field": "_index", + "value": ".entities-observability.latest-v1.admin-console-services.default", + }, + }, +] +`; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_processors.test.ts.snap b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_processors.test.ts.snap deleted file mode 100644 index 43bae00156a4c7..00000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/__snapshots__/generate_processors.test.ts.snap +++ /dev/null @@ -1,76 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`generateProcessors(definition) should genearte a valid pipeline 1`] = ` -Array [ - Object { - "set": Object { - "field": "event.ingested", - "value": "{{{_ingest.timestamp}}}", - }, - }, - Object { - "set": Object { - "field": "entity.spaceId", - "value": "test", - }, - }, - Object { - "set": Object { - "field": "entity.definitionId", - "value": "admin-console-logs-service", - }, - }, - Object { - "set": Object { - "field": "entity.indexPatterns", - "value": "[\\"kbn-data-forge-fake_stack.*\\"]", - }, - }, - Object { - "json": Object { - "field": "entity.indexPatterns", - }, - }, - Object { - "set": Object { - "field": "entity.id", - "value": "service:{{entity.identity.log.logger}}", - }, - }, - Object { - "set": Object { - "field": "projectId", - "value": "1234", - }, - }, - Object { - "script": Object { - "source": "if (ctx.entity?.metadata?.tags != null) { - ctx[\\"tags\\"] = ctx.entity.metadata.tags.keySet(); -} -if (ctx.entity?.metadata?.host?.name != null) { - ctx[\\"host\\"] = new HashMap(); - ctx[\\"host\\"][\\"name\\"] = ctx.entity.metadata.host.name.keySet(); -} -if (ctx.entity?.metadata?.kubernetes?.pod?.name != null) { - ctx[\\"kubernetes\\"] = new HashMap(); - ctx[\\"kubernetes\\"][\\"pod\\"] = new HashMap(); - ctx[\\"kubernetes\\"][\\"pod\\"][\\"name\\"] = ctx.entity.metadata.kubernetes.pod.name.keySet(); -} -", - }, - }, - Object { - "remove": Object { - "field": "entity.metadata", - "ignore_missing": true, - }, - }, - Object { - "set": Object { - "field": "_index", - "value": ".entities-observability.summary-v1.admin-console-logs-service", - }, - }, -] -`; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform_id.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts similarity index 58% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform_id.ts rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts index 06faedb916774d..103e0950d58ff8 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform_id.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_ingest_pipeline_id.ts @@ -6,8 +6,8 @@ */ import { EntityDefinition } from '@kbn/entities-schema'; -import { ENTITY_TRANSFORM_PREFIX } from '../../../../common/constants_entities'; +import { ENTITY_HISTORY_BASE_PREFIX } from '../../../../common/constants_entities'; -export function generateTransformId(definition: EntityDefinition) { - return `${ENTITY_TRANSFORM_PREFIX}-${definition.id}`; +export function generateHistoryIngestPipelineId(definition: EntityDefinition) { + return `${ENTITY_HISTORY_BASE_PREFIX}.${definition.id}`; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts new file mode 100644 index 00000000000000..8203d06c1f8edf --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.test.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { entityDefinition } from '../helpers/fixtures/entity_definition'; +import { generateHistoryProcessors } from './generate_history_processors'; + +describe('generateHistoryProcessors(definition)', () => { + it('should genearte a valid pipeline', () => { + const processors = generateHistoryProcessors(entityDefinition, 'default'); + expect(processors).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts new file mode 100644 index 00000000000000..198f129c94db52 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_history_processors.ts @@ -0,0 +1,144 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition } from '@kbn/entities-schema'; +import { generateHistoryIndexName } from '../helpers/generate_index_name'; + +function createIdTemplate(definition: EntityDefinition) { + return definition.identityFields.reduce((template, id) => { + return template.replaceAll(id.field, `entity.identityFields.${id.field}`); + }, definition.displayNameTemplate); +} + +function mapDesitnationToPainless(destination: string, source: string) { + const fieldParts = destination.split('.'); + return fieldParts.reduce((acc, _part, currentIndex, parts) => { + if (currentIndex + 1 === parts.length) { + return `${acc}\n ctx${parts + .map((s) => `["${s}"]`) + .join('')} = ctx.entity.metadata.${source}.keySet();`; + } + return `${acc}\n ctx${parts + .slice(0, currentIndex + 1) + .map((s) => `["${s}"]`) + .join('')} = new HashMap();`; + }, ''); +} + +function createMetadataPainlessScript(definition: EntityDefinition) { + if (!definition.metadata) { + return ''; + } + return definition.metadata.reduce((script, def) => { + const source = def.source; + const destination = def.destination || def.source; + return `${script}if (ctx.entity?.metadata?.${source.replaceAll( + '.', + '?.' + )} != null) {${mapDesitnationToPainless(destination, source)}\n}\n`; + }, ''); +} + +export function generateHistoryProcessors(definition: EntityDefinition, spaceId: string) { + return [ + { + set: { + field: 'event.ingested', + value: '{{{_ingest.timestamp}}}', + }, + }, + { + set: { + field: 'entity.spaceId', + value: spaceId, + }, + }, + { + set: { + field: 'entity.definitionId', + value: definition.id, + }, + }, + { + set: { + field: 'entity.displayName', + value: createIdTemplate(definition), + }, + }, + { + script: { + description: 'Generated the entity.id field', + source: ` + // This function will recursively collect all the values of a HashMap of HashMaps + Collection collectValues(HashMap subject) { + Collection values = new ArrayList(); + // Iterate through the values + for(Object value: subject.values()) { + // If the value is a HashMap, recurse + if (value instanceof HashMap) { + values.addAll(collectValues((HashMap) value)); + } else { + values.add(String.valueOf(value)); + } + } + return values; + } + + // Create the string builder + StringBuilder entityId = new StringBuilder(); + + if (ctx["entity"]["identityFields"] != null) { + // Get the values as a collection + Collection values = collectValues(ctx["entity"]["identityFields"]); + + // Convert to a list and sort + List sortedValues = new ArrayList(values); + Collections.sort(sortedValues); + + // Create comma delimited string + for(String instanceValue: sortedValues) { + entityId.append(instanceValue); + entityId.append(":"); + } + + // Assign the slo.instanceId + ctx["entity"]["id"] = entityId.length() > 0 ? entityId.substring(0, entityId.length() - 1) : "unknown"; + } + `, + }, + }, + { + fingerprint: { + fields: ['entity.id'], + target_field: 'entity.id', + method: 'MurmurHash3', + }, + }, + ...(definition.staticFields != null + ? Object.keys(definition.staticFields).map((field) => ({ + set: { field, value: definition.staticFields![field] }, + })) + : []), + ...(definition.metadata != null + ? [{ script: { source: createMetadataPainlessScript(definition) } }] + : []), + { + remove: { + field: 'entity.metadata', + ignore_missing: true, + }, + }, + { + date_index_name: { + field: '@timestamp', + index_name_prefix: `${generateHistoryIndexName(definition)}.${spaceId}.`, + date_rounding: 'M', + date_formats: ['UNIX_MS', 'ISO8601', "yyyy-MM-dd'T'HH:mm:ss.SSSXX"], + }, + }, + ]; +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_ingest_pipeline_id.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts similarity index 58% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_ingest_pipeline_id.ts rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts index c772e198e64fd7..27ed87dcfb84db 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_ingest_pipeline_id.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_ingest_pipeline_id.ts @@ -6,8 +6,8 @@ */ import { EntityDefinition } from '@kbn/entities-schema'; -import { ENTITY_BASE_PREFIX } from '../../../../common/constants_entities'; +import { ENTITY_LATEST_BASE_PREFIX } from '../../../../common/constants_entities'; -export function generateIngestPipelineId(definition: EntityDefinition) { - return `${ENTITY_BASE_PREFIX}.${definition.id}`; +export function generateLatestIngestPipelineId(definition: EntityDefinition) { + return `${ENTITY_LATEST_BASE_PREFIX}.${definition.id}`; } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts similarity index 67% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.test.ts rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts index a2eb9c3ecb6f7a..63cab821b472ae 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.test.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.test.ts @@ -5,13 +5,12 @@ * 2.0. */ -import { generateProcessors } from './generate_processors'; import { entityDefinition } from '../helpers/fixtures/entity_definition'; +import { generateLatestProcessors } from './generate_latest_processors'; -describe('generateProcessors(definition)', () => { +describe('generateLatestProcessors(definition)', () => { it('should genearte a valid pipeline', () => { - const spaceId = 'test'; - const processors = generateProcessors(entityDefinition, spaceId); + const processors = generateLatestProcessors(entityDefinition, 'default'); expect(processors).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts similarity index 68% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.ts rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts index 70c3b34368b3a9..e84d1674b571b0 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_processors.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/ingest_pipeline/generate_latest_processors.ts @@ -6,13 +6,7 @@ */ import { EntityDefinition } from '@kbn/entities-schema'; -import { generateIndexName } from '../helpers/generate_index_name'; - -function createIdTemplate(definition: EntityDefinition) { - return definition.identityFields.reduce((template, id) => { - return template.replaceAll(id.field, `entity.identity.${id.field}`); - }, definition.identityTemplate); -} +import { generateLatestIndexName } from '../helpers/generate_index_name'; function mapDesitnationToPainless(destination: string, source: string) { const fieldParts = destination.split('.'); @@ -20,7 +14,7 @@ function mapDesitnationToPainless(destination: string, source: string) { if (currentIndex + 1 === parts.length) { return `${acc}\n ctx${parts .map((s) => `["${s}"]`) - .join('')} = ctx.entity.metadata.${source}.keySet();`; + .join('')} = ctx.entity.metadata.${source}.data.keySet();`; } return `${acc}\n ctx${parts .slice(0, currentIndex + 1) @@ -39,11 +33,11 @@ function createMetadataPainlessScript(definition: EntityDefinition) { return `${script}if (ctx.entity?.metadata?.${source.replaceAll( '.', '?.' - )} != null) {${mapDesitnationToPainless(destination, source)}\n}\n`; + )}.data != null) {${mapDesitnationToPainless(destination, source)}\n}\n`; }, ''); } -export function generateProcessors(definition: EntityDefinition, spaceId: string) { +export function generateLatestProcessors(definition: EntityDefinition, spaceId: string) { return [ { set: { @@ -63,23 +57,6 @@ export function generateProcessors(definition: EntityDefinition, spaceId: string value: definition.id, }, }, - { - set: { - field: 'entity.indexPatterns', - value: JSON.stringify(definition.indexPatterns), - }, - }, - { - json: { - field: 'entity.indexPatterns', - }, - }, - { - set: { - field: 'entity.id', - value: createIdTemplate(definition), - }, - }, ...(definition.staticFields != null ? Object.keys(definition.staticFields).map((field) => ({ set: { field, value: definition.staticFields![field] }, @@ -97,7 +74,7 @@ export function generateProcessors(definition: EntityDefinition, spaceId: string { set: { field: '_index', - value: generateIndexName(definition), + value: `${generateLatestIndexName(definition)}.${spaceId}`, }, }, ]; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts index 766bbb10b1d675..03d199c09adf8e 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/start_transform.ts @@ -8,21 +8,29 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; import { retryTransientEsErrors } from './helpers/retry'; -import { generateTransformId } from './transform/generate_transform_id'; +import { generateLatestTransformId } from './transform/generate_latest_transform_id'; +import { generateHistoryTransformId } from './transform/generate_history_transform_id'; export async function startTransform( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger ) { - const transformId = generateTransformId(definition); try { + const historyTransformId = generateHistoryTransformId(definition); + const latestTransformId = generateLatestTransformId(definition); await retryTransientEsErrors( - () => esClient.transform.startTransform({ transform_id: transformId }, { ignore: [409] }), + () => + esClient.transform.startTransform({ transform_id: historyTransformId }, { ignore: [409] }), + { logger } + ); + await retryTransientEsErrors( + () => + esClient.transform.startTransform({ transform_id: latestTransformId }, { ignore: [409] }), { logger } ); } catch (err) { - logger.error(`Cannot start entity transform [${transformId}]`); + logger.error(`Cannot start entity transforms [${definition.id}]`); throw err; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts index 60a250a33f0d9e..2088a3dbaaeb0e 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/stop_and_delete_transform.ts @@ -7,31 +7,63 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { EntityDefinition } from '@kbn/entities-schema'; -import { generateTransformId } from './transform/generate_transform_id'; import { retryTransientEsErrors } from './helpers/retry'; +import { generateLatestTransformId } from './transform/generate_latest_transform_id'; +import { generateHistoryTransformId } from './transform/generate_history_transform_id'; -export async function stopAndDeleteTransform( +export async function stopAndDeleteHistoryTransform( esClient: ElasticsearchClient, definition: EntityDefinition, logger: Logger ) { - const transformId = generateTransformId(definition); try { + const historyTransformId = generateHistoryTransformId(definition); await retryTransientEsErrors( - async () => { - await esClient.transform.stopTransform( - { transform_id: transformId, wait_for_completion: true, force: true }, + () => + esClient.transform.stopTransform( + { transform_id: historyTransformId, wait_for_completion: true, force: true }, { ignore: [409] } - ); - await esClient.transform.deleteTransform( - { transform_id: transformId, force: true }, + ), + { logger } + ); + await retryTransientEsErrors( + () => + esClient.transform.deleteTransform( + { transform_id: historyTransformId, force: true }, + { ignore: [404] } + ), + { logger } + ); + } catch (e) { + logger.error(`Cannot stop or delete history transform [${definition.id}]`); + throw e; + } +} +export async function stopAndDeleteLatestTransform( + esClient: ElasticsearchClient, + definition: EntityDefinition, + logger: Logger +) { + try { + const latestTransformId = generateLatestTransformId(definition); + await retryTransientEsErrors( + () => + esClient.transform.stopTransform( + { transform_id: latestTransformId, wait_for_completion: true, force: true }, + { ignore: [409] } + ), + { logger } + ); + await retryTransientEsErrors( + () => + esClient.transform.deleteTransform( + { transform_id: latestTransformId, force: true }, { ignore: [404] } - ); - }, + ), { logger } ); } catch (e) { - logger.error(`Cannot stop or delete entity transform [${transformId}]`); + logger.error(`Cannot stop or delete latest transform [${definition.id}]`); throw e; } } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_transform.test.ts.snap b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap similarity index 67% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_transform.test.ts.snap rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap index e692f2068eafd6..96cc7bd24afe6b 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_transform.test.ts.snap +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_history_transform.test.ts.snap @@ -1,11 +1,11 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`generateTransform(definition) should generate a valid summary transform 1`] = ` +exports[`generateHistoryTransform(definition) should generate a valid latest transform 1`] = ` Object { "defer_validation": true, "dest": Object { - "index": ".entities-observability.summary-v1.noop", - "pipeline": ".entities-observability.summary-v1.admin-console-logs-service", + "index": ".entities-observability.history-v1.noop", + "pipeline": ".entities-observability.history-v1.admin-console-services", }, "frequency": "1m", "pivot": Object { @@ -16,8 +16,8 @@ Object { "minimum_should_match": 1, "should": Array [ Object { - "match": Object { - "log.level": "error", + "match_phrase": Object { + "log.level": "ERROR", }, }, ], @@ -38,7 +38,7 @@ Object { }, }, }, - "entity.latestTimestamp": Object { + "entity.lastSeenTimestamp": Object { "max": Object { "field": "@timestamp", }, @@ -49,43 +49,49 @@ Object { "size": 1000, }, }, - "entity.metadata.kubernetes.pod.name": Object { - "terms": Object { - "field": "kubernetes.pod.name", - "size": 1000, - }, - }, "entity.metadata.tags": Object { "terms": Object { "field": "tags", "size": 1000, }, }, - "entity.metric.errorRate": Object { + "entity.metrics.errorRate": Object { "bucket_script": Object { "buckets_path": Object { "A": "_errorRate_A>_count", }, "script": Object { "lang": "painless", - "source": "params.A / 5", + "source": "params.A", }, }, }, - "entity.metric.logRate": Object { + "entity.metrics.logRate": Object { "bucket_script": Object { "buckets_path": Object { "A": "_logRate_A>_count", }, "script": Object { "lang": "painless", - "source": "params.A / 5", + "source": "params.A", }, }, }, }, "group_by": Object { - "entity.identity.log.logger": Object { + "@timestamp": Object { + "date_histogram": Object { + "field": "@timestamp", + "fixed_interval": "1m", + }, + }, + "entity.identityFields.event.category": Object { + "terms": Object { + "field": "event.category", + "missing_bucket": true, + }, + }, + "entity.identityFields.log.logger": Object { "terms": Object { "field": "log.logger", "missing_bucket": false, @@ -101,19 +107,6 @@ Object { "index": Array [ "kbn-data-forge-fake_stack.*", ], - "query": Object { - "bool": Object { - "filter": Array [ - Object { - "range": Object { - "@timestamp": Object { - "gte": "now-5m", - }, - }, - }, - ], - }, - }, }, "sync": Object { "time": Object { @@ -121,6 +114,6 @@ Object { "field": "@timestamp", }, }, - "transform_id": "entities-observability-summary-v1-admin-console-logs-service", + "transform_id": "entity-history-v1-admin-console-services", } `; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap new file mode 100644 index 00000000000000..ee0954add40914 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/__snapshots__/generate_latest_transform.test.ts.snap @@ -0,0 +1,142 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generateLatestTransform(definition) should generate a valid latest transform 1`] = ` +Object { + "defer_validation": true, + "dest": Object { + "index": ".entities-observability.latest-v1.noop", + "pipeline": ".entities-observability.latest-v1.admin-console-services", + }, + "frequency": "30s", + "pivot": Object { + "aggs": Object { + "_errorRate": Object { + "top_metrics": Object { + "metrics": Array [ + Object { + "field": "entity.metrics.errorRate", + }, + ], + "sort": Array [ + Object { + "@timestamp": "desc", + }, + ], + }, + }, + "_logRate": Object { + "top_metrics": Object { + "metrics": Array [ + Object { + "field": "entity.metrics.logRate", + }, + ], + "sort": Array [ + Object { + "@timestamp": "desc", + }, + ], + }, + }, + "entity.firstSeenTimestamp": Object { + "min": Object { + "field": "@timestamp", + }, + }, + "entity.lastSeenTimestamp": Object { + "max": Object { + "field": "entity.lastSeenTimestamp", + }, + }, + "entity.metadata.host.name": Object { + "aggs": Object { + "data": Object { + "terms": Object { + "field": "host.name", + "size": 1000, + }, + }, + }, + "filter": Object { + "range": Object { + "event.ingested": Object { + "gte": "now-1m", + }, + }, + }, + }, + "entity.metadata.tags": Object { + "aggs": Object { + "data": Object { + "terms": Object { + "field": "tags", + "size": 1000, + }, + }, + }, + "filter": Object { + "range": Object { + "event.ingested": Object { + "gte": "now-1m", + }, + }, + }, + }, + "entity.metrics.errorRate": Object { + "bucket_script": Object { + "buckets_path": Object { + "value": "_errorRate[entity.metrics.errorRate]", + }, + "script": "params.value", + }, + }, + "entity.metrics.logRate": Object { + "bucket_script": Object { + "buckets_path": Object { + "value": "_logRate[entity.metrics.logRate]", + }, + "script": "params.value", + }, + }, + }, + "group_by": Object { + "entity.displayName": Object { + "terms": Object { + "field": "entity.displayName.keyword", + }, + }, + "entity.id": Object { + "terms": Object { + "field": "entity.id", + }, + }, + "entity.identityFields.event.category": Object { + "terms": Object { + "field": "entity.identityFields.event.category", + "missing_bucket": true, + }, + }, + "entity.identityFields.log.logger": Object { + "terms": Object { + "field": "entity.identityFields.log.logger", + "missing_bucket": false, + }, + }, + }, + }, + "settings": Object { + "deduce_mappings": false, + "unattended": true, + }, + "source": Object { + "index": ".entities-observability.history-v1.admin-console-services.*", + }, + "sync": Object { + "time": Object { + "delay": "1s", + "field": "event.ingested", + }, + }, + "transform_id": "entity-latest-v1-admin-console-services", +} +`; diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.test.ts new file mode 100644 index 00000000000000..8bb9f494d5f4e5 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.test.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { entityDefinition } from '../helpers/fixtures/entity_definition'; +import { generateHistoryTransform } from './generate_history_transform'; + +describe('generateHistoryTransform(definition)', () => { + it('should generate a valid latest transform', () => { + const transform = generateHistoryTransform(entityDefinition); + expect(transform).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.ts new file mode 100644 index 00000000000000..0e98040e4285f4 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform.ts @@ -0,0 +1,90 @@ +/* + * Copyright 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 { EntityDefinition } from '@kbn/entities-schema'; +import { + QueryDslQueryContainer, + TransformPutTransformRequest, +} from '@elastic/elasticsearch/lib/api/types'; +import { getElasticsearchQueryOrThrow } from '../helpers/get_elasticsearch_query_or_throw'; +import { generateHistoryMetricAggregations } from './generate_metric_aggregations'; +import { + ENTITY_DEFAULT_HISTORY_FREQUENCY, + ENTITY_DEFAULT_HISTORY_SYNC_DELAY, + ENTITY_HISTORY_BASE_PREFIX, +} from '../../../../common/constants_entities'; +import { generateHistoryMetadataAggregations } from './generate_metadata_aggregations'; +import { generateHistoryTransformId } from './generate_history_transform_id'; +import { generateHistoryIngestPipelineId } from '../ingest_pipeline/generate_history_ingest_pipeline_id'; + +export function generateHistoryTransform( + definition: EntityDefinition +): TransformPutTransformRequest { + const filter: QueryDslQueryContainer[] = []; + + if (definition.filter) { + filter.push(getElasticsearchQueryOrThrow(definition.filter)); + } + + return { + transform_id: generateHistoryTransformId(definition), + defer_validation: true, + source: { + index: definition.indexPatterns, + ...(filter.length > 0 && { + query: { + bool: { + filter, + }, + }, + }), + }, + dest: { + index: `${ENTITY_HISTORY_BASE_PREFIX}.noop`, + pipeline: generateHistoryIngestPipelineId(definition), + }, + frequency: definition.history.settings?.frequency ?? ENTITY_DEFAULT_HISTORY_FREQUENCY, + sync: { + time: { + field: definition.history.settings?.syncField ?? definition.history.timestampField, + delay: definition.history.settings?.syncDelay ?? ENTITY_DEFAULT_HISTORY_SYNC_DELAY, + }, + }, + settings: { + deduce_mappings: false, + unattended: true, + }, + pivot: { + group_by: { + ...definition.identityFields.reduce( + (acc, id) => ({ + ...acc, + [`entity.identityFields.${id.field}`]: { + terms: { field: id.field, missing_bucket: id.optional }, + }, + }), + {} + ), + ['@timestamp']: { + date_histogram: { + field: definition.history.timestampField, + fixed_interval: definition.history.interval.toJSON(), + }, + }, + }, + aggs: { + ...generateHistoryMetricAggregations(definition), + ...generateHistoryMetadataAggregations(definition), + 'entity.lastSeenTimestamp': { + max: { + field: definition.history.timestampField, + }, + }, + }, + }, + }; +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform_id.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform_id.ts new file mode 100644 index 00000000000000..60f48af97ada60 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_history_transform_id.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition } from '@kbn/entities-schema'; +import { ENTITY_HISTORY_TRANSFORM_PREFIX } from '../../../../common/constants_entities'; + +export function generateHistoryTransformId(definition: EntityDefinition) { + return `${ENTITY_HISTORY_TRANSFORM_PREFIX}-${definition.id}`; +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.test.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.test.ts similarity index 60% rename from x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.test.ts rename to x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.test.ts index e97293b77dd4fe..a2932796870786 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.test.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.test.ts @@ -6,11 +6,11 @@ */ import { entityDefinition } from '../helpers/fixtures/entity_definition'; -import { generateTransform } from './generate_transform'; +import { generateLatestTransform } from './generate_latest_transform'; -describe('generateTransform(definition)', () => { - it('should generate a valid summary transform', () => { - const transform = generateTransform(entityDefinition); +describe('generateLatestTransform(definition)', () => { + it('should generate a valid latest transform', () => { + const transform = generateLatestTransform(entityDefinition); expect(transform).toMatchSnapshot(); }); }); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.ts new file mode 100644 index 00000000000000..425699aaef58d8 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform.ts @@ -0,0 +1,79 @@ +/* + * Copyright 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 { EntityDefinition } from '@kbn/entities-schema'; +import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; +import { + ENTITY_DEFAULT_LATEST_FREQUENCY, + ENTITY_DEFAULT_LATEST_SYNC_DELAY, + ENTITY_LATEST_BASE_PREFIX, +} from '../../../../common/constants_entities'; +import { generateLatestMetadataAggregations } from './generate_metadata_aggregations'; +import { generateLatestIngestPipelineId } from '../ingest_pipeline/generate_latest_ingest_pipeline_id'; +import { generateLatestTransformId } from './generate_latest_transform_id'; +import { generateHistoryIndexName } from '../helpers/generate_index_name'; +import { generateLatestMetricAggregations } from './generate_metric_aggregations'; + +export function generateLatestTransform( + definition: EntityDefinition +): TransformPutTransformRequest { + return { + transform_id: generateLatestTransformId(definition), + defer_validation: true, + source: { + index: `${generateHistoryIndexName(definition)}.*`, + }, + dest: { + index: `${ENTITY_LATEST_BASE_PREFIX}.noop`, + pipeline: generateLatestIngestPipelineId(definition), + }, + frequency: definition.latest?.settings?.frequency ?? ENTITY_DEFAULT_LATEST_FREQUENCY, + sync: { + time: { + field: definition.latest?.settings?.syncField ?? 'event.ingested', + delay: definition.latest?.settings?.syncDelay ?? ENTITY_DEFAULT_LATEST_SYNC_DELAY, + }, + }, + settings: { + deduce_mappings: false, + unattended: true, + }, + pivot: { + group_by: { + ['entity.id']: { + terms: { field: 'entity.id' }, + }, + ['entity.displayName']: { + terms: { field: 'entity.displayName.keyword' }, + }, + ...definition.identityFields.reduce( + (acc, id) => ({ + ...acc, + [`entity.identityFields.${id.field}`]: { + terms: { field: `entity.identityFields.${id.field}`, missing_bucket: id.optional }, + }, + }), + {} + ), + }, + aggs: { + ...generateLatestMetricAggregations(definition), + ...generateLatestMetadataAggregations(definition), + 'entity.lastSeenTimestamp': { + max: { + field: 'entity.lastSeenTimestamp', + }, + }, + 'entity.firstSeenTimestamp': { + min: { + field: '@timestamp', + }, + }, + }, + }, + }; +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform_id.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform_id.ts new file mode 100644 index 00000000000000..1aefc24e5ee2f4 --- /dev/null +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_latest_transform_id.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EntityDefinition } from '@kbn/entities-schema'; +import { ENTITY_LATEST_TRANSFORM_PREFIX } from '../../../../common/constants_entities'; + +export function generateLatestTransformId(definition: EntityDefinition) { + return `${ENTITY_LATEST_TRANSFORM_PREFIX}-${definition.id}`; +} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts index 8c11aea1385198..31ba3e9add0dc1 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metadata_aggregations.ts @@ -6,8 +6,9 @@ */ import { EntityDefinition } from '@kbn/entities-schema'; +import { ENTITY_DEFAULT_METADATA_LIMIT } from '../../../../common/constants_entities'; -export function generateMetadataAggregations(definition: EntityDefinition) { +export function generateHistoryMetadataAggregations(definition: EntityDefinition) { if (!definition.metadata) { return {}; } @@ -17,7 +18,37 @@ export function generateMetadataAggregations(definition: EntityDefinition) { [`entity.metadata.${metadata.destination ?? metadata.source}`]: { terms: { field: metadata.source, - size: metadata.limit ?? 1000, + size: metadata.limit ?? ENTITY_DEFAULT_METADATA_LIMIT, + }, + }, + }), + {} + ); +} + +export function generateLatestMetadataAggregations(definition: EntityDefinition) { + if (!definition.metadata) { + return {}; + } + + return definition.metadata.reduce( + (aggs, metadata) => ({ + ...aggs, + [`entity.metadata.${metadata.destination}`]: { + filter: { + range: { + 'event.ingested': { + gte: `now-${definition.history.interval.toJSON()}`, + }, + }, + }, + aggs: { + data: { + terms: { + field: metadata.destination ?? metadata.source, + size: metadata.limit ?? ENTITY_DEFAULT_METADATA_LIMIT, + }, + }, }, }, }), diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts index 9527671768e357..bd1af365116cb2 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_metric_aggregations.ts @@ -104,15 +104,41 @@ function buildMetricEquation(keyMetric: KeyMetric) { }; } -export function generateMetricAggregations(definition: EntityDefinition) { +export function generateHistoryMetricAggregations(definition: EntityDefinition) { if (!definition.metrics) { return {}; } return definition.metrics.reduce((aggs, keyMetric) => { return { ...aggs, - ...buildMetricAggregations(keyMetric, definition.timestampField), - [`entity.metric.${keyMetric.name}`]: buildMetricEquation(keyMetric), + ...buildMetricAggregations(keyMetric, definition.history.timestampField), + [`entity.metrics.${keyMetric.name}`]: buildMetricEquation(keyMetric), + }; + }, {}); +} + +export function generateLatestMetricAggregations(definition: EntityDefinition) { + if (!definition.metrics) { + return {}; + } + + return definition.metrics.reduce((aggs, keyMetric) => { + return { + ...aggs, + [`_${keyMetric.name}`]: { + top_metrics: { + metrics: [{ field: `entity.metrics.${keyMetric.name}` }], + sort: [{ '@timestamp': 'desc' }], + }, + }, + [`entity.metrics.${keyMetric.name}`]: { + bucket_script: { + buckets_path: { + value: `_${keyMetric.name}[entity.metrics.${keyMetric.name}]`, + }, + script: 'params.value', + }, + }, }; }, {}); } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.ts b/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.ts deleted file mode 100644 index 6a8c0bd6377150..00000000000000 --- a/x-pack/plugins/observability_solution/asset_manager/server/lib/entities/transform/generate_transform.ts +++ /dev/null @@ -1,86 +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 { EntityDefinition } from '@kbn/entities-schema'; -import { - QueryDslQueryContainer, - TransformPutTransformRequest, -} from '@elastic/elasticsearch/lib/api/types'; -import { getElasticsearchQueryOrThrow } from '../helpers/get_elasticsearch_query_or_throw'; -import { generateMetricAggregations } from './generate_metric_aggregations'; -import { - ENTITY_BASE_PREFIX, - ENTITY_DEFAULT_FREQUENCY, - ENTITY_DEFAULT_SYNC_DELAY, -} from '../../../../common/constants_entities'; -import { generateMetadataAggregations } from './generate_metadata_aggregations'; -import { generateTransformId } from './generate_transform_id'; -import { generateIngestPipelineId } from '../ingest_pipeline/generate_ingest_pipeline_id'; - -export function generateTransform(definition: EntityDefinition): TransformPutTransformRequest { - const filter: QueryDslQueryContainer[] = [ - { - range: { - [definition.timestampField]: { - gte: `now-${definition.lookback.toJSON()}`, - }, - }, - }, - ]; - - if (definition.filter) { - filter.push(getElasticsearchQueryOrThrow(definition.filter)); - } - - return { - transform_id: generateTransformId(definition), - defer_validation: true, - source: { - index: definition.indexPatterns, - query: { - bool: { - filter, - }, - }, - }, - dest: { - index: `${ENTITY_BASE_PREFIX}.noop`, - pipeline: generateIngestPipelineId(definition), - }, - frequency: definition.settings?.frequency || ENTITY_DEFAULT_FREQUENCY, - sync: { - time: { - field: definition.settings?.syncField ?? definition.timestampField, - delay: definition.settings?.syncDelay ?? ENTITY_DEFAULT_SYNC_DELAY, - }, - }, - settings: { - deduce_mappings: false, - unattended: true, - }, - pivot: { - group_by: definition.identityFields.reduce( - (acc, id) => ({ - ...acc, - [`entity.identity.${id.field}`]: { - terms: { field: id.field, missing_bucket: id.optional }, - }, - }), - {} - ), - aggs: { - ...generateMetricAggregations(definition), - ...generateMetadataAggregations(definition), - 'entity.latestTimestamp': { - max: { - field: definition.timestampField, - }, - }, - }, - }, - }; -} diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts index 69ea6394ecb947..09d49c35bcef37 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/create.ts @@ -10,16 +10,28 @@ import { EntityDefinition, entityDefinitionSchema } from '@kbn/entities-schema'; import { stringifyZodError } from '@kbn/zod-helpers'; import { SetupRouteOptions } from '../types'; import { saveEntityDefinition } from '../../lib/entities/save_entity_definition'; -import { createAndInstallIngestPipeline } from '../../lib/entities/create_and_install_ingest_pipeline'; +import { + createAndInstallHistoryIngestPipeline, + createAndInstallLatestIngestPipeline, +} from '../../lib/entities/create_and_install_ingest_pipeline'; import { EntityIdConflict } from '../../lib/entities/errors/entity_id_conflict_error'; -import { createAndInstallTransform } from '../../lib/entities/create_and_install_transform'; import { EntitySecurityException } from '../../lib/entities/errors/entity_security_exception'; import { InvalidTransformError } from '../../lib/entities/errors/invalid_transform_error'; import { startTransform } from '../../lib/entities/start_transform'; import { deleteEntityDefinition } from '../../lib/entities/delete_entity_definition'; -import { deleteIngestPipeline } from '../../lib/entities/delete_ingest_pipeline'; -import { stopAndDeleteTransform } from '../../lib/entities/stop_and_delete_transform'; -import { ENTITY_API_PREFIX } from '../../../common/constants_entities'; +import { + deleteHistoryIngestPipeline, + deleteLatestIngestPipeline, +} from '../../lib/entities/delete_ingest_pipeline'; +import { + stopAndDeleteHistoryTransform, + stopAndDeleteLatestTransform, +} from '../../lib/entities/stop_and_delete_transform'; +import { ENTITY_INTERNAL_API_PREFIX } from '../../../common/constants_entities'; +import { + createAndInstallHistoryTransform, + createAndInstallLatestTransform, +} from '../../lib/entities/create_and_install_transform'; export function createEntityDefinitionRoute({ router, @@ -28,7 +40,7 @@ export function createEntityDefinitionRoute({ }: SetupRouteOptions) { router.post( { - path: `${ENTITY_API_PREFIX}/definition`, + path: `${ENTITY_INTERNAL_API_PREFIX}/definition`, validate: { body: (body, res) => { try { @@ -40,35 +52,60 @@ export function createEntityDefinitionRoute({ }, }, async (context, req, res) => { - let definitionCreated = false; - let ingestPipelineCreated = false; - let transformCreated = false; + const installState = { + ingestPipelines: { + history: false, + latest: false, + }, + transforms: { + history: false, + latest: false, + }, + definition: false, + }; const core = await context.core; const soClient = core.savedObjects.client; const esClient = core.elasticsearch.client.asCurrentUser; const spaceId = spaces?.spacesService.getSpaceId(req) ?? 'default'; - try { const definition = await saveEntityDefinition(soClient, req.body); - definitionCreated = true; - await createAndInstallIngestPipeline(esClient, definition, logger, spaceId); - ingestPipelineCreated = true; - await createAndInstallTransform(esClient, definition, logger); - transformCreated = true; + installState.definition = true; + + // install ingest pipelines + await createAndInstallHistoryIngestPipeline(esClient, definition, logger, spaceId); + installState.ingestPipelines.history = true; + await createAndInstallLatestIngestPipeline(esClient, definition, logger, spaceId); + installState.ingestPipelines.latest = true; + + // install transfroms + await createAndInstallHistoryTransform(esClient, definition, logger); + installState.transforms.history = true; + await createAndInstallLatestTransform(esClient, definition, logger); + installState.transforms.latest = true; + await startTransform(esClient, definition, logger); return res.ok({ body: definition }); } catch (e) { // Clean up anything that was successful. - if (definitionCreated) { + if (installState.definition) { await deleteEntityDefinition(soClient, req.body, logger); } - if (ingestPipelineCreated) { - await deleteIngestPipeline(esClient, req.body, logger); + + if (installState.ingestPipelines.history) { + await deleteHistoryIngestPipeline(esClient, req.body, logger); + } + if (installState.ingestPipelines.latest) { + await deleteLatestIngestPipeline(esClient, req.body, logger); } - if (transformCreated) { - await stopAndDeleteTransform(esClient, req.body, logger); + + if (installState.transforms.history) { + await stopAndDeleteHistoryTransform(esClient, req.body, logger); } + if (installState.transforms.latest) { + await stopAndDeleteLatestTransform(esClient, req.body, logger); + } + if (e instanceof EntityIdConflict) { return res.conflict({ body: e }); } diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts index e1b273780a64fb..7c9044d24cd821 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/delete.ts @@ -11,11 +11,17 @@ import { SetupRouteOptions } from '../types'; import { EntitySecurityException } from '../../lib/entities/errors/entity_security_exception'; import { InvalidTransformError } from '../../lib/entities/errors/invalid_transform_error'; import { readEntityDefinition } from '../../lib/entities/read_entity_definition'; -import { stopAndDeleteTransform } from '../../lib/entities/stop_and_delete_transform'; -import { deleteIngestPipeline } from '../../lib/entities/delete_ingest_pipeline'; +import { + stopAndDeleteHistoryTransform, + stopAndDeleteLatestTransform, +} from '../../lib/entities/stop_and_delete_transform'; +import { + deleteHistoryIngestPipeline, + deleteLatestIngestPipeline, +} from '../../lib/entities/delete_ingest_pipeline'; import { deleteEntityDefinition } from '../../lib/entities/delete_entity_definition'; import { EntityDefinitionNotFound } from '../../lib/entities/errors/entity_not_found'; -import { ENTITY_API_PREFIX } from '../../../common/constants_entities'; +import { ENTITY_INTERNAL_API_PREFIX } from '../../../common/constants_entities'; export function deleteEntityDefinitionRoute({ router, @@ -23,7 +29,7 @@ export function deleteEntityDefinitionRoute({ }: SetupRouteOptions) { router.delete<{ id: string }, unknown, unknown>( { - path: `${ENTITY_API_PREFIX}/definition/{id}`, + path: `${ENTITY_INTERNAL_API_PREFIX}/definition/{id}`, validate: { params: schema.object({ id: schema.string(), @@ -36,8 +42,10 @@ export function deleteEntityDefinitionRoute({ const esClient = (await context.core).elasticsearch.client.asCurrentUser; const definition = await readEntityDefinition(soClient, req.params.id, logger); - await stopAndDeleteTransform(esClient, definition, logger); - await deleteIngestPipeline(esClient, definition, logger); + await stopAndDeleteHistoryTransform(esClient, definition, logger); + await stopAndDeleteLatestTransform(esClient, definition, logger); + await deleteHistoryIngestPipeline(esClient, definition, logger); + await deleteLatestIngestPipeline(esClient, definition, logger); await deleteEntityDefinition(soClient, definition, logger); return res.ok({ body: { acknowledged: true } }); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts index ffe53fee635773..2a267c6c4e3321 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/routes/entities/reset.ts @@ -11,14 +11,26 @@ import { SetupRouteOptions } from '../types'; import { EntitySecurityException } from '../../lib/entities/errors/entity_security_exception'; import { InvalidTransformError } from '../../lib/entities/errors/invalid_transform_error'; import { readEntityDefinition } from '../../lib/entities/read_entity_definition'; -import { stopAndDeleteTransform } from '../../lib/entities/stop_and_delete_transform'; -import { deleteIngestPipeline } from '../../lib/entities/delete_ingest_pipeline'; -import { deleteIndex } from '../../lib/entities/delete_index'; -import { createAndInstallIngestPipeline } from '../../lib/entities/create_and_install_ingest_pipeline'; -import { createAndInstallTransform } from '../../lib/entities/create_and_install_transform'; +import { + stopAndDeleteHistoryTransform, + stopAndDeleteLatestTransform, +} from '../../lib/entities/stop_and_delete_transform'; +import { + deleteHistoryIngestPipeline, + deleteLatestIngestPipeline, +} from '../../lib/entities/delete_ingest_pipeline'; +import { deleteIndices } from '../../lib/entities/delete_index'; +import { + createAndInstallHistoryIngestPipeline, + createAndInstallLatestIngestPipeline, +} from '../../lib/entities/create_and_install_ingest_pipeline'; +import { + createAndInstallHistoryTransform, + createAndInstallLatestTransform, +} from '../../lib/entities/create_and_install_transform'; import { startTransform } from '../../lib/entities/start_transform'; import { EntityDefinitionNotFound } from '../../lib/entities/errors/entity_not_found'; -import { ENTITY_API_PREFIX } from '../../../common/constants_entities'; +import { ENTITY_INTERNAL_API_PREFIX } from '../../../common/constants_entities'; export function resetEntityDefinitionRoute({ router, @@ -27,7 +39,7 @@ export function resetEntityDefinitionRoute({ }: SetupRouteOptions) { router.post<{ id: string }, unknown, unknown>( { - path: `${ENTITY_API_PREFIX}/definition/{id}/_reset`, + path: `${ENTITY_INTERNAL_API_PREFIX}/definition/{id}/_reset`, validate: { params: schema.object({ id: schema.string(), @@ -43,13 +55,17 @@ export function resetEntityDefinitionRoute({ const definition = await readEntityDefinition(soClient, req.params.id, logger); // Delete the transform and ingest pipeline - await stopAndDeleteTransform(esClient, definition, logger); - await deleteIngestPipeline(esClient, definition, logger); - await deleteIndex(esClient, definition, logger); + await stopAndDeleteHistoryTransform(esClient, definition, logger); + await stopAndDeleteLatestTransform(esClient, definition, logger); + await deleteHistoryIngestPipeline(esClient, definition, logger); + await deleteLatestIngestPipeline(esClient, definition, logger); + await deleteIndices(esClient, definition, logger); // Recreate everything - await createAndInstallIngestPipeline(esClient, definition, logger, spaceId); - await createAndInstallTransform(esClient, definition, logger); + await createAndInstallHistoryIngestPipeline(esClient, definition, logger, spaceId); + await createAndInstallLatestIngestPipeline(esClient, definition, logger, spaceId); + await createAndInstallHistoryTransform(esClient, definition, logger); + await createAndInstallLatestTransform(esClient, definition, logger); await startTransform(esClient, definition, logger); return res.ok({ body: { acknowledged: true } }); diff --git a/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts b/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts index 5a63444974ad79..392be5a0722be6 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/saved_objects/entity_definition.ts @@ -24,7 +24,6 @@ export const entityDefinition: SavedObjectsType = { filter: { type: 'keyword' }, indexPatterns: { type: 'keyword' }, identityFields: { type: 'object' }, - categories: { type: 'keyword' }, metadata: { type: 'object' }, metrics: { type: 'object' }, staticFields: { type: 'object' }, diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts b/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts index 01528453c74d43..56a0ea33333093 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/templates/components/entity.ts @@ -21,15 +21,23 @@ export const entitiesEntityComponentTemplateConfig: ClusterPutComponentTemplateR ignore_above: 1024, type: 'keyword', }, - indexPatterns: { - ignore_above: 1024, - type: 'keyword', + displayName: { + type: 'text', + fields: { + keyword: { + ignore_above: 1024, + type: 'keyword', + }, + }, }, definitionId: { ignore_above: 1024, type: 'keyword', }, - latestTimestamp: { + lastSeenTimestamp: { + type: 'date', + }, + firstSeenTimestamp: { type: 'date', }, }, diff --git a/x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts b/x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts index d3934b24ea82cc..f7d66a0b2a731f 100644 --- a/x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts +++ b/x-pack/plugins/observability_solution/asset_manager/server/templates/entities_template.ts @@ -29,6 +29,11 @@ export const entitiesIndexTemplateConfig: IndicesPutIndexTemplateRequest = { mapping: { ignore_above: 1024, type: 'keyword', + fields: { + text: { + type: 'text', + }, + }, }, match_mapping_type: 'string', }, @@ -41,7 +46,7 @@ export const entitiesIndexTemplateConfig: IndicesPutIndexTemplateRequest = { }, // @ts-expect-error this should work per: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html#match-mapping-type match_mapping_type: ['long', 'double'], - path_match: 'entity.metric.*', + path_match: 'entity.metrics.*', }, }, ], diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.stories.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.stories.tsx index 0b253a981b1228..195a868ff0af2f 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.stories.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.stories.tsx @@ -32,10 +32,14 @@ const defaultProps: Props = { chartProps: { baseTheme: LIGHT_THEME }, comparator: COMPARATORS.GREATER_THAN, id: 'componentId', - threshold: 90, + thresholds: [90], title: 'Threshold breached', value: 93, valueFormatter: (d) => `${d}%`, + warning: { + thresholds: [75], + comparator: COMPARATORS.GREATER_THAN, + }, }; export const Default = { diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.test.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.test.tsx index 3decd9cfdd9c02..32d70920c5a730 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.test.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.test.tsx @@ -5,11 +5,19 @@ * 2.0. */ -import { LIGHT_THEME } from '@elastic/charts'; import { COMPARATORS } from '@kbn/alerting-comparators'; +import { Metric, LIGHT_THEME } from '@elastic/charts'; import { render } from '@testing-library/react'; -import { Props, Threshold } from './threshold'; import React from 'react'; +import { Props, Threshold } from './threshold'; + +jest.mock('@elastic/charts', () => { + const actual = jest.requireActual('@elastic/charts'); + return { + ...actual, + Metric: jest.fn(() => 'mocked Metric'), + }; +}); describe('Threshold', () => { const renderComponent = (props: Partial = {}) => { @@ -17,7 +25,7 @@ describe('Threshold', () => { chartProps: { baseTheme: LIGHT_THEME }, comparator: COMPARATORS.GREATER_THAN, id: 'componentId', - threshold: 90, + thresholds: [90], title: 'Threshold breached', value: 93, valueFormatter: (d) => `${d}%`, @@ -35,8 +43,38 @@ describe('Threshold', () => { ); }; + beforeEach(() => { + jest.clearAllMocks(); + }); + it('shows component', () => { const component = renderComponent(); expect(component.queryByTestId('threshold-90-93')).toBeTruthy(); }); + + it('shows warning message', () => { + renderComponent({ + thresholds: [7], + comparator: COMPARATORS.GREATER_THAN_OR_EQUALS, + warning: { + thresholds: [3, 7], + comparator: COMPARATORS.BETWEEN, + }, + }); + + expect((Metric as jest.Mock).mock.calls[0][0].data[0][0]).toMatchInlineSnapshot(` + Object { + "color": "#f8e9e9", + "extra": + Alert when >= 7% +
    + Warn when between 3% - 7% +
    , + "icon": [Function], + "title": "Threshold breached", + "value": 93, + "valueFormatter": [Function], + } + `); + }); }); diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.tsx index bb710a165733bf..0b587bf067f471 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/common/components/threshold.tsx @@ -11,6 +11,7 @@ import { EuiIcon, EuiPanel, useEuiBackgroundColor } from '@elastic/eui'; import type { PartialTheme, Theme } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { COMPARATORS } from '@kbn/alerting-comparators'; + export interface ChartProps { theme?: PartialTheme; baseTheme: Theme; @@ -20,20 +21,25 @@ export interface Props { chartProps: ChartProps; comparator: COMPARATORS | string; id: string; - threshold: number; + thresholds: number[]; title: string; value: number; valueFormatter: (d: number) => string; + warning?: { + thresholds: number[]; + comparator: COMPARATORS; + }; } export const Threshold = ({ chartProps: { theme, baseTheme }, comparator, id, - threshold, + thresholds, title, value, valueFormatter, + warning, }: Props) => { const color = useEuiBackgroundColor('danger'); @@ -47,7 +53,7 @@ export const Threshold = ({ minWidth: '100%', }} hasShadow={false} - data-test-subj={`threshold-${threshold}-${value}`} + data-test-subj={`threshold-${thresholds.join('-')}-${value}`} > @@ -58,12 +64,24 @@ export const Threshold = ({ { title, extra: ( - + <> {i18n.translate('xpack.infra.alerting.thresholdExtraTitle', { - values: { comparator, threshold: valueFormatter(threshold) }, + values: { + comparator, + threshold: thresholds.map((t) => valueFormatter(t)).join(' - '), + }, defaultMessage: `Alert when {comparator} {threshold}`, })} - +
    + {warning && + i18n.translate('xpack.infra.alerting.warningExtraTitle', { + values: { + comparator: warning.comparator, + threshold: warning.thresholds.map((t) => valueFormatter(t)).join(' - '), + }, + defaultMessage: `Warn when {comparator} {threshold}`, + })} + ), color, value, diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/metric.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/metric.tsx index dfe22251fb5997..e4a6185cce8072 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/metric.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/inventory/components/metric.tsx @@ -269,6 +269,7 @@ export const MetricExpression = ({ helpText={i18n.translate('xpack.infra.waffle.alerting.customMetrics.helpText', { defaultMessage: 'Choose a name to help identify your custom metric. Defaults to " of ".', + ignoreTag: true, })} > @@ -195,7 +195,7 @@ const AlertDetailsAppSection = ({ chartProps={{ theme, baseTheme: LEGACY_LIGHT_THEME }} comparator={ComparatorToi18nSymbolsMap[rule.params.count.comparator]} id="logCountThreshold" - threshold={rule.params.count.value} + thresholds={[rule.params.count.value]} value={Number(alert.fields[ALERT_EVALUATION_VALUE])} valueFormatter={formatThreshold} /> diff --git a/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/alert_details_app_section.tsx b/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/alert_details_app_section.tsx index e0607341aa150b..6a9e4999714bc8 100644 --- a/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/alert_details_app_section.tsx +++ b/x-pack/plugins/observability_solution/infra/public/alerting/metric_threshold/components/alert_details_app_section.tsx @@ -6,6 +6,7 @@ */ import { i18n } from '@kbn/i18n'; +import { convertToBuiltInComparators } from '@kbn/observability-plugin/common'; import React, { useEffect } from 'react'; import moment from 'moment'; import { @@ -160,7 +161,7 @@ export function AlertDetailsAppSection({ metricValueFormatter(d, 'metric' in criterion ? criterion.metric : undefined) @@ -171,7 +172,14 @@ export function AlertDetailsAppSection({ defaultMessage: 'Threshold breached', } )} - comparator={criterion.comparator} + comparator={convertToBuiltInComparators(criterion.comparator)} + warning={ + criterion.warningThreshold && + criterion.warningComparator && { + thresholds: criterion.warningThreshold, + comparator: convertToBuiltInComparators(criterion.warningComparator), + } + } /> diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/chart.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/chart.tsx index e356eb009a1c48..89d47e598de801 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/chart.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/chart.tsx @@ -17,15 +17,22 @@ import { useDatePickerContext } from '../hooks/use_date_picker'; import { extractRangeFromChartFilterEvent } from './chart_utils'; import { useLoadingStateContext } from '../hooks/use_loading_state'; -export type ChartProps = LensConfig & - Pick & { - id: string; - queryField: string; - dateRange: TimeRange; - assetId: string; - }; +export type ChartProps = Pick & { + id: string; + queryField: string; + dateRange: TimeRange; + assetId: string; + lensAttributes: LensConfig; +}; -export const Chart = ({ id, queryField, overrides, dateRange, assetId, ...props }: ChartProps) => { +export const Chart = ({ + id, + queryField, + overrides, + dateRange, + assetId, + lensAttributes, +}: ChartProps) => { const { setDateRange } = useDatePickerContext(); const { searchSessionId } = useLoadingStateContext(); const { @@ -34,7 +41,7 @@ export const Chart = ({ id, queryField, overrides, dateRange, assetId, ...props const { value: filters = [] } = useAsync(async () => { const resolvedDataView = await resolveDataView({ - dataViewId: (props.dataset as LensDataviewDataset)?.index, + dataViewId: (lensAttributes.dataset as LensDataviewDataset)?.index, dataViewsService: dataViews, }); @@ -45,7 +52,7 @@ export const Chart = ({ id, queryField, overrides, dateRange, assetId, ...props dataView: resolvedDataView.dataViewReference, }), ]; - }, [assetId, dataViews, props.dataset, queryField]); + }, [assetId, dataViews, lensAttributes.dataset, queryField]); const handleBrushEnd = useCallback( ({ range, preventDefault }: BrushEndArgs) => { @@ -75,13 +82,13 @@ export const Chart = ({ id, queryField, overrides, dateRange, assetId, ...props return ( ( {charts.map((chart) => ( ( const { charts } = useHostCharts({ metric, dataViewId: dataView?.id, - options: { overview }, + overview, }); return ( @@ -91,10 +91,11 @@ export const HostCharts = React.forwardRef( {charts.map((chart) => ( ))} diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/kubernetes_charts.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/kubernetes_charts.tsx index b386b1e9d8cbca..55771a47d09b2f 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/kubernetes_charts.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/charts/kubernetes_charts.tsx @@ -27,7 +27,7 @@ export const KubernetesNodeCharts = React.forwardRef { const { charts } = useKubernetesCharts({ dataViewId: dataView?.id, - options: { overview }, + overview, }); const hasIntegration = useIntegrationCheck({ dependsOn: INTEGRATIONS.kubernetesNode }); @@ -63,10 +63,11 @@ export const KubernetesNodeCharts = React.forwardRef {charts.map((chart) => ( ))} @@ -127,8 +128,9 @@ export const KubernetesContainerCharts = React.forwardRef< {charts.map((chart) => ( { - const isK8Container = useIntegrationCheck({ dependsOn: INTEGRATIONS.kubernetesContainer }); - - return isK8Container ? ( + const isDockerContainer = useIntegrationCheck({ dependsOn: INTEGRATIONS.docker }); + const isKubernetesContainer = useIntegrationCheck({ + dependsOn: INTEGRATIONS.kubernetesContainer, + }); + if (!isDockerContainer && !isKubernetesContainer) { + return null; + } + return isKubernetesContainer ? ( string; - }; + getSubtitle?: (formulaValue: string) => string; loading?: boolean; } @@ -28,7 +26,7 @@ export const HostKpiCharts = ({ dateRange, dataView, filters, - options, + getSubtitle, query, searchSessionId, loading = false, @@ -36,10 +34,8 @@ export const HostKpiCharts = ({ const { euiTheme } = useEuiTheme(); const charts = useHostKpiCharts({ dataViewId: dataView?.id, - options: { - getSubtitle: options?.getSubtitle, - seriesColor: euiTheme.colors.lightestShade, - }, + getSubtitle, + seriesColor: euiTheme.colors.lightestShade, }); return ( diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/kpi.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/kpi.tsx index 6652bd2b12b99f..3545a54d813db3 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/kpi.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/components/kpis/kpi.tsx @@ -36,11 +36,11 @@ export const Kpi = ({ return ( { const model = findInventoryModel('container'); - const { cpu, memory } = await model.metrics.getCharts(); + const { cpu, memory, network, diskIO } = await model.metrics.getCharts(); switch (metric) { case 'cpu': return [cpu.xy.dockerContainerCpuUsage]; case 'memory': return [memory.xy.dockerContainerMemoryUsage]; + case 'network': + return [network.xy.dockerContainerRxTx]; + case 'disk': + return [diskIO.xy.dockerContainerDiskIOReadWrite]; default: return []; } @@ -76,7 +80,7 @@ export const useK8sContainerPageViewMetricsCharts = ({ }), }; }); - }, [metricsDataViewId]); + }, [metricsDataViewId, metric]); return { charts, error }; }; @@ -97,10 +101,10 @@ const getK8sContainerCharts = async (metric: ContainerMetricTypes) => { export const useDockerContainerKpiCharts = ({ dataViewId, - options, + seriesColor, }: { dataViewId?: string; - options?: { seriesColor: string; getSubtitle?: (formulaValue: string) => string }; + seriesColor?: string; }) => { const { value: charts = [] } = useAsync(async () => { const model = findInventoryModel('container'); @@ -109,9 +113,8 @@ export const useDockerContainerKpiCharts = ({ return [cpu.metric.dockerContainerCpuUsage, memory.metric.dockerContainerMemoryUsage].map( (chart) => ({ ...chart, - seriesColor: options?.seriesColor, + seriesColor, decimals: 1, - subtitle: getSubtitle(options, chart), ...(dataViewId && { dataset: { index: dataViewId, @@ -119,17 +122,17 @@ export const useDockerContainerKpiCharts = ({ }), }) ); - }, [dataViewId, options?.seriesColor, options?.getSubtitle]); + }, [dataViewId, seriesColor]); return charts; }; export const useK8sContainerKpiCharts = ({ dataViewId, - options, + seriesColor, }: { dataViewId?: string; - options?: { seriesColor: string; getSubtitle?: (formulaValue: string) => string }; + seriesColor?: string; }) => { const { value: charts = [] } = useAsync(async () => { const model = findInventoryModel('container'); @@ -138,9 +141,9 @@ export const useK8sContainerKpiCharts = ({ return [cpu.metric.k8sContainerCpuUsage, memory.metric.k8sContainerMemoryUsage].map( (chart) => ({ ...chart, - seriesColor: options?.seriesColor, + seriesColor, decimals: 1, - subtitle: getSubtitle(options, chart), + subtitle: getSubtitle(chart), ...(dataViewId && { dataset: { index: dataViewId, @@ -148,16 +151,11 @@ export const useK8sContainerKpiCharts = ({ }), }) ); - }, [dataViewId, options?.seriesColor, options?.getSubtitle]); + }, [dataViewId, seriesColor]); return charts; }; -function getSubtitle( - options: { getSubtitle?: ((formulaValue: string) => string) | undefined } | undefined, - chart: { value: string } -) { - return options?.getSubtitle - ? options?.getSubtitle(chart.value) - : getSubtitleFromFormula(chart.value); +function getSubtitle(chart: { value: string }) { + return getSubtitleFromFormula(chart.value); } diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_data_views.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_data_views.ts index 6ef5ab61f517d7..7740b968e74db9 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_data_views.ts +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_data_views.ts @@ -34,7 +34,7 @@ const useDataViews = () => { const { value: logsDataView, loading: logsDataViewLoading } = useAsync( () => getLogsDataView(logViewReference), - [logViewReference] + [logViewReference, getLogsDataView] ); return { diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.test.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.test.ts index c4e3815f5e0f83..006fae9bec753e 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.test.ts +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.test.ts @@ -61,7 +61,7 @@ describe('useHostCharts', () => { const expectedOrder = getHostChartsExpectedOrder(metric, true); const { result, waitForNextUpdate } = renderHook(() => - useHostCharts({ dataViewId, metric, options: { overview: true } }) + useHostCharts({ dataViewId, metric, overview: true }) ); await waitForNextUpdate(); @@ -81,7 +81,7 @@ describe('useHostCharts', () => { describe('useKubernetesCharts', () => { it('should return an array of charts with correct order - overview', async () => { const { result, waitForNextUpdate } = renderHook(() => - useKubernetesCharts({ dataViewId, options: { overview: true } }) + useKubernetesCharts({ dataViewId, overview: true }) ); await waitForNextUpdate(); @@ -141,7 +141,7 @@ describe('useHostKpiCharts', () => { }; const { result, waitForNextUpdate } = renderHook(() => - useHostKpiCharts({ dataViewId, options }) + useHostKpiCharts({ dataViewId, ...options }) ); await waitForNextUpdate(); diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.ts index 6d5381caf6187d..57c9a5a0d7d427 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.ts +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_host_metrics_charts.ts @@ -7,24 +7,21 @@ import { i18n } from '@kbn/i18n'; import { findInventoryModel } from '@kbn/metrics-data-access-plugin/common'; +import { useMemo } from 'react'; import useAsync from 'react-use/lib/useAsync'; import { HostMetricTypes } from '../charts/types'; -interface UseChartsOptions { - overview?: boolean; -} - export const useHostCharts = ({ metric, dataViewId, - options, + overview, }: { metric: HostMetricTypes; dataViewId?: string; - options?: UseChartsOptions; + overview?: boolean; }) => { const { value: charts = [], error } = useAsync(async () => { - const hostCharts = await getHostsCharts({ metric, options }); + const hostCharts = await getHostsCharts({ metric, overview }); return hostCharts.map((chart) => ({ ...chart, ...(dataViewId && { @@ -33,24 +30,24 @@ export const useHostCharts = ({ }, }), })); - }, [dataViewId]); + }, [dataViewId, metric, overview]); return { charts, error }; }; export const useKubernetesCharts = ({ dataViewId, - options, + overview, }: { dataViewId?: string; - options?: UseChartsOptions; + overview?: boolean; }) => { - const model = findInventoryModel('host'); + const model = useMemo(() => findInventoryModel('host'), []); const { value: charts = [], error } = useAsync(async () => { const { kibernetesNode } = await model.metrics.getCharts(); - const items = options?.overview + const items = overview ? [kibernetesNode.xy.nodeCpuCapacity, kibernetesNode.xy.nodeMemoryCapacity] : [ kibernetesNode.xy.nodeCpuCapacity, @@ -69,7 +66,7 @@ export const useKubernetesCharts = ({ }), }; }); - }, [dataViewId, options?.overview]); + }, [dataViewId, overview, model.metrics]); return { charts, error }; }; @@ -83,10 +80,12 @@ const getSubtitleFromFormula = (value: string) => export const useHostKpiCharts = ({ dataViewId, - options, + seriesColor, + getSubtitle, }: { dataViewId?: string; - options?: { seriesColor: string; getSubtitle?: (formulaValue: string) => string }; + seriesColor?: string; + getSubtitle?: (formulaValue: string) => string; }) => { const { value: charts = [] } = useAsync(async () => { const model = findInventoryModel('host'); @@ -99,33 +98,33 @@ export const useHostKpiCharts = ({ disk.metric.diskUsage, ].map((chart) => ({ ...chart, - seriesColor: options?.seriesColor, + seriesColor, decimals: 1, - subtitle: getSubtitle(options, chart), + subtitle: getSubtitle ? getSubtitle(chart.value) : getSubtitleFromFormula(chart.value), ...(dataViewId && { dataset: { index: dataViewId, }, }), })); - }, [dataViewId, options?.seriesColor, options?.getSubtitle]); + }, [dataViewId, seriesColor, getSubtitle]); return charts; }; const getHostsCharts = async ({ metric, - options, + overview, }: { metric: HostMetricTypes; - options?: UseChartsOptions; + overview?: boolean; }) => { const model = findInventoryModel('host'); const { cpu, memory, network, disk, logs } = await model.metrics.getCharts(); switch (metric) { case 'cpu': - return options?.overview + return overview ? [cpu.xy.cpuUsage, cpu.xy.normalizedLoad1m] : [ cpu.xy.cpuUsage, @@ -134,13 +133,13 @@ const getHostsCharts = async ({ cpu.xy.loadBreakdown, ]; case 'memory': - return options?.overview + return overview ? [memory.xy.memoryUsage] : [memory.xy.memoryUsage, memory.xy.memoryUsageBreakdown]; case 'network': return [network.xy.rxTx]; case 'disk': - return options?.overview + return overview ? [disk.xy.diskUsageByMountPoint, disk.xy.diskIOReadWrite] : [disk.xy.diskUsageByMountPoint, disk.xy.diskIOReadWrite, disk.xy.diskThroughputReadWrite]; case 'log': @@ -149,12 +148,3 @@ const getHostsCharts = async ({ return []; } }; - -function getSubtitle( - options: { getSubtitle?: ((formulaValue: string) => string) | undefined } | undefined, - chart: { value: string } -) { - return options?.getSubtitle - ? options?.getSubtitle(chart.value) - : getSubtitleFromFormula(chart.value); -} diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_integration_check.ts b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_integration_check.ts index 000fee47058284..231cd2fdef8fff 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_integration_check.ts +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/hooks/use_integration_check.ts @@ -12,7 +12,7 @@ export const useIntegrationCheck = ({ dependsOn }: { dependsOn: string }) => { const { metadata } = useMetadataStateContext(); const hasIntegration = useMemo( - () => (metadata?.features ?? []).some((f) => f.name === dependsOn), + () => (metadata?.features ?? []).some((f) => f.name.startsWith(dependsOn)), [metadata?.features, dependsOn] ); diff --git a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/container_metrics.tsx b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/container_metrics.tsx index f14619005eadb8..abe14d6d5807ad 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/container_metrics.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/asset_details/tabs/overview/metrics/container_metrics.tsx @@ -20,20 +20,30 @@ interface Props { } export const ContainerMetrics = (props: Props) => { - const isK8sContainer = useIntegrationCheck({ dependsOn: INTEGRATIONS.kubernetesContainer }); + const isDockerContainer = useIntegrationCheck({ dependsOn: INTEGRATIONS.docker }); + const isKubernetesContainer = useIntegrationCheck({ + dependsOn: INTEGRATIONS.kubernetesContainer, + }); + + if (!isDockerContainer && !isKubernetesContainer) { + return null; + } return ( - {isK8sContainer ? ( - <> - - - - ) : ( + {isDockerContainer && ( <> + + + + )} + {!isDockerContainer && isKubernetesContainer && ( + <> + + )} diff --git a/x-pack/plugins/observability_solution/infra/public/components/lens/lens_chart.tsx b/x-pack/plugins/observability_solution/infra/public/components/lens/lens_chart.tsx index e9cd4407fb5b2d..c69b3b8bc34ce6 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/lens/lens_chart.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/lens/lens_chart.tsx @@ -16,12 +16,13 @@ import { ChartLoadError } from './chart_load_error'; const MIN_HEIGHT = 300; -export type LensChartProps = UseLensAttributesParams & - BaseChartProps & +export type LensChartProps = BaseChartProps & Pick & { toolTip?: React.ReactElement; searchSessionId?: string; description?: string; + } & { + lensAttributes: UseLensAttributesParams; }; export const LensChart = React.memo( @@ -41,9 +42,9 @@ export const LensChart = React.memo( disableTriggers = false, height = MIN_HEIGHT, loading = false, - ...lensAttributesParams + lensAttributes, }: LensChartProps) => { - const { formula, attributes, getExtraActions, error } = useLensAttributes(lensAttributesParams); + const { formula, attributes, getExtraActions, error } = useLensAttributes(lensAttributes); const isLoading = loading || !attributes; diff --git a/x-pack/plugins/observability_solution/infra/public/components/log_stream/constants.ts b/x-pack/plugins/observability_solution/infra/public/components/log_stream/constants.ts new file mode 100644 index 00000000000000..c573295aeb81c4 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/components/log_stream/constants.ts @@ -0,0 +1,9 @@ +/* + * Copyright 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 const LOG_STREAM_EMBEDDABLE = 'LOG_STREAM_EMBEDDABLE'; +export const ADD_LOG_STREAM_ACTION_ID = 'ADD_SEARCH_ACTION_ID'; diff --git a/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable.tsx b/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable.tsx deleted file mode 100644 index 9d8be340d9bd58..00000000000000 --- a/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable.tsx +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { Query, Filter } from '@kbn/es-query'; -import { AppMountParameters, CoreStart } from '@kbn/core/public'; -import React, { FC, PropsWithChildren } from 'react'; -import ReactDOM from 'react-dom'; -import { Subscription } from 'rxjs'; -import type { TimeRange } from '@kbn/es-query'; -import { Embeddable, EmbeddableInput, IContainer } from '@kbn/embeddable-plugin/public'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; -import { LogStream } from '@kbn/logs-shared-plugin/public'; -import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; -import { InfraClientStartDeps, InfraClientStartExports } from '../../types'; -import { datemathToEpochMillis } from '../../utils/datemath'; -import { useKibanaContextForPluginProvider } from '../../hooks/use_kibana'; - -export const LOG_STREAM_EMBEDDABLE = 'LOG_STREAM_EMBEDDABLE'; - -export interface LogStreamEmbeddableInput extends EmbeddableInput { - filters: Filter[]; - timeRange: TimeRange; - query: Query; -} - -export class LogStreamEmbeddable extends Embeddable { - public readonly type = LOG_STREAM_EMBEDDABLE; - private node?: HTMLElement; - private subscription: Subscription; - private isDarkMode = false; - - constructor( - private core: CoreStart, - private pluginDeps: InfraClientStartDeps, - private pluginStart: InfraClientStartExports, - initialInput: LogStreamEmbeddableInput, - parent?: IContainer - ) { - super(initialInput, {}, parent); - - this.subscription = new Subscription(); - - this.subscription.add( - core.theme?.theme$.subscribe((theme) => (this.isDarkMode = theme.darkMode)) - ); - - this.subscription.add(this.getInput$().subscribe(() => this.renderComponent())); - } - - public render(node: HTMLElement) { - if (this.node) { - ReactDOM.unmountComponentAtNode(this.node); - } - this.node = node; - - this.renderComponent(); - } - - public destroy() { - super.destroy(); - this.subscription.unsubscribe(); - if (this.node) { - ReactDOM.unmountComponentAtNode(this.node); - } - } - - public async reload() {} - - private renderComponent() { - if (!this.node) { - return; - } - - const startTimestamp = datemathToEpochMillis(this.input.timeRange.from); - const endTimestamp = datemathToEpochMillis(this.input.timeRange.to, 'up'); - - if (!startTimestamp || !endTimestamp) { - return; - } - - ReactDOM.render( - - -
    - -
    -
    -
    , - this.node - ); - } -} - -export interface LogStreamEmbeddableProvidersProps { - core: CoreStart; - pluginStart: InfraClientStartExports; - plugins: InfraClientStartDeps; - theme$: AppMountParameters['theme$']; -} - -export const LogStreamEmbeddableProviders: FC< - PropsWithChildren -> = ({ children, core, pluginStart, plugins }) => { - const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( - core, - plugins, - pluginStart - ); - - return ( - - - {children} - - - ); -}; diff --git a/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable_factory.ts b/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable_factory.ts deleted file mode 100644 index 3d472654c0860e..00000000000000 --- a/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_embeddable_factory.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import { EmbeddableFactoryDefinition, IContainer } from '@kbn/embeddable-plugin/public'; -import { InfraClientStartServicesAccessor } from '../../types'; -import { - LogStreamEmbeddable, - LogStreamEmbeddableInput, - LOG_STREAM_EMBEDDABLE, -} from './log_stream_embeddable'; - -export class LogStreamEmbeddableFactoryDefinition - implements EmbeddableFactoryDefinition -{ - public readonly type = LOG_STREAM_EMBEDDABLE; - - constructor(private getStartServices: InfraClientStartServicesAccessor) {} - - public async isEditable() { - const [{ application }] = await this.getStartServices(); - return application.capabilities.logs.save as boolean; - } - - public async create(initialInput: LogStreamEmbeddableInput, parent?: IContainer) { - const [core, plugins, pluginStart] = await this.getStartServices(); - return new LogStreamEmbeddable(core, plugins, pluginStart, initialInput, parent); - } - - public getDisplayName() { - return i18n.translate('xpack.infra.logStreamEmbeddable.displayName', { - defaultMessage: 'Log stream', - }); - } - - public getDescription() { - return i18n.translate('xpack.infra.logStreamEmbeddable.description', { - defaultMessage: 'Add a table of live streaming logs.', - }); - } - - public getIconType() { - return 'logsApp'; - } - - public async getExplicitInput() { - return { - title: i18n.translate('xpack.infra.logStreamEmbeddable.title', { - defaultMessage: 'Log stream', - }), - }; - } -} diff --git a/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_react_embeddable.tsx b/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_react_embeddable.tsx new file mode 100644 index 00000000000000..313eb476c4ae5e --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/components/log_stream/log_stream_react_embeddable.tsx @@ -0,0 +1,123 @@ +/* + * Copyright 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, { FC, PropsWithChildren, useEffect, useMemo, useState } from 'react'; +import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; +import { + initializeTimeRange, + initializeTitles, + useFetchContext, +} from '@kbn/presentation-publishing'; +import { LogStream } from '@kbn/logs-shared-plugin/public'; +import { AppMountParameters, CoreStart } from '@kbn/core/public'; +import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; +import { Query } from '@kbn/es-query'; +import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import type { LogStreamApi, LogStreamSerializedState, Services } from './types'; +import { datemathToEpochMillis } from '../../utils/datemath'; +import { LOG_STREAM_EMBEDDABLE } from './constants'; +import { useKibanaContextForPluginProvider } from '../../hooks/use_kibana'; +import { InfraClientStartDeps, InfraClientStartExports } from '../../types'; + +export function getLogStreamEmbeddableFactory(services: Services) { + const factory: ReactEmbeddableFactory = { + type: LOG_STREAM_EMBEDDABLE, + deserializeState: (state) => state.rawState, + buildEmbeddable: async (state, buildApi) => { + const timeRangeContext = initializeTimeRange(state); + const { titlesApi, titleComparators, serializeTitles } = initializeTitles(state); + + const api = buildApi( + { + ...timeRangeContext.api, + ...titlesApi, + serializeState: () => { + return { + rawState: { + ...timeRangeContext.serialize(), + ...serializeTitles(), + }, + }; + }, + }, + { + ...timeRangeContext.comparators, + ...titleComparators, + } + ); + + return { + api, + Component: () => { + const { filters, query, timeRange } = useFetchContext(api); + const { startTimestamp, endTimestamp } = useMemo(() => { + return { + startTimestamp: timeRange ? datemathToEpochMillis(timeRange.from) : undefined, + endTimestamp: timeRange ? datemathToEpochMillis(timeRange.to, 'up') : undefined, + }; + }, [timeRange]); + + const [darkMode, setDarkMode] = useState(false); + useEffect(() => { + const subscription = services.coreStart.theme.theme$.subscribe((theme) => { + setDarkMode(theme.darkMode); + }); + return () => subscription.unsubscribe(); + }, []); + + return !startTimestamp || !endTimestamp ? null : ( + + +
    + +
    +
    +
    + ); + }, + }; + }, + }; + return factory; +} + +export interface LogStreamEmbeddableProvidersProps { + core: CoreStart; + pluginStart: InfraClientStartExports; + plugins: InfraClientStartDeps; + theme$: AppMountParameters['theme$']; +} + +export const LogStreamEmbeddableProviders: FC< + PropsWithChildren +> = ({ children, core, pluginStart, plugins }) => { + const KibanaContextProviderForPlugin = useKibanaContextForPluginProvider( + core, + plugins, + pluginStart + ); + + return ( + + + {children} + + + ); +}; diff --git a/x-pack/plugins/observability_solution/infra/public/components/log_stream/types.ts b/x-pack/plugins/observability_solution/infra/public/components/log_stream/types.ts new file mode 100644 index 00000000000000..26a9201c41a948 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/public/components/log_stream/types.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '@kbn/core/public'; +import { DefaultEmbeddableApi } from '@kbn/embeddable-plugin/public'; +import { SerializedTimeRange, SerializedTitles } from '@kbn/presentation-publishing'; +import { InfraClientStartDeps, InfraClientStartExports } from '../../types'; + +export type LogStreamSerializedState = SerializedTitles & SerializedTimeRange; + +export type LogStreamApi = DefaultEmbeddableApi; + +export interface Services { + coreStart: CoreStart; + pluginDeps: InfraClientStartDeps; + pluginStart: InfraClientStartExports; +} diff --git a/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_setup/initial_configuration_step/index_setup_dataset_filter.tsx b/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_setup/initial_configuration_step/index_setup_dataset_filter.tsx index 24884730ad97c8..7d494e97ea6563 100644 --- a/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_setup/initial_configuration_step/index_setup_dataset_filter.tsx +++ b/x-pack/plugins/observability_solution/infra/public/components/logging/log_analysis_setup/initial_configuration_step/index_setup_dataset_filter.tsx @@ -68,7 +68,7 @@ export const IndexSetupDatasetFilter: React.FC<{ > { const builder = new LensConfigBuilder(dataViews, formulaAPI); return builder.build(params) as Promise; - }, [params.chartType, params.dataset, dataViews]); + }, [params, dataViews, lens]); const injectFilters = useCallback( ({ filters, query }: { filters: Filter[]; query: Query }): LensAttributes | null => { diff --git a/x-pack/plugins/observability_solution/infra/public/hooks/use_log_view_reference.ts b/x-pack/plugins/observability_solution/infra/public/hooks/use_log_view_reference.ts index 56ba82b6973385..da68b881155846 100644 --- a/x-pack/plugins/observability_solution/infra/public/hooks/use_log_view_reference.ts +++ b/x-pack/plugins/observability_solution/infra/public/hooks/use_log_view_reference.ts @@ -28,7 +28,7 @@ export const useLogViewReference = ({ id, name, extraFields = [] }: Props) => { const { loading, value: defaultLogView } = useAsync( () => logsShared.logViews.client.getLogView(DEFAULT_LOG_VIEW), - [] + [logsShared.logViews.client] ); const logViewReference = useLazyRef(() => { diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/sections/anomalies/table.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/sections/anomalies/table.tsx index 34075a301c9111..257f8cb1b37b35 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/sections/anomalies/table.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/log_entry_rate/sections/anomalies/table.tsx @@ -230,7 +230,7 @@ const AnomalyMessage = ({ anomaly }: { anomaly: TableItem }) => { 'xpack.infra.logs.analysis.anomaliesTableMoreThanExpectedAnomalyMessage', { defaultMessage: - 'more log messages in this {type, select, logRate {dataset} logCategory {category}} than expected', + 'more log messages in this {type, select, logRate {dataset} logCategory {category} other{#}} than expected', values: { type }, } ); @@ -239,7 +239,7 @@ const AnomalyMessage = ({ anomaly }: { anomaly: TableItem }) => { 'xpack.infra.logs.analysis.anomaliesTableFewerThanExpectedAnomalyMessage', { defaultMessage: - 'fewer log messages in this {type, select, logRate {dataset} logCategory {category}} than expected', + 'fewer log messages in this {type, select, logRate {dataset} logCategory {category} other{#}} than expected', values: { type }, } ); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_template.tsx b/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_template.tsx index 31b8718d9c850d..c0dfc79641dde2 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_template.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/logs/shared/page_template.tsx @@ -8,7 +8,7 @@ import React, { useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability'; import { NoDataConfig } from '@kbn/shared-ux-page-kibana-template'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; @@ -29,13 +29,13 @@ export const LogsPageTemplate: React.FC = ({ observabilityShared: { navigation: { PageTemplate }, }, + share, docLinks, }, } = useKibanaContextForPlugin(); - const { http } = useKibana().services; - const basePath = http!.basePath.get(); - + const onboardingLocator = share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR); + const href = onboardingLocator?.getRedirectUrl({ category: 'logs' }); const { setScreenContext } = observabilityAIAssistant?.service || {}; useEffect(() => { @@ -79,7 +79,7 @@ export const LogsPageTemplate: React.FC = ({ defaultMessage: 'Use the Elastic Agent or Beats to send logs to Elasticsearch. We make it easy with integrations for many popular systems and apps.', }), - href: basePath + `/app/integrations/browse`, + href, }, }, docsLink: docLinks.links.observability.guide, diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/kpis/kpi_charts.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/kpis/kpi_charts.tsx index 9b349441c58764..d0ff61c66abc68 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/kpis/kpi_charts.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/kpis/kpi_charts.tsx @@ -76,7 +76,7 @@ export const KpiCharts = () => { filters={afterLoadedState.filters} query={afterLoadedState.query} searchSessionId={afterLoadedState.searchSessionId} - options={{ getSubtitle: afterLoadedState.getSubtitle }} + getSubtitle={afterLoadedState.getSubtitle} loading={loading} /> ); diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx index ac6c370a7ce6cf..77f45445f00236 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/hosts/components/tabs/metrics/chart.tsx @@ -62,11 +62,12 @@ export const Chart = ({ id, ...chartProps }: ChartProps) => { chartProps.dataset, searchCriteria.filters, searchCriteria.panelFilters, + shouldUseSearchCriteria, ]); return ( { - const model = findInventoryModel('host'); - const { value: charts = [] } = useAsync(async () => { + const model = findInventoryModel('host'); const { cpu, disk, memory, network } = await model.metrics.getCharts(); return [ diff --git a/x-pack/plugins/observability_solution/infra/public/pages/metrics/page_template.tsx b/x-pack/plugins/observability_solution/infra/public/pages/metrics/page_template.tsx index 74128ad8eb41e5..d48b77404767de 100644 --- a/x-pack/plugins/observability_solution/infra/public/pages/metrics/page_template.tsx +++ b/x-pack/plugins/observability_solution/infra/public/pages/metrics/page_template.tsx @@ -5,6 +5,7 @@ * 2.0. */ +import { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability'; import { i18n } from '@kbn/i18n'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; import type { NoDataConfig } from '@kbn/shared-ux-page-kibana-template'; @@ -30,10 +31,13 @@ export const MetricsPageTemplate: React.FC = observabilityShared: { navigation: { PageTemplate }, }, + share, docLinks, }, } = useKibanaContextForPlugin(); + const onboardingLocator = share.url.locators.get(OBSERVABILITY_ONBOARDING_LOCATOR); + const href = onboardingLocator?.getRedirectUrl({ category: 'infra' }); const { source, error: sourceError, loadSource, isLoading } = useSourceContext(); const { error: dataViewLoadError, refetch: loadDataView } = useMetricsDataViewContext(); const { remoteClustersExist, metricIndicesExist } = source?.status ?? {}; @@ -48,6 +52,7 @@ export const MetricsPageTemplate: React.FC = beats: { title: noMetricIndicesPromptPrimaryActionTitle, description: noMetricIndicesPromptDescription, + href, }, }, docsLink: docLinks.links.observability.guide, diff --git a/x-pack/plugins/observability_solution/infra/public/plugin.ts b/x-pack/plugins/observability_solution/infra/public/plugin.ts index 20a6d85092c866..20f819b7eb34d0 100644 --- a/x-pack/plugins/observability_solution/infra/public/plugin.ts +++ b/x-pack/plugins/observability_solution/infra/public/plugin.ts @@ -19,12 +19,14 @@ import { enableInfrastructureHostsView } from '@kbn/observability-plugin/public' import { ObservabilityTriggerId } from '@kbn/observability-shared-plugin/common'; import { BehaviorSubject, combineLatest, from } from 'rxjs'; import { map } from 'rxjs'; +import type { EmbeddableApiContext } from '@kbn/presentation-publishing'; +import { apiCanAddNewPanel } from '@kbn/presentation-containers'; +import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; import type { InfraPublicConfig } from '../common/plugin_config_types'; import { createInventoryMetricRuleType } from './alerting/inventory'; import { createLogThresholdRuleType } from './alerting/log_threshold'; import { createMetricThresholdRuleType } from './alerting/metric_threshold'; -import { LOG_STREAM_EMBEDDABLE } from './components/log_stream/log_stream_embeddable'; -import { LogStreamEmbeddableFactoryDefinition } from './components/log_stream/log_stream_embeddable_factory'; +import { ADD_LOG_STREAM_ACTION_ID, LOG_STREAM_EMBEDDABLE } from './components/log_stream/constants'; import { type InfraLocators, InfraLogsLocatorDefinition, @@ -44,6 +46,7 @@ import type { InfraClientStartExports, } from './types'; import { getLogsHasDataFetcher, getLogsOverviewDataFetcher } from './utils/logs_overview_fetchers'; +import type { LogStreamSerializedState } from './components/log_stream/types'; export class Plugin implements InfraClientPluginClass { public config: InfraPublicConfig; @@ -173,10 +176,17 @@ export class Plugin implements InfraClientPluginClass { ) ); - pluginsSetup.embeddable.registerEmbeddableFactory( - LOG_STREAM_EMBEDDABLE, - new LogStreamEmbeddableFactoryDefinition(core.getStartServices) - ); + pluginsSetup.embeddable.registerReactEmbeddableFactory(LOG_STREAM_EMBEDDABLE, async () => { + const { getLogStreamEmbeddableFactory } = await import( + './components/log_stream/log_stream_react_embeddable' + ); + const [coreStart, pluginDeps, pluginStart] = await core.getStartServices(); + return getLogStreamEmbeddableFactory({ + coreStart, + pluginDeps, + pluginStart, + }); + }); // Register Locators const logsLocator = this.config.featureFlags.logsUIEnabled @@ -388,6 +398,37 @@ export class Plugin implements InfraClientPluginClass { const telemetry = this.telemetry.start(); + plugins.uiActions.registerAction({ + id: ADD_LOG_STREAM_ACTION_ID, + getDisplayName: () => + i18n.translate('xpack.infra.logStreamEmbeddable.displayName', { + defaultMessage: 'Log stream', + }), + getDisplayNameTooltip: () => + i18n.translate('xpack.infra.logStreamEmbeddable.description', { + defaultMessage: 'Add a table of live streaming logs.', + }), + getIconType: () => 'logsApp', + isCompatible: async ({ embeddable }) => { + return apiCanAddNewPanel(embeddable); + }, + execute: async ({ embeddable }) => { + if (!apiCanAddNewPanel(embeddable)) throw new IncompatibleActionError(); + embeddable.addNewPanel( + { + panelType: LOG_STREAM_EMBEDDABLE, + initialState: { + title: i18n.translate('xpack.infra.logStreamEmbeddable.title', { + defaultMessage: 'Log stream', + }), + }, + }, + true + ); + }, + }); + plugins.uiActions.attachAction('ADD_PANEL_TRIGGER', ADD_LOG_STREAM_ACTION_ID); + const startContract: InfraClientStartExports = { inventoryViews, metricsExplorerViews, diff --git a/x-pack/plugins/observability_solution/infra/server/lib/alerting/common/utils.ts b/x-pack/plugins/observability_solution/infra/server/lib/alerting/common/utils.ts index e91f80dccbac9c..9c506d215355a2 100644 --- a/x-pack/plugins/observability_solution/infra/server/lib/alerting/common/utils.ts +++ b/x-pack/plugins/observability_solution/infra/server/lib/alerting/common/utils.ts @@ -196,7 +196,7 @@ export const doFieldsExist = async ( // Get all supported fields const respMapping = await esClient.fieldCaps({ index, - fields: '*', + fields, }); const fieldsExisted: Record = {}; diff --git a/x-pack/plugins/observability_solution/infra/tsconfig.json b/x-pack/plugins/observability_solution/infra/tsconfig.json index 22f3fb1d16d70e..cb98f8ab0859e8 100644 --- a/x-pack/plugins/observability_solution/infra/tsconfig.json +++ b/x-pack/plugins/observability_solution/infra/tsconfig.json @@ -104,6 +104,8 @@ "@kbn/router-utils", "@kbn/react-kibana-context-render", "@kbn/react-kibana-context-theme", + "@kbn/presentation-publishing", + "@kbn/presentation-containers", "@kbn/deeplinks-observability" ], "exclude": [ diff --git a/x-pack/plugins/observability_solution/investigate/README.md b/x-pack/plugins/observability_solution/investigate/README.md new file mode 100644 index 00000000000000..e69de29bb2d1d6 diff --git a/x-pack/plugins/observability_solution/investigate/common/index.ts b/x-pack/plugins/observability_solution/investigate/common/index.ts new file mode 100644 index 00000000000000..1cfdb87f4803a0 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/common/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +export type { + InvestigateTimeline, + InvestigateWidget, + InvestigateWidgetCreate, + WorkflowBlock, +} from './types'; + +export { InvestigateWidgetColumnSpan } from './types'; diff --git a/x-pack/plugins/observability_solution/investigate/common/types.ts b/x-pack/plugins/observability_solution/investigate/common/types.ts new file mode 100644 index 00000000000000..0f593a9a6cde92 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/common/types.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { EuiThemeComputed } from '@elastic/eui'; +import type { Filter } from '@kbn/es-query'; +import type { DeepPartial, PickByValue } from 'utility-types'; + +export interface InvestigateUser { + name: string; +} + +export interface GlobalWidgetParameters { + timeRange: { + from: string; + to: string; + }; + query: { + query: string; + language: 'kuery'; + }; + filters: Filter[]; +} + +export enum InvestigateWidgetColumnSpan { + One = 1, + Two = 2, + Three = 3, + Four = 4, +} + +export interface InvestigateTimeline { + id: string; + title: string; + '@timestamp': number; + user: InvestigateUser; + items: InvestigateWidget[]; +} + +export interface InvestigateWidget< + TParameters extends Record = {}, + TData extends Record = {} +> { + id: string; + created: number; + last_updated: number; + type: string; + user: InvestigateUser; + parameters: GlobalWidgetParameters & TParameters; + data: TData; + title: string; + description?: string; + columns: InvestigateWidgetColumnSpan; + rows: number; + locked: boolean; +} + +export type InvestigateWidgetCreate = {}> = Pick< + InvestigateWidget, + 'title' | 'description' | 'columns' | 'rows' | 'type' | 'locked' +> & { + parameters: DeepPartial & TParameters; +}; + +export interface WorkflowBlock { + id: string; + content?: string; + description?: string; + loading: boolean; + onClick?: () => void; + color?: keyof PickByValue['colors'], string>; + children?: React.ReactNode; +} diff --git a/x-pack/plugins/observability_solution/investigate/jest.config.js b/x-pack/plugins/observability_solution/investigate/jest.config.js new file mode 100644 index 00000000000000..bba3a2285005e6 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/jest.config.js @@ -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. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: [ + '/x-pack/plugins/observability_solution/investigate/public', + '/x-pack/plugins/observability_solution/investigate/common', + '/x-pack/plugins/observability_solution/investigate/server', + ], + setupFiles: [], + collectCoverage: true, + collectCoverageFrom: [ + '/x-pack/plugins/observability_solution/investigate/{common,public,server}/**/*.{js,ts,tsx}', + ], + + coverageReporters: ['html'], +}; diff --git a/x-pack/plugins/observability_solution/investigate/kibana.jsonc b/x-pack/plugins/observability_solution/investigate/kibana.jsonc new file mode 100644 index 00000000000000..ff0d3a58670d86 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/kibana.jsonc @@ -0,0 +1,18 @@ +{ + "type": "plugin", + "id": "@kbn/investigate-plugin", + "owner": "@elastic/obs-ai-assistant", + "plugin": { + "id": "investigate", + "server": true, + "browser": true, + "configPath": ["xpack", "investigate"], + "requiredPlugins": [ + "observabilityAIAssistant" + ], + "requiredBundles": [ + ], + "optionalPlugins": [], + "extraPublicDirs": [] + } +} diff --git a/x-pack/plugins/observability_solution/investigate/public/create_widget.ts b/x-pack/plugins/observability_solution/investigate/public/create_widget.ts new file mode 100644 index 00000000000000..7528565d06165a --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/create_widget.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DeepPartial } from 'utility-types'; +import { InvestigateWidgetColumnSpan, InvestigateWidgetCreate } from '../common'; +import { GlobalWidgetParameters } from '../common/types'; + +type MakePartial, K extends keyof T> = Omit & + DeepPartial>; + +type PredefinedKeys = 'rows' | 'columns' | 'locked' | 'type'; + +type AllowedDefaultKeys = 'rows' | 'columns'; + +export type WidgetFactory> = < + T extends MakePartial, PredefinedKeys> +>( + widgetCreate: T +) => Pick, PredefinedKeys> & + Omit & { parameters: T['parameters'] & DeepPartial }; + +export function createWidgetFactory>( + type: string, + defaults?: Pick, AllowedDefaultKeys> +): WidgetFactory { + const createWidget: WidgetFactory = (widgetCreate) => { + return { + rows: 12, + columns: InvestigateWidgetColumnSpan.Four, + locked: false, + type, + ...defaults, + ...widgetCreate, + }; + }; + + return createWidget; +} diff --git a/x-pack/plugins/observability_solution/investigate/public/esql_widget/constants.ts b/x-pack/plugins/observability_solution/investigate/public/esql_widget/constants.ts new file mode 100644 index 00000000000000..068d4b49fcf807 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/esql_widget/constants.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ESQL_WIDGET_NAME = 'esql'; diff --git a/x-pack/plugins/observability_solution/investigate/public/esql_widget/create_esql_widget.ts b/x-pack/plugins/observability_solution/investigate/public/esql_widget/create_esql_widget.ts new file mode 100644 index 00000000000000..f3226afd14198a --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/esql_widget/create_esql_widget.ts @@ -0,0 +1,12 @@ +/* + * Copyright 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 { createWidgetFactory } from '../create_widget'; +import { ESQL_WIDGET_NAME } from './constants'; +import type { EsqlWidgetParameters } from './types'; + +export const createEsqlWidget = createWidgetFactory(ESQL_WIDGET_NAME); diff --git a/x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts b/x-pack/plugins/observability_solution/investigate/public/esql_widget/types.ts new file mode 100644 index 00000000000000..53ae2fcd87c825 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/esql_widget/types.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { IconType } from '@elastic/eui'; +import type { Ast } from '@kbn/interpreter'; +import type { InvestigateWidgetCreate } from '../../common'; +import type { GlobalWidgetParameters } from '../../common/types'; + +// copied over from the Lens plugin to prevent dependency hell +type TableChangeType = 'initial' | 'unchanged' | 'reduced' | 'extended' | 'reorder' | 'layers'; + +interface Suggestion { + visualizationId: string; + datasourceState?: V; + datasourceId?: string; + columns: number; + score: number; + title: string; + visualizationState: T; + previewExpression?: Ast | string; + previewIcon: IconType; + hide?: boolean; + // flag to indicate if the visualization is incomplete + incomplete?: boolean; + changeType: TableChangeType; + keptLayerIds: string[]; +} + +export interface EsqlWidgetParameters { + esql: string; + suggestion?: Suggestion; + predefined?: Partial; +} + +export type EsqlWidgetCreate = InvestigateWidgetCreate; diff --git a/x-pack/plugins/observability_solution/investigate/public/index.ts b/x-pack/plugins/observability_solution/investigate/public/index.ts new file mode 100644 index 00000000000000..c43ce3d7b14e51 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/index.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 type { PluginInitializer, PluginInitializerContext } from '@kbn/core/public'; + +import { InvestigatePlugin } from './plugin'; +import type { + InvestigatePublicSetup, + InvestigatePublicStart, + InvestigateSetupDependencies, + InvestigateStartDependencies, + ConfigSchema, + OnWidgetAdd, + WidgetRenderAPI, +} from './types'; + +export type { InvestigatePublicSetup, InvestigatePublicStart, OnWidgetAdd, WidgetRenderAPI }; + +export { + type InvestigateTimeline, + type InvestigateWidget, + type InvestigateWidgetCreate, + InvestigateWidgetColumnSpan, + type GlobalWidgetParameters, + type InvestigateUser, + type WorkflowBlock, +} from '../common/types'; + +export { ChromeOption } from './types'; + +export { createWidgetFactory } from './create_widget'; +export { getEsFilterFromGlobalParameters } from './util/get_es_filters_from_global_parameters'; + +export { ESQL_WIDGET_NAME } from './esql_widget/constants'; +export { createEsqlWidget } from './esql_widget/create_esql_widget'; +export type { EsqlWidgetParameters } from './esql_widget/types'; + +export const plugin: PluginInitializer< + InvestigatePublicSetup, + InvestigatePublicStart, + InvestigateSetupDependencies, + InvestigateStartDependencies +> = (pluginInitializerContext: PluginInitializerContext) => + new InvestigatePlugin(pluginInitializerContext); diff --git a/x-pack/plugins/observability_solution/investigate/public/plugin.tsx b/x-pack/plugins/observability_solution/investigate/public/plugin.tsx new file mode 100644 index 00000000000000..1dd248681edad7 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/plugin.tsx @@ -0,0 +1,45 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { CoreSetup, CoreStart, PluginInitializerContext, Plugin } from '@kbn/core/public'; +import type { Logger } from '@kbn/logging'; +import type { + ConfigSchema, + InvestigatePublicSetup, + InvestigatePublicStart, + InvestigateSetupDependencies, + InvestigateStartDependencies, +} from './types'; +import { WidgetRegistry } from './widget_registry'; + +export class InvestigatePlugin + implements + Plugin< + InvestigatePublicSetup, + InvestigatePublicStart, + InvestigateSetupDependencies, + InvestigateStartDependencies + > +{ + logger: Logger; + + widgetRegistry: WidgetRegistry = new WidgetRegistry(); + + constructor(context: PluginInitializerContext) { + this.logger = context.logger.get(); + } + setup(coreSetup: CoreSetup, pluginsSetup: InvestigateSetupDependencies): InvestigatePublicSetup { + return { + registerWidget: this.widgetRegistry.registerWidget, + }; + } + + start(coreStart: CoreStart, pluginsStart: InvestigateStartDependencies): InvestigatePublicStart { + return { + getWidgetDefinitions: this.widgetRegistry.getWidgetDefinitions, + }; + } +} diff --git a/x-pack/plugins/observability_solution/investigate/public/types.ts b/x-pack/plugins/observability_solution/investigate/public/types.ts new file mode 100644 index 00000000000000..2bdef7bb0cf49e --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/types.ts @@ -0,0 +1,84 @@ +/* + * Copyright 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. + */ + +/* eslint-disable @typescript-eslint/no-empty-interface*/ +import type { FromSchema } from 'json-schema-to-ts'; +import type { CompatibleJSONSchema } from '@kbn/observability-ai-assistant-plugin/public'; +import type { InvestigateWidget, WorkflowBlock } from '../common'; +import type { GlobalWidgetParameters, InvestigateWidgetCreate } from '../common/types'; + +export enum ChromeOption { + disabled = 'disabled', + static = 'static', + dynamic = 'dynamic', +} + +export type OnWidgetAdd = (create: InvestigateWidgetCreate) => Promise; + +type UnregisterFunction = () => void; + +export interface WidgetRenderAPI { + onDelete: () => void; + onWidgetAdd: OnWidgetAdd; + blocks: { + publish: (blocks: WorkflowBlock[]) => UnregisterFunction; + }; +} + +type WidgetRenderOptions = { + widget: TInvestigateWidget; +} & WidgetRenderAPI; + +export interface WidgetDefinition { + type: string; + description: string; + schema: CompatibleJSONSchema; + generate: (options: { + parameters: GlobalWidgetParameters; + signal: AbortSignal; + }) => Promise>; + render: (options: WidgetRenderOptions) => React.ReactNode; + chrome?: ChromeOption; +} + +type RegisterWidgetOptions = Omit; + +type MaybeSchemaFrom = + {} & (TSchema extends CompatibleJSONSchema ? FromSchema : {}); + +type GenerateCallback< + TSchema extends CompatibleJSONSchema | undefined, + TData extends Record | undefined +> = (options: { + parameters: MaybeSchemaFrom & GlobalWidgetParameters; + signal: AbortSignal; +}) => Promise; + +export type RegisterWidget = < + TSchema extends CompatibleJSONSchema, + TData extends Record +>( + definition: Omit & { schema: TSchema }, + generateCallback: GenerateCallback, + renderCallback: ( + options: WidgetRenderOptions, TData>> + ) => React.ReactNode +) => void; + +export interface ConfigSchema {} + +export interface InvestigateSetupDependencies {} + +export interface InvestigateStartDependencies {} + +export interface InvestigatePublicSetup { + registerWidget: RegisterWidget; +} + +export interface InvestigatePublicStart { + getWidgetDefinitions: () => WidgetDefinition[]; +} diff --git a/x-pack/plugins/observability_solution/investigate/public/util/get_es_filters_from_global_parameters.ts b/x-pack/plugins/observability_solution/investigate/public/util/get_es_filters_from_global_parameters.ts new file mode 100644 index 00000000000000..19ad31a025769d --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/util/get_es_filters_from_global_parameters.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 { type BoolQuery, buildEsQuery } from '@kbn/es-query'; +import type { GlobalWidgetParameters } from '../../common/types'; + +export function getEsFilterFromGlobalParameters({ + query, + filters, + timeRange, +}: Partial): { bool: BoolQuery } { + const esFilter = buildEsQuery(undefined, query ?? [], filters ?? []); + + if (timeRange) { + esFilter.bool.filter.push({ + range: { + '@timestamp': { + gte: timeRange.from, + lte: timeRange.to, + }, + }, + }); + } + + return esFilter; +} diff --git a/x-pack/plugins/observability_solution/investigate/public/widget_registry.ts b/x-pack/plugins/observability_solution/investigate/public/widget_registry.ts new file mode 100644 index 00000000000000..f76adf5a725068 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/public/widget_registry.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RegisterWidget, WidgetDefinition } from './types'; + +export class WidgetRegistry { + private readonly definitions: WidgetDefinition[] = []; + + constructor() {} + + registerWidget: RegisterWidget = (definition, generateCallback, renderCallback) => { + this.definitions.push({ + ...definition, + generate: generateCallback as WidgetDefinition['generate'], + render: renderCallback as WidgetDefinition['render'], + }); + }; + + getWidgetDefinitions = (): WidgetDefinition[] => { + return this.definitions; + }; +} diff --git a/x-pack/plugins/observability_solution/investigate/server/config.ts b/x-pack/plugins/observability_solution/investigate/server/config.ts new file mode 100644 index 00000000000000..081a30150dbea2 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/server/config.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, type TypeOf } from '@kbn/config-schema'; + +export const config = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type InvestigateConfig = TypeOf; diff --git a/x-pack/plugins/observability_solution/investigate/server/index.ts b/x-pack/plugins/observability_solution/investigate/server/index.ts new file mode 100644 index 00000000000000..a6773966b9a973 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/server/index.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 type { + PluginInitializer, + PluginInitializerContext, + PluginConfigDescriptor, +} from '@kbn/core/server'; +import { InvestigateConfig } from './config'; + +import { InvestigatePlugin } from './plugin'; +import type { + InvestigateServerSetup, + InvestigateServerStart, + InvestigateSetupDependencies, + InvestigateStartDependencies, +} from './types'; + +import { config as configSchema } from './config'; + +export type { InvestigateServerSetup, InvestigateServerStart }; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export const plugin: PluginInitializer< + InvestigateServerSetup, + InvestigateServerStart, + InvestigateSetupDependencies, + InvestigateStartDependencies +> = async (pluginInitializerContext: PluginInitializerContext) => + await new InvestigatePlugin(pluginInitializerContext); diff --git a/x-pack/plugins/observability_solution/investigate/server/plugin.ts b/x-pack/plugins/observability_solution/investigate/server/plugin.ts new file mode 100644 index 00000000000000..baa1303302d463 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/server/plugin.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kbn/core/server'; +import type { Logger } from '@kbn/logging'; +import type { InvestigateConfig } from './config'; +import type { + InvestigateServerSetup, + InvestigateServerStart, + InvestigateSetupDependencies, + InvestigateStartDependencies, +} from './types'; + +export class InvestigatePlugin + implements + Plugin< + InvestigateServerSetup, + InvestigateServerStart, + InvestigateSetupDependencies, + InvestigateStartDependencies + > +{ + logger: Logger; + + constructor(context: PluginInitializerContext) { + this.logger = context.logger.get(); + } + setup(coreSetup: CoreSetup, pluginsSetup: InvestigateSetupDependencies): InvestigateServerSetup { + return {}; + } + + start(coreStart: CoreStart, pluginsStart: InvestigateStartDependencies): InvestigateServerStart { + return {}; + } +} diff --git a/x-pack/plugins/observability_solution/investigate/server/types.ts b/x-pack/plugins/observability_solution/investigate/server/types.ts new file mode 100644 index 00000000000000..1bb0d2a01f32b8 --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/server/types.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/* eslint-disable @typescript-eslint/no-empty-interface*/ + +export interface InvestigateSetupDependencies {} + +export interface InvestigateStartDependencies {} + +export interface InvestigateServerSetup {} + +export interface InvestigateServerStart {} diff --git a/x-pack/plugins/observability_solution/investigate/tsconfig.json b/x-pack/plugins/observability_solution/investigate/tsconfig.json new file mode 100644 index 00000000000000..042aa7d32a1a9c --- /dev/null +++ b/x-pack/plugins/observability_solution/investigate/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "../../../typings/**/*", + "common/**/*", + "public/**/*", + "typings/**/*", + "public/**/*.json", + "server/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/logging", + "@kbn/config-schema", + "@kbn/observability-ai-assistant-plugin", + "@kbn/es-query", + "@kbn/interpreter", + ], + "exclude": ["target/**/*"] +} diff --git a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_control_column.tsx b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_control_column.tsx index 9bb71a3055a683..43edee4cf73af8 100644 --- a/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_control_column.tsx +++ b/x-pack/plugins/observability_solution/logs_explorer/public/customizations/custom_control_column.tsx @@ -141,7 +141,6 @@ export const createCustomControlColumnsConfiguration = }; return { - leadingControlColumns: [checkBoxColumn], - trailingControlColumns: [actionsColumn], + leadingControlColumns: [checkBoxColumn, actionsColumn], }; }; diff --git a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx index 52bda2fbda3674..32ddf912bf740a 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx +++ b/x-pack/plugins/observability_solution/logs_shared/public/components/logging/log_entry_flyout/log_entry_flyout.tsx @@ -209,6 +209,9 @@ export const LogEntryFlyout = ({ ); }; +// eslint-disable-next-line import/no-default-export +export default LogEntryFlyout; + const loadingProgressMessage = i18n.translate('xpack.logsShared.logFlyout.loadingMessage', { defaultMessage: 'Searching log entry in shards', }); diff --git a/x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts b/x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts index 5d18926cca294a..bb8fe69d4356e3 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts +++ b/x-pack/plugins/observability_solution/logs_shared/public/containers/logs/log_summary/with_summary.ts @@ -38,3 +38,6 @@ export const WithSummary = ({ serializedParsedQuery, children }: WithSummaryProp return children({ buckets, start, end }); }; + +// eslint-disable-next-line import/no-default-export +export default WithSummary; diff --git a/x-pack/plugins/observability_solution/logs_shared/public/index.ts b/x-pack/plugins/observability_solution/logs_shared/public/index.ts index 63b8a7d69834fb..80b8dd3638924f 100644 --- a/x-pack/plugins/observability_solution/logs_shared/public/index.ts +++ b/x-pack/plugins/observability_solution/logs_shared/public/index.ts @@ -33,8 +33,6 @@ export { useLogHighlightsStateContext, } from './containers/logs/log_highlights'; export type { LogSummaryBuckets, WithSummaryProps } from './containers/logs/log_summary'; -export { useLogSummary, WithSummary } from './containers/logs/log_summary'; -export { useLogEntryFlyout } from './components/logging/log_entry_flyout'; // Shared components export type { LogAIAssistantDocument } from './components/log_ai_assistant/log_ai_assistant'; @@ -46,10 +44,13 @@ export { iconColumnId, useColumnWidths, } from './components/logging/log_text_stream/log_entry_column'; -export { LogEntryFlyout } from './components/logging/log_entry_flyout'; export type { LogAIAssistantProps } from './components/log_ai_assistant/log_ai_assistant'; export type { LogStreamProps } from './components/log_stream/log_stream'; +export const WithSummary = dynamic(() => import('./containers/logs/log_summary/with_summary')); +export const LogEntryFlyout = dynamic( + () => import('./components/logging/log_entry_flyout/log_entry_flyout') +); export const LogAIAssistant = dynamic( () => import('./components/log_ai_assistant/log_ai_assistant') ); diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/disk.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/disk.ts new file mode 100644 index 00000000000000..b3dcc2860ccae3 --- /dev/null +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/disk.ts @@ -0,0 +1,50 @@ +/* + * Copyright 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 { LensConfigWithId } from '../../../types'; +import { formulas } from '../formulas'; +import { + DEFAULT_XY_FITTING_FUNCTION, + DEFAULT_XY_HIDDEN_AXIS_TITLE, + DEFAULT_XY_LEGEND, + DISK_IOPS_LABEL, +} from '../../../shared/charts/constants'; + +const dockerContainerDiskIOReadWrite: LensConfigWithId = { + id: 'diskIOReadWrite', + chartType: 'xy', + title: DISK_IOPS_LABEL, + layers: [ + { + seriesType: 'area', + type: 'series', + xAxis: '@timestamp', + yAxis: [ + { + ...formulas.dockerContainerDiskIORead, + label: i18n.translate('xpack.metricsData.assetDetails.metricsCharts.metric.label.read', { + defaultMessage: 'Read', + }), + }, + { + ...formulas.dockerContainerDiskIOWrite, + label: i18n.translate('xpack.metricsData.assetDetails.metricsCharts.metric.label.write', { + defaultMessage: 'Write', + }), + }, + ], + }, + ], + ...DEFAULT_XY_FITTING_FUNCTION, + ...DEFAULT_XY_LEGEND, + ...DEFAULT_XY_HIDDEN_AXIS_TITLE, +}; + +export const diskIO = { + xy: { dockerContainerDiskIOReadWrite }, +}; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/index.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/index.ts index 6a83e00c9c5c81..f050a16c57ed4f 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/index.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/index.ts @@ -7,10 +7,14 @@ import { cpu } from './cpu'; import { memory } from './memory'; +import { network } from './network'; +import { diskIO } from './disk'; export const charts = { cpu, memory, + network, + diskIO, } as const; export type ContainerCharts = typeof charts; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/network.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/network.ts new file mode 100644 index 00000000000000..29cc757d772796 --- /dev/null +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/charts/network.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 { + DEFAULT_XY_FITTING_FUNCTION, + DEFAULT_XY_HIDDEN_AXIS_TITLE, + DEFAULT_XY_LEGEND, + NETWORK_LABEL, + RX_LABEL, + TX_LABEL, +} from '../../../shared/charts/constants'; +import { LensConfigWithId } from '../../../types'; +import { formulas } from '../formulas'; + +const dockerContainerRxTx: LensConfigWithId = { + id: 'rxTx', + chartType: 'xy', + title: NETWORK_LABEL, + layers: [ + { + seriesType: 'area', + type: 'series', + xAxis: '@timestamp', + yAxis: [ + { + ...formulas.dockerContainerNetworkRx, + label: RX_LABEL, + }, + { + ...formulas.dockerContainerNetworkTx, + label: TX_LABEL, + }, + ], + }, + ], + ...DEFAULT_XY_FITTING_FUNCTION, + ...DEFAULT_XY_LEGEND, + ...DEFAULT_XY_HIDDEN_AXIS_TITLE, +}; + +export const network = { + xy: { dockerContainerRxTx }, +}; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/disk.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/disk.ts new file mode 100644 index 00000000000000..ba0050bad97aad --- /dev/null +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/disk.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { LensBaseLayer } from '@kbn/lens-embeddable-utils/config_builder'; +import { DISK_READ_IOPS_LABEL, DISK_WRITE_IOPS_LABEL } from '../../../shared/charts/constants'; + +export const dockerContainerDiskIORead: LensBaseLayer = { + label: DISK_READ_IOPS_LABEL, + value: "counter_rate(max(docker.diskio.read.ops), kql='docker.diskio.read.ops: *')", + format: 'number', + decimals: 0, + normalizeByUnit: 's', +}; + +export const dockerContainerDiskIOWrite: LensBaseLayer = { + label: DISK_WRITE_IOPS_LABEL, + value: "counter_rate(max(docker.diskio.write.ops), kql='docker.diskio.write.ops: *')", + format: 'number', + decimals: 0, + normalizeByUnit: 's', +}; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/index.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/index.ts index 2f5e4f7975f7a6..5a878b048179ae 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/index.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/index.ts @@ -6,11 +6,17 @@ */ import { dockerContainerCpuUsage, k8sContainerCpuUsage } from './cpu'; +import { dockerContainerDiskIORead, dockerContainerDiskIOWrite } from './disk'; import { dockerContainerMemoryUsage, k8sContainerMemoryUsage } from './memory'; +import { dockerContainerNetworkRx, dockerContainerNetworkTx } from './network'; export const formulas = { dockerContainerCpuUsage, dockerContainerMemoryUsage, + dockerContainerNetworkRx, + dockerContainerNetworkTx, + dockerContainerDiskIORead, + dockerContainerDiskIOWrite, k8sContainerCpuUsage, k8sContainerMemoryUsage, } as const; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/network.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/network.ts new file mode 100644 index 00000000000000..6c6600fc6463ff --- /dev/null +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/container/metrics/formulas/network.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. + */ + +import type { LensBaseLayer } from '@kbn/lens-embeddable-utils/config_builder'; +import { RX_LABEL, TX_LABEL } from '../../../shared/charts/constants'; + +export const dockerContainerNetworkRx: LensBaseLayer = { + label: RX_LABEL, + value: + "average(docker.network.inbound.bytes) * 8 / (max(metricset.period, kql='docker.network.inbound.bytes: *') / 1000)", + format: 'bits', + decimals: 1, + normalizeByUnit: 's', +}; + +export const dockerContainerNetworkTx: LensBaseLayer = { + label: TX_LABEL, + value: + "average(docker.network.outbound.bytes) * 8 / (max(metricset.period, kql='docker.network.outbound.bytes: *') / 1000)", + format: 'bits', + decimals: 1, + normalizeByUnit: 's', +}; diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/host/metrics/charts/network.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/host/metrics/charts/network.ts index d94dd48db8370f..d166870f5bb4bb 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/host/metrics/charts/network.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/host/metrics/charts/network.ts @@ -5,7 +5,6 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import { LensConfigWithId } from '../../../types'; import { formulas } from '../formulas'; import { @@ -14,6 +13,8 @@ import { DEFAULT_XY_HIDDEN_LEGEND, DEFAULT_XY_LEGEND, NETWORK_LABEL, + RX_LABEL, + TX_LABEL, } from '../../../shared/charts/constants'; const rxTx: LensConfigWithId = { @@ -28,15 +29,11 @@ const rxTx: LensConfigWithId = { yAxis: [ { ...formulas.rx, - label: i18n.translate('xpack.metricsData.assetDetails.metricsCharts.network.label.rx', { - defaultMessage: 'Inbound (RX)', - }), + label: RX_LABEL, }, { ...formulas.tx, - label: i18n.translate('xpack.metricsData.assetDetails.metricsCharts.network.label.tx', { - defaultMessage: 'Outbound (TX)', - }), + label: TX_LABEL, }, ], }, diff --git a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/shared/charts/constants.ts b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/shared/charts/constants.ts index 6d6d22c116f43b..fb59022803331f 100644 --- a/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/shared/charts/constants.ts +++ b/x-pack/plugins/observability_solution/metrics_data_access/common/inventory_models/shared/charts/constants.ts @@ -170,3 +170,11 @@ export const NETWORK_LABEL = i18n.translate( defaultMessage: 'Network', } ); + +export const RX_LABEL = i18n.translate('xpack.metricsData.assetDetails.metrics.label.networkRx', { + defaultMessage: 'Inbound (RX)', +}); + +export const TX_LABEL = i18n.translate('xpack.metricsData.assetDetails.metrics.label.networkTx', { + defaultMessage: 'Outbound (TX)', +}); diff --git a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts index 2a7a69f591e8c0..88f1febca71c09 100644 --- a/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts +++ b/x-pack/plugins/observability_solution/observability/server/lib/rules/custom_threshold/utils.ts @@ -130,7 +130,7 @@ export const doFieldsExist = async ( // Get all supported fields const respMapping = await esClient.fieldCaps({ index, - fields: '*', + fields, }); const fieldsExisted: Record = {}; diff --git a/x-pack/plugins/observability_solution/observability/server/plugin.ts b/x-pack/plugins/observability_solution/observability/server/plugin.ts index fad3db3f5fd109..dad2dd7ee572a8 100644 --- a/x-pack/plugins/observability_solution/observability/server/plugin.ts +++ b/x-pack/plugins/observability_solution/observability/server/plugin.ts @@ -36,6 +36,7 @@ import { RuleRegistryPluginSetupContract } from '@kbn/rule-registry-plugin/serve import { SharePluginSetup } from '@kbn/share-plugin/server'; import { SpacesPluginSetup, SpacesPluginStart } from '@kbn/spaces-plugin/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { ObservabilityConfig } from '.'; import { casesFeatureId, observabilityFeatureId } from '../common'; import { @@ -71,6 +72,7 @@ interface PluginSetup { interface PluginStart { alerting: PluginStartContract; spaces?: SpacesPluginStart; + dataViews: DataViewsServerPluginStart; } const o11yRuleTypes = [ @@ -294,6 +296,7 @@ export class ObservabilityPlugin implements Plugin { ...plugins, core, }, + dataViews: pluginStart.dataViews, spaces: pluginStart.spaces, ruleDataService, assistant: { diff --git a/x-pack/plugins/observability_solution/observability/server/routes/register_routes.ts b/x-pack/plugins/observability_solution/observability/server/routes/register_routes.ts index 373e91d89a1c3a..f0f41a70bec811 100644 --- a/x-pack/plugins/observability_solution/observability/server/routes/register_routes.ts +++ b/x-pack/plugins/observability_solution/observability/server/routes/register_routes.ts @@ -17,6 +17,7 @@ import { import { SpacesPluginStart } from '@kbn/spaces-plugin/server'; import axios from 'axios'; import * as t from 'io-ts'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { ObservabilityConfig } from '..'; import { getHTTPResponseCode, ObservabilityError } from '../errors'; import { AlertDetailsContextualInsightsService } from '../services'; @@ -35,6 +36,7 @@ export interface RegisterRoutesDependencies { pluginsSetup: { core: CoreSetup; }; + dataViews: DataViewsServerPluginStart; spaces?: SpacesPluginStart; ruleDataService: RuleDataPluginService; assistant: { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts index 4648fe10cf5a84..7f0c1f8bb4c091 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/index.ts @@ -5,6 +5,7 @@ * 2.0. */ import type { PluginInitializer, PluginInitializerContext } from '@kbn/core/public'; +export type { CompatibleJSONSchema } from '../common/functions/types'; import { ObservabilityAIAssistantPlugin } from './plugin'; import type { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts index 9e0adc5a94d8f7..7232078d2efe89 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_service.ts @@ -72,10 +72,6 @@ export function createService({ return of( createFunctionRequestMessage({ name: 'context', - args: { - queries: [], - categories: [], - }, }), createFunctionResponseMessage({ name: 'context', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts index 4a347c2710ef44..baf006844c5169 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/context.ts @@ -26,6 +26,8 @@ import { parseSuggestionScores } from './parse_suggestion_scores'; const MAX_TOKEN_COUNT_FOR_DATA_ON_SCREEN = 1000; +export const CONTEXT_FUNCTION_NAME = 'context'; + export function registerContextFunction({ client, functions, @@ -34,38 +36,14 @@ export function registerContextFunction({ }: FunctionRegistrationParameters & { isKnowledgeBaseAvailable: boolean }) { functions.registerFunction( { - name: 'context', + name: CONTEXT_FUNCTION_NAME, description: 'This function provides context as to what the user is looking at on their screen, and recalled documents from the knowledge base that matches their query', visibility: FunctionVisibility.Internal, - parameters: { - type: 'object', - properties: { - queries: { - type: 'array', - description: 'The query for the semantic search', - items: { - type: 'string', - }, - }, - categories: { - type: 'array', - description: - 'Categories of internal documentation that you want to search for. By default internal documentation will be excluded. Use `apm` to get internal APM documentation, `lens` to get internal Lens documentation, or both.', - items: { - type: 'string', - enum: ['apm', 'lens'], - }, - }, - }, - required: ['queries', 'categories'], - } as const, }, - async ({ arguments: args, messages, screenContexts, chat }, signal) => { + async ({ messages, screenContexts, chat }, signal) => { const { analytics } = (await resources.context.core).coreStart; - const { queries, categories } = args; - async function getContext() { const screenDescription = compact( screenContexts.map((context) => context.screenDescription) @@ -92,30 +70,21 @@ export function registerContextFunction({ messages.filter((message) => message.message.role === MessageRole.User) ); - const nonEmptyQueries = compact(queries); - - const queriesOrUserPrompt = nonEmptyQueries.length - ? nonEmptyQueries - : compact([userMessage?.message.content]); - - queriesOrUserPrompt.push(screenDescription); - - const suggestions = await retrieveSuggestions({ - client, - categories, - queries: queriesOrUserPrompt, - }); + const userPrompt = userMessage?.message.content; + const queries = [{ text: userPrompt, boost: 3 }, { text: screenDescription }].filter( + ({ text }) => text + ) as Array<{ text: string; boost?: number }>; + const suggestions = await retrieveSuggestions({ client, queries }); if (suggestions.length === 0) { - return { - content, - }; + return { content }; } try { const { relevantDocuments, scores } = await scoreSuggestions({ suggestions, - queries: queriesOrUserPrompt, + screenDescription, + userPrompt, messages, chat, signal, @@ -123,7 +92,7 @@ export function registerContextFunction({ }); analytics.reportEvent(RecallRankingEventType, { - prompt: queriesOrUserPrompt.join('|'), + prompt: queries.map((query) => query.text).join('|'), scoredDocuments: suggestions.map((suggestion) => { const llmScore = scores.find((score) => score.id === suggestion.id); return { @@ -157,7 +126,7 @@ export function registerContextFunction({ .then(({ content, data }) => { subscriber.next( createFunctionResponseMessage({ - name: 'context', + name: CONTEXT_FUNCTION_NAME, content, data, }) @@ -176,15 +145,12 @@ export function registerContextFunction({ async function retrieveSuggestions({ queries, client, - categories, }: { - queries: string[]; + queries: Array<{ text: string; boost?: number }>; client: ObservabilityAIAssistantClient; - categories: Array<'apm' | 'lens'>; }) { const recallResponse = await client.recall({ queries, - categories, }); return recallResponse.entries.map((entry) => omit(entry, 'labels', 'is_correction')); @@ -206,14 +172,16 @@ const scoreFunctionArgumentsRt = t.type({ async function scoreSuggestions({ suggestions, messages, - queries, + userPrompt, + screenDescription, chat, signal, logger, }: { suggestions: Awaited>; messages: Message[]; - queries: string[]; + userPrompt: string | undefined; + screenDescription: string; chat: FunctionCallChatFunction; signal: AbortSignal; logger: Logger; @@ -235,7 +203,10 @@ async function scoreSuggestions({ - The document contains new information not mentioned before in the conversation Question: - ${queries.join('\n')} + ${userPrompt} + + Screen description: + ${screenDescription} Documents: ${JSON.stringify(indexedSuggestions, null, 2)}`); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts index f016ae126ca53b..bac7963cecbdfc 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info/index.ts @@ -9,13 +9,15 @@ import { FunctionRegistrationParameters } from '..'; import { FunctionVisibility } from '../../../common/functions/types'; import { getRelevantFieldNames } from './get_relevant_field_names'; +export const GET_DATASET_INFO_FUNCTION_NAME = 'get_dataset_info'; + export function registerGetDatasetInfoFunction({ resources, functions, }: FunctionRegistrationParameters) { functions.registerFunction( { - name: 'get_dataset_info', + name: GET_DATASET_INFO_FUNCTION_NAME, visibility: FunctionVisibility.AssistantOnly, description: `Use this function to get information about indices/datasets available and the fields available on them. diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts index 7f706046a693ca..4cf8147d31c714 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/index.ts @@ -6,13 +6,17 @@ */ import dedent from 'dedent'; -import { registerContextFunction } from './context'; -import { registerSummarizationFunction } from './summarize'; +import { CONTEXT_FUNCTION_NAME, registerContextFunction } from './context'; +import { registerSummarizationFunction, SUMMARIZE_FUNCTION_NAME } from './summarize'; import type { RegistrationCallback } from '../service/types'; import { registerElasticsearchFunction } from './elasticsearch'; -import { registerGetDatasetInfoFunction } from './get_dataset_info'; +import { GET_DATASET_INFO_FUNCTION_NAME, registerGetDatasetInfoFunction } from './get_dataset_info'; import { registerKibanaFunction } from './kibana'; import { registerExecuteConnectorFunction } from './execute_connector'; +import { GET_DATA_ON_SCREEN_FUNCTION_NAME } from '../service/chat_function_client'; + +// cannot be imported from x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts due to circular dependency +export const QUERY_FUNCTION_NAME = 'query'; export type FunctionRegistrationParameters = Omit< Parameters[0], @@ -59,30 +63,30 @@ export const registerFunctions: RegistrationCallback = async ({ functions.registerInstruction(({ availableFunctionNames }) => { const instructions: string[] = []; - if (availableFunctionNames.includes('get_dataset_info')) { - instructions.push(`You MUST use the get_dataset_info function ${ - functions.hasFunction('get_apm_dataset_info') ? 'or get_apm_dataset_info' : '' - } function before calling the "query" or "changes" function. + if (availableFunctionNames.includes(GET_DATASET_INFO_FUNCTION_NAME)) { + instructions.push(`You MUST use the "${GET_DATASET_INFO_FUNCTION_NAME}" ${ + functions.hasFunction('get_apm_dataset_info') ? 'or the get_apm_dataset_info' : '' + } function before calling the "${QUERY_FUNCTION_NAME}" or the "changes" functions. - If a function requires an index, you MUST use the results from the dataset info functions.`); + If a function requires an index, you MUST use the results from the dataset info functions.`); } - if (availableFunctionNames.includes('get_data_on_screen')) { - instructions.push(`You have access to data on the screen by calling the "get_data_on_screen" function. - Use it to help the user understand what they are looking at. A short summary of what they are looking at is available in the return of the "context" function. - Data that is compact enough automatically gets included in the response for the "context" function.`); + if (availableFunctionNames.includes(GET_DATA_ON_SCREEN_FUNCTION_NAME)) { + instructions.push(`You have access to data on the screen by calling the "${GET_DATA_ON_SCREEN_FUNCTION_NAME}" function. + Use it to help the user understand what they are looking at. A short summary of what they are looking at is available in the return of the "${CONTEXT_FUNCTION_NAME}" function. + Data that is compact enough automatically gets included in the response for the "${CONTEXT_FUNCTION_NAME}" function.`); } if (isReady) { - if (availableFunctionNames.includes('summarize')) { - instructions.push(`You can use the "summarize" functions to store new information you have learned in a knowledge database. + if (availableFunctionNames.includes(SUMMARIZE_FUNCTION_NAME)) { + instructions.push(`You can use the "${SUMMARIZE_FUNCTION_NAME}" function to store new information you have learned in a knowledge database. Only use this function when the user asks for it. All summaries MUST be created in English, even if the conversation was carried out in a different language.`); } - if (availableFunctionNames.includes('context')) { + if (availableFunctionNames.includes(CONTEXT_FUNCTION_NAME)) { instructions.push( - `Additionally, you can use the "context" function to retrieve relevant information from the knowledge database.` + `Additionally, you can use the "${CONTEXT_FUNCTION_NAME}" function to retrieve relevant information from the knowledge database.` ); } } else { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts index 4ff8e3ee4da91d..ff14f5a3d3db31 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/summarize.ts @@ -8,13 +8,15 @@ import type { FunctionRegistrationParameters } from '.'; import { KnowledgeBaseEntryRole } from '../../common'; +export const SUMMARIZE_FUNCTION_NAME = 'summarize'; + export function registerSummarizationFunction({ client, functions, }: FunctionRegistrationParameters) { functions.registerFunction( { - name: 'summarize', + name: SUMMARIZE_FUNCTION_NAME, description: `Use this function to store facts in the knowledge database if the user requests it. You can score the learnings with a confidence metric, whether it is a correction on a previous learning. An embedding will be created that you can recall later with a semantic search. diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts index 58c93737b66172..52be33c2a372d4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/routes/functions/route.ts @@ -33,7 +33,7 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ const client = await service.getClient({ request }); - const [functionClient, knowledgeBaseInstructions] = await Promise.all([ + const [functionClient, userInstructions] = await Promise.all([ service.getFunctionClient({ signal: controller.signal, resources, @@ -41,7 +41,7 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ screenContexts: [], }), // error is caught in client - client.fetchKnowledgeBaseInstructions(), + client.fetchUserInstructions(), ]); const functionDefinitions = functionClient.getFunctions().map((fn) => fn.definition); @@ -52,7 +52,7 @@ const getFunctionsRoute = createObservabilityAIAssistantServerRoute({ functionDefinitions: functionClient.getFunctions().map((fn) => fn.definition), systemMessage: getSystemMessageFromInstructions({ registeredInstructions: functionClient.getInstructions(), - knowledgeBaseInstructions, + userInstructions, requestInstructions: [], availableFunctionNames, }), @@ -65,7 +65,16 @@ const functionRecallRoute = createObservabilityAIAssistantServerRoute({ params: t.type({ body: t.intersection([ t.type({ - queries: t.array(nonEmptyStringRt), + queries: t.array( + t.intersection([ + t.type({ + text: t.string, + }), + t.partial({ + boost: t.number, + }), + ]) + ), }), t.partial({ categories: t.array(t.string), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts index bdce24d65d2c79..cbb833d0aeb769 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.test.ts @@ -5,7 +5,7 @@ * 2.0. */ import dedent from 'dedent'; -import { ChatFunctionClient } from '.'; +import { ChatFunctionClient, GET_DATA_ON_SCREEN_FUNCTION_NAME } from '.'; import { FunctionVisibility } from '../../../common/functions/types'; describe('chatFunctionClient', () => { @@ -88,7 +88,7 @@ describe('chatFunctionClient', () => { expect(functions[0]).toEqual({ definition: { description: expect.any(String), - name: 'get_data_on_screen', + name: GET_DATA_ON_SCREEN_FUNCTION_NAME, parameters: expect.any(Object), visibility: FunctionVisibility.AssistantOnly, }, @@ -103,7 +103,7 @@ describe('chatFunctionClient', () => { const result = await client.executeFunction({ chat: jest.fn(), - name: 'get_data_on_screen', + name: GET_DATA_ON_SCREEN_FUNCTION_NAME, args: JSON.stringify({ data: ['my_dummy_data'] }), messages: [], signal: new AbortController().signal, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts index e882616e202cc7..0b0f202e703cd5 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/chat_function_client/index.ts @@ -31,6 +31,8 @@ const ajv = new Ajv({ strict: false, }); +export const GET_DATA_ON_SCREEN_FUNCTION_NAME = 'get_data_on_screen'; + export class ChatFunctionClient { private readonly instructions: RegisteredInstruction[] = []; private readonly functionRegistry: FunctionHandlerRegistry = new Map(); @@ -46,7 +48,7 @@ export class ChatFunctionClient { if (allData.length) { this.registerFunction( { - name: 'get_data_on_screen', + name: GET_DATA_ON_SCREEN_FUNCTION_NAME, description: dedent(`Get data that is on the screen: ${allData.map((data) => `${data.name}: ${data.description}`).join('\n')} `), diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts index dae509e169e10d..a409a807163202 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/simulate_function_calling/get_system_message_instructions.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { CONTEXT_FUNCTION_NAME } from '../../../../functions/context'; import { FunctionDefinition } from '../../../../../common'; import { TOOL_USE_END, TOOL_USE_START } from './constants'; @@ -17,7 +18,7 @@ export function getSystemMessageInstructions({ return `In this environment, you have access to a set of tools you can use to answer the user's question. ${ - functions?.find((fn) => fn.name === 'context') + functions?.find((fn) => fn.name === CONTEXT_FUNCTION_NAME) ? `The "context" tool is ALWAYS used after a user question. Even if it was used before, your job is to answer the last user question, even if the "context" tool was executed after that. Consider the tools you need to answer the user's question.` : '' @@ -33,45 +34,37 @@ export function getSystemMessageInstructions({ Given the following tool: - { - "name": "my_tool", - "description: "A tool to call", - "parameters": { - "type": "object", - "properties": { - "myProperty": { - "type": "string" - } - } - } - } + ${JSON.stringify({ + name: 'my_tool', + description: 'A tool to call', + parameters: { + type: 'object', + properties: { + myProperty: { + type: 'string', + }, + }, + }, + })} Use it the following way: ${TOOL_USE_START} \`\`\`json - { - "name": "my_tool", - "input": { - "myProperty": "myValue" - } - } + ${JSON.stringify({ name: 'my_tool', input: { myProperty: 'myValue' } })} \`\`\`\ ${TOOL_USE_END} Given the following tool: - { - "name": "my_tool_without_parameters", - "description": "A tool to call without parameters", - } + ${JSON.stringify({ + name: 'my_tool_without_parameters', + description: 'A tool to call without parameters', + })} Use it the following way: ${TOOL_USE_START} \`\`\`json - { - "name": "my_tool_without_parameters", - "input": {} - } + ${JSON.stringify({ name: 'my_tool_without_parameters', input: {} })} \`\`\`\ ${TOOL_USE_END} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts index 8f05cf144a33b3..e5ea0ad0ff8299 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/get_context_function_request_if_needed.ts @@ -8,6 +8,7 @@ import { findLastIndex } from 'lodash'; import { Message, MessageAddEvent, MessageRole } from '../../../common'; import { createFunctionRequestMessage } from '../../../common/utils/create_function_request_message'; +import { CONTEXT_FUNCTION_NAME } from '../../functions/context'; export function getContextFunctionRequestIfNeeded( messages: Message[] @@ -19,17 +20,13 @@ export function getContextFunctionRequestIfNeeded( const hasContextSinceLastUserMessage = messages .slice(indexOfLastUserMessage) - .some((message) => message.message.name === 'context'); + .some((message) => message.message.name === CONTEXT_FUNCTION_NAME); if (hasContextSinceLastUserMessage) { return undefined; } return createFunctionRequestMessage({ - name: 'context', - args: { - queries: [], - categories: [], - }, + name: CONTEXT_FUNCTION_NAME, }); } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts index add345ffce9c57..0349d597b7ba00 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.test.ts @@ -24,6 +24,7 @@ import { StreamingChatResponseEventType, } from '../../../common/conversation_complete'; import { createFunctionResponseMessage } from '../../../common/utils/create_function_response_message'; +import { CONTEXT_FUNCTION_NAME } from '../../functions/context'; import { ChatFunctionClient } from '../chat_function_client'; import type { KnowledgeBaseService } from '../knowledge_base_service'; import { observableIntoStream } from '../util/observable_into_stream'; @@ -111,7 +112,7 @@ describe('Observability AI Assistant client', () => { const knowledgeBaseServiceMock: DeeplyMockedKeys = { recall: jest.fn(), - getInstructions: jest.fn(), + getUserInstructions: jest.fn(), } as any; let loggerMock: DeeplyMockedKeys = {} as any; @@ -145,7 +146,7 @@ describe('Observability AI Assistant client', () => { functionClientMock.getFunctions.mockReturnValue([]); functionClientMock.hasFunction.mockImplementation((name) => { - return name !== 'context'; + return name !== CONTEXT_FUNCTION_NAME; }); functionClientMock.hasAction.mockReturnValue(false); @@ -170,7 +171,7 @@ describe('Observability AI Assistant client', () => { fields: [], } as any); - knowledgeBaseServiceMock.getInstructions.mockResolvedValue([]); + knowledgeBaseServiceMock.getUserInstructions.mockResolvedValue([]); functionClientMock.getInstructions.mockReturnValue(['system']); @@ -1230,8 +1231,7 @@ describe('Observability AI Assistant client', () => { content: '', role: MessageRole.Assistant, function_call: { - name: 'context', - arguments: JSON.stringify({ queries: [], categories: [] }), + name: CONTEXT_FUNCTION_NAME, trigger: MessageRole.Assistant, }, }, @@ -1248,7 +1248,7 @@ describe('Observability AI Assistant client', () => { message: { content: JSON.stringify([{ id: 'my_document', text: 'My document' }]), role: MessageRole.User, - name: 'context', + name: CONTEXT_FUNCTION_NAME, }, }, }); @@ -1440,7 +1440,7 @@ describe('Observability AI Assistant client', () => { it('executes the context function', async () => { expect(functionClientMock.executeFunction).toHaveBeenCalledWith( - expect.objectContaining({ name: 'context' }) + expect.objectContaining({ name: CONTEXT_FUNCTION_NAME }) ); }); @@ -1454,8 +1454,7 @@ describe('Observability AI Assistant client', () => { content: '', role: MessageRole.Assistant, function_call: { - name: 'context', - arguments: JSON.stringify({ queries: [], categories: [] }), + name: CONTEXT_FUNCTION_NAME, trigger: MessageRole.Assistant, }, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts index 694fbb3233edcb..9739a591250117 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/index.ts @@ -53,6 +53,7 @@ import { type Message, } from '../../../common/types'; import { withoutTokenCountEvents } from '../../../common/utils/without_token_count_events'; +import { CONTEXT_FUNCTION_NAME } from '../../functions/context'; import type { ChatFunctionClient } from '../chat_function_client'; import { KnowledgeBaseEntryOperationType, @@ -210,17 +211,17 @@ export class ObservabilityAIAssistantClient { ); } - const kbInstructions$ = from(this.fetchKnowledgeBaseInstructions()).pipe(shareReplay()); + const userInstructions$ = from(this.fetchUserInstructions()).pipe(shareReplay()); // from the initial messages, override any system message with // the one that is based on the instructions (registered, request, kb) - const messagesWithUpdatedSystemMessage$ = kbInstructions$.pipe( - map((knowledgeBaseInstructions) => { + const messagesWithUpdatedSystemMessage$ = userInstructions$.pipe( + map((userInstructions) => { // this is what we eventually store in the conversation const messagesWithUpdatedSystemMessage = replaceSystemMessage( getSystemMessageFromInstructions({ registeredInstructions: functionClient.getInstructions(), - knowledgeBaseInstructions, + userInstructions, requestInstructions, availableFunctionNames: functionClient .getFunctions() @@ -267,11 +268,11 @@ export class ObservabilityAIAssistantClient { // messages and the knowledge base instructions const nextEvents$ = combineLatest([ messagesWithUpdatedSystemMessage$, - kbInstructions$, + userInstructions$, ]).pipe( - switchMap(([messagesWithUpdatedSystemMessage, knowledgeBaseInstructions]) => { + switchMap(([messagesWithUpdatedSystemMessage, userInstructions]) => { // if needed, inject a context function request here - const contextRequest = functionClient.hasFunction('context') + const contextRequest = functionClient.hasFunction(CONTEXT_FUNCTION_NAME) ? getContextFunctionRequestIfNeeded(messagesWithUpdatedSystemMessage) : undefined; @@ -297,7 +298,7 @@ export class ObservabilityAIAssistantClient { // start out with the max number of function calls functionCallsLeft: MAX_FUNCTION_CALLS, functionClient, - knowledgeBaseInstructions, + userInstructions, requestInstructions, signal, logger: this.dependencies.logger, @@ -693,7 +694,7 @@ export class ObservabilityAIAssistantClient { queries, categories, }: { - queries: string[]; + queries: Array<{ text: string; boost?: number }>; categories?: string[]; }): Promise<{ entries: RecalledEntry[] }> => { return this.dependencies.knowledgeBaseService.recall({ @@ -755,12 +756,10 @@ export class ObservabilityAIAssistantClient { return this.dependencies.knowledgeBaseService.deleteEntry({ id }); }; - fetchKnowledgeBaseInstructions = async () => { - const knowledgeBaseInstructions = await this.dependencies.knowledgeBaseService.getInstructions( + fetchUserInstructions = async () => { + return this.dependencies.knowledgeBaseService.getUserInstructions( this.dependencies.namespace, this.dependencies.user ); - - return knowledgeBaseInstructions; }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts index 77f39c470f43b5..9a198cdc902a49 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/instrumentation/init_langtrace.ts @@ -5,19 +5,19 @@ * 2.0. */ -import { init } from '@langtrase/typescript-sdk'; +// import { init } from '@langtrase/typescript-sdk'; export function initLangtrace() { const apiKey = process.env.LANGTRACE_API_KEY; const apiHost = process.env.LANGTRACE_API_HOST; if (apiKey && apiHost) { - init({ - api_host: apiHost, - api_key: apiKey, - write_to_langtrace_cloud: true, - disable_instrumentations: { - only: [], - }, - }); + // init({ + // api_host: apiHost, + // api_key: apiKey, + // write_to_langtrace_cloud: true, + // disable_instrumentations: { + // only: [], + // }, + // }); } } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts index 251bd3e67e20a8..25b1b736c23d0a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/catch_function_not_found_error.ts @@ -5,26 +5,83 @@ * 2.0. */ -import { catchError, of, OperatorFunction, throwError } from 'rxjs'; +import { catchError, filter, of, OperatorFunction, share, throwError } from 'rxjs'; +import { i18n } from '@kbn/i18n'; +import { MessageRole } from '../../../../common'; import { - createFunctionLimitExceededError, + ChatCompletionChunkEvent, isFunctionNotFoundError, - MessageAddEvent, + MessageOrChatEvent, + StreamingChatResponseEventType, } from '../../../../common/conversation_complete'; -import { createServerSideFunctionResponseError } from '../../util/create_server_side_function_response_error'; +import { emitWithConcatenatedMessage } from '../../../../common/utils/emit_with_concatenated_message'; -export function catchFunctionNotFoundError(): OperatorFunction { - return catchError((error) => { - if (isFunctionNotFoundError(error)) { - const functionLimitExceededError = createFunctionLimitExceededError(); - return of( - createServerSideFunctionResponseError({ - name: error.meta.name, - error: functionLimitExceededError, - }) - ); - } +function appendFunctionLimitExceededErrorMessageToAssistantResponse(): OperatorFunction< + MessageOrChatEvent, + MessageOrChatEvent +> { + return (source$) => { + return source$.pipe( + filter( + (msg): msg is ChatCompletionChunkEvent => + msg.type === StreamingChatResponseEventType.ChatCompletionChunk + ), + emitWithConcatenatedMessage(async (concatenatedMessage) => { + return { + ...concatenatedMessage, + message: { + ...concatenatedMessage.message, + content: `${concatenatedMessage.message.content}\n\n${i18n.translate( + 'xpack.observabilityAiAssistant.functionCallLimitExceeded', + { + defaultMessage: + '\n\nNote: the Assistant tried to call a function, even though the limit was exceeded', + } + )}`, + // remove any function call from the response so the stream can close + function_call: { + name: '', + arguments: '', + trigger: MessageRole.Assistant, + }, + }, + }; + }) + ); + }; +} + +// we catch a function not found error, if: +// - the function limit has been exceeded, +// we append to the message to prevent the +// error going back to the LLM +// else: we complete the observable, and +// allow the LLM to correct the error +export function catchFunctionNotFoundError( + functionLimitExceeded: boolean +): OperatorFunction { + return (source$) => { + const shared$ = source$.pipe(share()); + const chunksWithoutErrors$ = shared$.pipe( + filter( + (event): event is ChatCompletionChunkEvent => + event.type === StreamingChatResponseEventType.ChatCompletionChunk + ), + catchError(() => of()) + ); - return throwError(() => error); - }); + return shared$.pipe( + catchError((error) => { + if (isFunctionNotFoundError(error)) { + if (functionLimitExceeded) { + return chunksWithoutErrors$.pipe( + appendFunctionLimitExceededErrorMessageToAssistantResponse() + ); + } + return chunksWithoutErrors$.pipe(emitWithConcatenatedMessage()); + } + return throwError(() => error); + }) + ); + }; } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts index d6ad705dd286d9..2ab26cb4799ae6 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/operators/continue_conversation.ts @@ -13,7 +13,6 @@ import { concat, EMPTY, from, - identity, isObservable, Observable, of, @@ -22,6 +21,7 @@ import { switchMap, throwError, } from 'rxjs'; +import { CONTEXT_FUNCTION_NAME } from '../../../functions/context'; import { createFunctionNotFoundError, Message, MessageRole } from '../../../../common'; import { createFunctionLimitExceededError, @@ -164,7 +164,7 @@ export function continueConversation({ signal, functionCallsLeft, requestInstructions, - knowledgeBaseInstructions, + userInstructions, logger, disableFunctions, tracer, @@ -175,7 +175,7 @@ export function continueConversation({ signal: AbortSignal; functionCallsLeft: number; requestInstructions: Array; - knowledgeBaseInstructions: UserInstruction[]; + userInstructions: UserInstruction[]; logger: Logger; disableFunctions: boolean; tracer: LangTracer; @@ -193,7 +193,7 @@ export function continueConversation({ const messagesWithUpdatedSystemMessage = replaceSystemMessage( getSystemMessageFromInstructions({ registeredInstructions: functionClient.getInstructions(), - knowledgeBaseInstructions, + userInstructions, requestInstructions, availableFunctionNames: definitions.map((def) => def.name), }), @@ -210,7 +210,7 @@ export function continueConversation({ function executeNextStep() { if (isUserMessage) { const operationName = - lastMessage.name && lastMessage.name !== 'context' + lastMessage.name && lastMessage.name !== CONTEXT_FUNCTION_NAME ? `function_response ${lastMessage.name}` : 'user_message'; @@ -218,10 +218,7 @@ export function continueConversation({ messages: messagesWithUpdatedSystemMessage, functions: definitions, tracer, - }).pipe( - emitWithConcatenatedMessage(), - functionLimitExceeded ? catchFunctionNotFoundError() : identity - ); + }).pipe(emitWithConcatenatedMessage(), catchFunctionNotFoundError(functionLimitExceeded)); } const functionCallName = lastMessage.function_call?.name; @@ -317,7 +314,7 @@ export function continueConversation({ functionCallsLeft: nextFunctionCallsLeft, functionClient, signal, - knowledgeBaseInstructions, + userInstructions, requestInstructions, logger, disableFunctions, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts index 8281c9b5fba072..7c504aa43c38c0 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/knowledge_base_service/index.ts @@ -91,7 +91,6 @@ export class KnowledgeBaseService { input: { field_names: ['text_field'], }, - // @ts-expect-error wait_for_completion: true, }, { requestTimeout: '20m' } @@ -304,7 +303,7 @@ export class KnowledgeBaseService { user, modelId, }: { - queries: string[]; + queries: Array<{ text: string; boost?: number }>; categories?: string[]; namespace: string; user?: { name: string }; @@ -312,11 +311,12 @@ export class KnowledgeBaseService { }): Promise { const query = { bool: { - should: queries.map((text) => ({ + should: queries.map(({ text, boost = 1 }) => ({ text_expansion: { 'ml.tokens': { model_text: text, model_id: modelId, + boost, }, }, })), @@ -386,7 +386,7 @@ export class KnowledgeBaseService { uiSettingsClient, modelId, }: { - queries: string[]; + queries: Array<{ text: string; boost?: number }>; asCurrentUser: ElasticsearchClient; uiSettingsClient: IUiSettingsClient; modelId: string; @@ -415,15 +415,16 @@ export class KnowledgeBaseService { const vectorField = `${ML_INFERENCE_PREFIX}${field}_expanded.predicted_value`; const modelField = `${ML_INFERENCE_PREFIX}${field}_expanded.model_id`; - return queries.map((query) => { + return queries.map(({ text, boost = 1 }) => { return { bool: { should: [ { text_expansion: { [vectorField]: { - model_text: query, + model_text: text, model_id: modelId, + boost, }, }, }, @@ -471,7 +472,7 @@ export class KnowledgeBaseService { asCurrentUser, uiSettingsClient, }: { - queries: string[]; + queries: Array<{ text: string; boost?: number }>; categories?: string[]; user?: { name: string }; namespace: string; @@ -538,7 +539,7 @@ export class KnowledgeBaseService { }; }; - getInstructions = async ( + getUserInstructions = async ( namespace: string, user?: { name: string } ): Promise => { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts index 9706871a63c625..99a2c34bc33d7b 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.test.ts @@ -11,7 +11,7 @@ describe('getSystemMessageFromInstructions', () => { expect( getSystemMessageFromInstructions({ registeredInstructions: ['first', 'second'], - knowledgeBaseInstructions: [], + userInstructions: [], requestInstructions: [], availableFunctionNames: [], }) @@ -27,7 +27,7 @@ describe('getSystemMessageFromInstructions', () => { return availableFunctionNames[0]; }, ], - knowledgeBaseInstructions: [], + userInstructions: [], requestInstructions: [], availableFunctionNames: ['myFunction'], }) @@ -38,7 +38,7 @@ describe('getSystemMessageFromInstructions', () => { expect( getSystemMessageFromInstructions({ registeredInstructions: ['first'], - knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }], + userInstructions: [{ doc_id: 'second', text: 'second_kb' }], requestInstructions: [{ doc_id: 'second', text: 'second_request' }], availableFunctionNames: [], }) @@ -51,7 +51,7 @@ describe('getSystemMessageFromInstructions', () => { expect( getSystemMessageFromInstructions({ registeredInstructions: ['first'], - knowledgeBaseInstructions: [{ doc_id: 'second', text: 'second_kb' }], + userInstructions: [{ doc_id: 'second', text: 'second_kb' }], requestInstructions: [], availableFunctionNames: [], }) @@ -69,7 +69,7 @@ describe('getSystemMessageFromInstructions', () => { return undefined; }, ], - knowledgeBaseInstructions: [], + userInstructions: [], requestInstructions: [], availableFunctionNames: [], }) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts index 4ea5aaecb67f90..ece79b9f784857 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/util/get_system_message_from_instructions.ts @@ -13,12 +13,12 @@ import { RegisteredInstruction } from '../types'; export function getSystemMessageFromInstructions({ registeredInstructions, - knowledgeBaseInstructions, + userInstructions, requestInstructions, availableFunctionNames, }: { registeredInstructions: RegisteredInstruction[]; - knowledgeBaseInstructions: UserInstruction[]; + userInstructions: UserInstruction[]; requestInstructions: Array; availableFunctionNames: string[]; }): string { @@ -39,9 +39,7 @@ export function getSystemMessageFromInstructions({ // all request instructions, and those from the KB that are not defined as a request instruction const allUserInstructions = requestInstructionsWithId.concat( - knowledgeBaseInstructions.filter( - (instruction) => !requestOverrideIds.includes(instruction.doc_id) - ) + userInstructions.filter((instruction) => !requestOverrideIds.includes(instruction.doc_id)) ); const instructionsWithinBudget = withTokenBudget(allUserInstructions, 1000); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts index 28e63384f88340..8855e067487abb 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/visualize_esql.ts @@ -7,6 +7,8 @@ import type { FromSchema } from 'json-schema-to-ts'; import { FunctionVisibility } from '@kbn/observability-ai-assistant-plugin/common'; import { VISUALIZE_ESQL_USER_INTENTIONS } from '@kbn/observability-ai-assistant-plugin/common/functions/visualize_esql'; +import type { ESQLRow } from '@kbn/es-types'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; export const visualizeESQLFunction = { name: 'visualize_query', @@ -29,4 +31,22 @@ export const visualizeESQLFunction = { contexts: ['core'], }; +export interface VisualizeQueryResponsev0 { + content: DatatableColumn[]; +} + +export interface VisualizeQueryResponsev1 { + data: { + columns: DatatableColumn[]; + rows: ESQLRow[]; + userOverrides?: unknown; + }; + content: { + message: string; + errorMessages: string[]; + }; +} + +export type VisualizeQueryResponse = VisualizeQueryResponsev0 | VisualizeQueryResponsev1; + export type VisualizeESQLFunctionArguments = FromSchema; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc index 17a9812631e398..7408f5e5dd1c90 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/kibana.jsonc @@ -24,9 +24,9 @@ "licensing", "ml", "alerting", - "features" + "features", ], - "requiredBundles": ["kibanaReact"], + "requiredBundles": ["kibanaReact", "esqlDataGrid"], "optionalPlugins": ["cloud"], "extraPublicDirs": [] } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.test.tsx index cfb85f79452400..65ac65264f307a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.test.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/chat/chat_body.test.tsx @@ -6,6 +6,7 @@ */ import { Message } from '@kbn/observability-ai-assistant-plugin/common'; +import { CONTEXT_FUNCTION_NAME } from '@kbn/observability-ai-assistant-plugin/server/functions/context'; import { reverseToLastUserMessage } from './chat_body'; describe('', () => { @@ -38,8 +39,8 @@ describe('', () => { message: { role: 'assistant', function_call: { - name: 'context', - arguments: '{"queries":[],"categories":[]}', + name: CONTEXT_FUNCTION_NAME, + arguments: '{}', trigger: 'assistant', }, content: '', @@ -48,7 +49,7 @@ describe('', () => { { message: { role: 'user', - name: 'context', + name: CONTEXT_FUNCTION_NAME, content: '[]', }, }, @@ -86,8 +87,8 @@ describe('', () => { message: { role: 'assistant', function_call: { - name: 'context', - arguments: '{"queries":[],"categories":[]}', + name: CONTEXT_FUNCTION_NAME, + arguments: '{}', trigger: 'assistant', }, content: '', @@ -96,7 +97,7 @@ describe('', () => { { message: { role: 'user', - name: 'context', + name: CONTEXT_FUNCTION_NAME, content: '[]', }, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx index 8757b9f8235bf4..4bb7f1404117c9 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/components/nav_control/index.tsx @@ -56,7 +56,7 @@ export function NavControl({}: {}) { }) : undefined; }, - [service, hasBeenOpened] + [service, hasBeenOpened, notifications.toasts] ); const [isOpen, setIsOpen] = useState(false); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx index cd2a522755f65b..ec51efb85efceb 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/lens.tsx @@ -57,7 +57,7 @@ function Lens({ title: indexPattern, timeFieldName: timeField, }); - }, [indexPattern]); + }, [indexPattern, dataViews, timeField]); const [isSaveModalOpen, setIsSaveModalOpen] = useState(false); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx index 6ac300fa7cb313..836b8f6ef7f939 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.test.tsx @@ -31,6 +31,9 @@ describe('VisualizeESQL', () => { toSpec: jest.fn(), toMinimalSpec: jest.fn(), isPersisted: jest.fn().mockReturnValue(false), + fields: { + getByName: jest.fn(), + }, }) ), }; @@ -73,6 +76,7 @@ describe('VisualizeESQL', () => { ObservabilityAIAssistantMultipaneFlyoutContext={ ObservabilityAIAssistantMultipaneFlyoutContext } + rows={[]} /> ); @@ -138,8 +142,61 @@ describe('VisualizeESQL', () => { }), }; renderComponent({}, lensService, undefined, ['There is an error mate']); + await waitFor(() => expect(screen.findByTestId('observabilityAiAssistantErrorsList'))); + }); + + it('should not display the table on first render', async () => { + const lensService = { + ...lensPluginMock.createStartContract(), + stateHelperApi: jest.fn().mockResolvedValue({ + formula: jest.fn(), + suggestions: jest.fn(), + }), + }; + renderComponent({}, lensService); + // the button to render a table should be present await waitFor(() => - expect(screen.getByTestId('observabilityAiAssistantErrorsList')).toBeInTheDocument() + expect(screen.findByTestId('observabilityAiAssistantLensESQLDisplayTableButton')) + ); + + await waitFor(() => + expect(screen.queryByTestId('observabilityAiAssistantESQLDataGrid')).not.toBeInTheDocument() + ); + }); + + it('should display the table when user clicks the table button', async () => { + const lensService = { + ...lensPluginMock.createStartContract(), + stateHelperApi: jest.fn().mockResolvedValue({ + formula: jest.fn(), + suggestions: jest.fn(), + }), + }; + renderComponent({}, lensService); + await waitFor(() => { + userEvent.click(screen.getByTestId('observabilityAiAssistantLensESQLDisplayTableButton')); + expect(screen.findByTestId('observabilityAiAssistantESQLDataGrid')); + }); + }); + + it('should render the ESQLDataGrid if Lens returns a table', async () => { + const lensService = { + ...lensPluginMock.createStartContract(), + stateHelperApi: jest.fn().mockResolvedValue({ + formula: jest.fn(), + suggestions: jest.fn(), + }), + }; + renderComponent( + { + attributes: { + visualizationType: 'lnsDatatable', + }, + }, + lensService ); + await waitFor(() => { + expect(screen.findByTestId('observabilityAiAssistantESQLDataGrid')); + }); }); }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx index 334db28a8b89ac..97c46a6a2d7592 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/functions/visualize_esql.tsx @@ -15,6 +15,8 @@ import { EuiText, EuiDescriptionList, } from '@elastic/eui'; +import type { ESQLRow } from '@kbn/es-types'; +import { ESQLDataGrid } from '@kbn/esql-datagrid/public'; import type { DataViewsServicePublic } from '@kbn/data-views-plugin/public/types'; import { getESQLAdHocDataview, getIndexPatternFromESQLQuery } from '@kbn/esql-utils'; import type { DatatableColumn } from '@kbn/expressions-plugin/common'; @@ -40,7 +42,10 @@ import React, { useCallback, useContext, useEffect, useMemo, useState } from 're import ReactDOM from 'react-dom'; import useAsync from 'react-use/lib/useAsync'; import { v4 as uuidv4 } from 'uuid'; -import { VisualizeESQLFunctionArguments } from '../../common/functions/visualize_esql'; +import type { + VisualizeESQLFunctionArguments, + VisualizeQueryResponse, +} from '../../common/functions/visualize_esql'; import { ObservabilityAIAssistantAppPluginStartDependencies } from '../types'; enum ChartType { @@ -56,23 +61,6 @@ enum ChartType { Table = 'Table', } -interface VisualizeQueryResponsev0 { - content: DatatableColumn[]; -} - -interface VisualizeQueryResponsev1 { - data: { - columns: DatatableColumn[]; - userOverrides?: unknown; - }; - content: { - message: string; - errorMessages: string[]; - }; -} - -type VisualizeQueryResponse = VisualizeQueryResponsev0 | VisualizeQueryResponsev1; - interface VisualizeESQLProps { /** Lens start contract, get the ES|QL charts suggestions api */ lens: LensPublicStart; @@ -82,6 +70,8 @@ interface VisualizeESQLProps { uiActions: UiActionsStart; /** Datatable columns as returned from the ES|QL _query api, slightly processed to be kibana compliant */ columns: DatatableColumn[]; + /** Datatable rows as returned from the ES|QL _query api */ + rows: ESQLRow[]; /** The ES|QL query */ query: string; /** Actions handler */ @@ -100,12 +90,26 @@ interface VisualizeESQLProps { function generateId() { return uuidv4(); } +const saveVisualizationLabel = i18n.translate( + 'xpack.observabilityAiAssistant.lensESQLFunction.save', + { + defaultMessage: 'Save visualization', + } +); + +const editVisualizationLabel = i18n.translate( + 'xpack.observabilityAiAssistant.lensESQLFunction.edit', + { + defaultMessage: 'Edit visualization', + } +); export function VisualizeESQL({ lens, dataViews, uiActions, columns, + rows, query, onActionClick, userOverrides, @@ -120,11 +124,18 @@ export function VisualizeESQL({ }, [lens]); const dataViewAsync = useAsync(() => { - return getESQLAdHocDataview(indexPattern, dataViews); - }, [indexPattern]); + return getESQLAdHocDataview(indexPattern, dataViews).then((dataView) => { + if (dataView.fields.getByName('@timestamp')?.type === 'date') { + dataView.timeFieldName = '@timestamp'; + } + return dataView; + }); + }, [indexPattern, dataViews]); + const chatFlyoutSecondSlotHandler = useContext(ObservabilityAIAssistantMultipaneFlyoutContext); const [isSaveModalOpen, setIsSaveModalOpen] = useState(false); + const [isTableVisible, setIsTableVisible] = useState(false); const [lensInput, setLensInput] = useState( userOverrides as TypedLensByValueInput ); @@ -238,11 +249,17 @@ export function VisualizeESQL({ if (!lensHelpersAsync.value || !dataViewAsync.value || !lensInput) { return ; } + // if the Lens suggestions api suggests a table then we want to render a Discover table instead + const isLensInputTable = lensInput?.attributes?.visualizationType === 'lnsDatatable'; + + const visualizationComponentDataTestSubj = isTableVisible + ? 'observabilityAiAssistantESQLDataGrid' + : 'observabilityAiAssistantESQLLensChart'; return ( <> - {Boolean(errorMessages?.length) && ( + {!!errorMessages?.length && ( <> {i18n.translate('xpack.observabilityAiAssistant.lensESQLFunction.errorMessage', { @@ -250,7 +267,7 @@ export function VisualizeESQL({ })} - {errorMessages?.map((error, index) => { + {errorMessages.map((error, index) => { return ( @@ -265,61 +282,111 @@ export function VisualizeESQL({ )} - - - - - { - chatFlyoutSecondSlotHandler?.setVisibility?.(true); - if (triggerOptions) { - uiActions.getTrigger('IN_APP_EMBEDDABLE_EDIT_TRIGGER').exec(triggerOptions); - } - }} - data-test-subj="observabilityAiAssistantLensESQLEditButton" - aria-label={i18n.translate('xpack.observabilityAiAssistant.lensESQLFunction.edit', { - defaultMessage: 'Edit visualization', - })} - /> - + {!isLensInputTable && ( + <> - - setIsSaveModalOpen(true)} - data-test-subj="observabilityAiAssistantLensESQLSaveButton" - aria-label={i18n.translate( - 'xpack.observabilityAiAssistant.lensESQLFunction.save', - { - defaultMessage: 'Save visualization', + + + + setIsTableVisible(!isTableVisible)} + data-test-subj="observabilityAiAssistantLensESQLDisplayTableButton" + aria-label={ + isTableVisible + ? i18n.translate( + 'xpack.observabilityAiAssistant.lensESQLFunction.displayChart', + { + defaultMessage: 'Display chart', + } + ) + : i18n.translate( + 'xpack.observabilityAiAssistant.lensESQLFunction.displayTable', + { + defaultMessage: 'Display table', + } + ) + } + /> + + + + { + chatFlyoutSecondSlotHandler?.setVisibility?.(true); + if (triggerOptions) { + uiActions.getTrigger('IN_APP_EMBEDDABLE_EDIT_TRIGGER').exec(triggerOptions); + } + }} + data-test-subj="observabilityAiAssistantLensESQLEditButton" + aria-label={editVisualizationLabel} + /> + + + + setIsSaveModalOpen(true)} + data-test-subj="observabilityAiAssistantLensESQLSaveButton" + aria-label={saveVisualizationLabel} + /> + + + + + + {isTableVisible ? ( + - + ) : ( + + )} - - - - - + + )} + {/* hide the grid in case of errors (as the user can't fix them) */} + {isLensInputTable && !errorMessages?.length && ( + + + + )} + {isSaveModalOpen ? ( { if (!displayedConversationId) { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_knowledge_base.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_knowledge_base.tsx index 0df3ab16c421fc..bca9b384856958 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_knowledge_base.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/hooks/use_knowledge_base.tsx @@ -39,11 +39,14 @@ export function useKnowledgeBase(): UseKnowledgeBaseResult { } = useKibana().services; const service = useObservabilityAIAssistantAppService(); - const status = useAbortableAsync(({ signal }) => { - return service.callApi('GET /internal/observability_ai_assistant/kb/status', { - signal, - }); - }, []); + const status = useAbortableAsync( + ({ signal }) => { + return service.callApi('GET /internal/observability_ai_assistant/kb/status', { + signal, + }); + }, + [service] + ); const [isInstalling, setIsInstalling] = useState(false); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/get_timeline_items_from_conversation.test.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/get_timeline_items_from_conversation.test.tsx index e73555540b1e84..6fb7e1a323d080 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/get_timeline_items_from_conversation.test.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/public/utils/get_timeline_items_from_conversation.test.tsx @@ -12,6 +12,7 @@ import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import { ChatState, Message, MessageRole } from '@kbn/observability-ai-assistant-plugin/public'; import { createMockChatService } from './create_mock_chat_service'; import { KibanaContextProvider } from '@kbn/triggers-actions-ui-plugin/public/common/lib/kibana'; +import { CONTEXT_FUNCTION_NAME } from '@kbn/observability-ai-assistant-plugin/server/functions/context'; const mockChatService = createMockChatService(); @@ -135,7 +136,7 @@ describe('getTimelineItemsFromConversation', () => { message: { role: MessageRole.Assistant, function_call: { - name: 'context', + name: CONTEXT_FUNCTION_NAME, arguments: JSON.stringify({ queries: [], contexts: [] }), trigger: MessageRole.Assistant, }, @@ -145,7 +146,7 @@ describe('getTimelineItemsFromConversation', () => { '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, - name: 'context', + name: CONTEXT_FUNCTION_NAME, content: JSON.stringify([]), }, }, @@ -430,7 +431,7 @@ describe('getTimelineItemsFromConversation', () => { message: { role: MessageRole.Assistant, function_call: { - name: 'context', + name: CONTEXT_FUNCTION_NAME, arguments: JSON.stringify({ queries: [], contexts: [] }), trigger: MessageRole.User, }, @@ -440,7 +441,7 @@ describe('getTimelineItemsFromConversation', () => { '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, - name: 'context', + name: CONTEXT_FUNCTION_NAME, content: JSON.stringify([]), }, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts index e2571795a6e3b7..c9a2c46a3b1f8f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/alert_templates/templates.ts @@ -21,7 +21,7 @@ export const customThresholdAIAssistantLogCount = { contentTypeId: 'index-pattern', data: { fieldAttrs: '{}', - title: '.ds-logs-apm.*', + title: 'logs-apm*', timeFieldName: '@timestamp', sourceFilters: '[]', fields: '[]', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts index 500189c94e7262..4ec8a7714fd96a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/evaluation.ts @@ -208,6 +208,15 @@ function runEvaluations() { score.reasoning, ]); }); + + if (result.errors.length) { + output.push(['Errors', '', '']); + + result.errors.forEach((error) => { + output.push([error.error.message, '', '']); + }); + } + log.write(table.table(output, tableConfig)); const totalResults = result.scores.length; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts index 9d136224b299a4..4361caf828381a 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/kibana_client.ts @@ -28,7 +28,7 @@ import { import { streamIntoObservable } from '@kbn/observability-ai-assistant-plugin/server'; import { ToolingLog } from '@kbn/tooling-log'; import axios, { AxiosInstance, AxiosResponse, isAxiosError } from 'axios'; -import { isArray, pick, remove } from 'lodash'; +import { isArray, omit, pick, remove } from 'lodash'; import pRetry from 'p-retry'; import { concatMap, @@ -42,6 +42,9 @@ import { switchMap, timer, toArray, + catchError, + Observable, + throwError, } from 'rxjs'; import { format, parse, UrlObject } from 'url'; import { inspect } from 'util'; @@ -65,16 +68,20 @@ type CompleteFunction = ( ...args: | [StringOrMessageList] | [StringOrMessageList, Options] - | [string, StringOrMessageList] - | [string, StringOrMessageList, Options] -) => Promise<{ conversationId?: string; messages: InnerMessage[] }>; + | [string | undefined, StringOrMessageList] + | [string | undefined, StringOrMessageList, Options] +) => Promise<{ + conversationId?: string; + messages: InnerMessage[]; + errors: ChatCompletionErrorEvent[]; +}>; export interface ChatClient { chat: (message: StringOrMessageList) => Promise; complete: CompleteFunction; evaluate: ( - {}: { conversationId?: string; messages: InnerMessage[] }, + {}: { conversationId?: string; messages: InnerMessage[]; errors: ChatCompletionErrorEvent[] }, criteria: string[] ) => Promise; getResults: () => EvaluationResult[]; @@ -127,6 +134,21 @@ export class KibanaClient { 'kbn-xsrf': 'true', 'x-elastic-internal-origin': 'foo', }, + }).catch((error) => { + if (isAxiosError(error)) { + const interestingPartsOfError = { + ...omit(error, 'request', 'response', 'config'), + ...pick( + error, + 'response.data', + 'response.headers', + 'response.status', + 'response.statusText' + ), + }; + this.log.error(inspect(interestingPartsOfError, { depth: 10 })); + } + throw error; }); } @@ -240,7 +262,15 @@ export class KibanaClient { retry({ count: 1, delay: (error) => { - that.log.error('Error in stream'); + if ( + isChatCompletionError(error) && + error.code !== ChatCompletionErrorCode.InternalError + ) { + that.log.info(`Not retrying error ${error.code}`); + return throwError(() => error); + } + + that.log.info('Caught retryable error'); if (isAxiosError(error)) { that.log.error( @@ -257,12 +287,10 @@ export class KibanaClient { that.log.error(inspect(error, { depth: 10 })); } - if ( - isChatCompletionError(error) && - error.code !== ChatCompletionErrorCode.InternalError - ) { - that.log.info(`Not retrying error ${error.code}`); - return of(); + if (error.message.includes('Status code: 429')) { + that.log.info(`429, backing off 20s`); + + return timer(20000); } that.log.info(`Retrying in 5s`); return timer(5000); @@ -342,7 +370,7 @@ export class KibanaClient { }, complete: async (...args) => { that.log.info(`Complete`); - let messagesArg: StringOrMessageList; + let messagesArg: StringOrMessageList | undefined; let conversationId: string | undefined; let options: Options = {}; @@ -359,7 +387,11 @@ export class KibanaClient { } else if (args.length === 2 && !isMessageList(args[1])) { messagesArg = args[0]; options = args[1]; - } else if (args.length === 2 && typeof args[0] === 'string' && isMessageList(args[1])) { + } else if ( + args.length === 2 && + (typeof args[0] === 'string' || typeof args[0] === 'undefined') && + isMessageList(args[1]) + ) { conversationId = args[0]; messagesArg = args[1]; } else if (args.length === 3) { @@ -398,27 +430,52 @@ export class KibanaClient { return streamIntoObservable(response.data); }), serializeAndHandleRetryableErrors(), + catchError((error): Observable => { + const errorEvent: ChatCompletionErrorEvent = { + error: { + message: error.message, + stack: error.stack, + code: isChatCompletionError(error) ? error.code : undefined, + meta: error.meta, + }, + type: StreamingChatResponseEventType.ChatCompletionError, + }; + + this.log.error('Error in stream'); + this.log.error(JSON.stringify(error)); + + return of(errorEvent); + }), filter( - (event): event is MessageAddEvent | ConversationCreateEvent => + ( + event + ): event is MessageAddEvent | ConversationCreateEvent | ChatCompletionErrorEvent => event.type === StreamingChatResponseEventType.MessageAdd || - event.type === StreamingChatResponseEventType.ConversationCreate + event.type === StreamingChatResponseEventType.ConversationCreate || + event.type === StreamingChatResponseEventType.ChatCompletionError ), toArray() ); const events = await lastValueFrom(stream$); + const messagesWithAdded = messages + .map((msg) => msg.message) + .concat( + events + .filter( + (event): event is MessageAddEvent => + event.type === StreamingChatResponseEventType.MessageAdd + ) + .map((event) => event.message.message) + ); + return { - messages: messages - .map((msg) => msg.message) - .concat( - events - .filter( - (event): event is MessageAddEvent => - event.type === StreamingChatResponseEventType.MessageAdd - ) - .map((event) => event.message.message) - ), + errors: events.filter( + (event): event is ChatCompletionErrorEvent => + event.type === StreamingChatResponseEventType.ChatCompletionError + ), + messages: messagesWithAdded, conversationId: conversationId || events.find( @@ -427,7 +484,7 @@ export class KibanaClient { )?.conversation.id, }; }, - evaluate: async ({ messages, conversationId }, criteria) => { + evaluate: async ({ messages, conversationId, errors }, criteria) => { const message = await chat('evaluate', { connectorIdOverride: evaluationConnectorId, messages: [ @@ -448,7 +505,7 @@ export class KibanaClient { '@timestamp': new Date().toString(), message: { role: MessageRole.User, - content: `Evaluate the conversation according to the following criteria: + content: `Evaluate the conversation according to the following criteria, using the "scores" tool: ${criteria.map((criterion, index) => { return `${index}: ${criterion}`; @@ -457,7 +514,9 @@ export class KibanaClient { This is the conversation: ${JSON.stringify( - messages.map((msg) => pick(msg, 'content', 'name', 'function_call', 'role')) + messages + .filter((msg) => msg.role !== MessageRole.System) + .map((msg) => omit(msg, 'data')) )}`, }, }, @@ -506,19 +565,30 @@ export class KibanaClient { } ).criteria; + const scores = scoredCriteria + .map(({ index, score, reasoning }) => { + return { + criterion: criteria[index], + score, + reasoning, + }; + }) + .concat({ + score: errors.length === 0 ? 1 : 0, + criterion: 'The conversation encountered errors', + reasoning: errors.length + ? `The following errors occurred: ${errors.map((error) => error.error.message)}` + : 'No errors occurred', + }); + const result: EvaluationResult = { name: currentTitle, category: firstSuiteName, conversationId, messages, passed: scoredCriteria.every(({ score }) => score >= 1), - scores: scoredCriteria.map(({ index, score, reasoning }) => { - return { - criterion: criteria[index], - score, - reasoning, - }; - }), + scores, + errors, }; results.push(result); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts index d0d6dbe17f1240..8e466bbdbea4f6 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/alerts/index.spec.ts @@ -31,6 +31,7 @@ describe('alert function', () => { ruleIds.push(responseApmRule.data.id); logger.info('Creating dataview'); + await kibanaClient.callKibana( 'post', { pathname: '/api/content_management/rpc/create' }, @@ -75,13 +76,32 @@ describe('alert function', () => { .outcome('success'), ]) ); + + logger.debug('Triggering a rule run'); + + await Promise.all( + ruleIds.map((ruleId) => + kibanaClient.callKibana('post', { + pathname: `/internal/alerting/rule/${ruleId}/_run_soon`, + }) + ) + ); + + logger.debug('Waiting 2.5s to make sure all indices are refreshed'); + + await new Promise((resolve) => { + setTimeout(resolve, 2500); + }); }); it('summary of active alerts', async () => { - const conversation = await chatClient.complete('Are there any active alerts?'); + const conversation = await chatClient.complete( + 'Are there any active alerts over the last 4 hours?' + ); const result = await chatClient.evaluate(conversation, [ - 'Uses alerts function to retrieve active alerts', + 'Correctly uses the `alerts` function to fetch data for the current time range', + 'Retrieves 2 alerts', 'Responds with a summary of the current active alerts', ]); @@ -90,7 +110,7 @@ describe('alert function', () => { it('filtered alerts', async () => { let conversation = await chatClient.complete( - 'Do I have any active alerts related to "Threshold surpassed in AI Assistant eval"?' + 'Do I have any active threshold alerts related to the AI Assistant?' ); conversation = await chatClient.complete( @@ -102,10 +122,11 @@ describe('alert function', () => { ); const result = await chatClient.evaluate(conversation, [ - 'Uses alerts function to retrieve active alerts for "Threshold surpassed in AI Assistant eval", uses "filter": "Threshold surpassed in AI Assistant eval" in the alert function', - 'Returns one or more alerts related to "Threshold surpassed in AI Assistant eval", does not return no active alerts related to "Threshold surpassed in AI Assistant eval"', - 'Uses alerts function to filtering on service.name my-service to retrieve active alerts for that service', - 'Returns one or more alerts related to my-service', + 'Uses the get_alerts_dataset_info function', + 'Correctly uses the alerts function without a filter', + 'Returns two alerts related to "Threshold surpassed in AI Assistant eval"', + 'After the second question, uses alerts function to filtering on service.name my-service to retrieve active alerts for that service. The filter should be `service.name:"my-service"` or `service.name:my-service`.', + 'Summarizes the active alerts for the `my-service` service', ]); expect(result.passed).to.be(true); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts index 9dfc11f290d790..361d436f8ecec3 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/apm/index.spec.ts @@ -120,6 +120,7 @@ describe('apm', () => { expect(result.passed).to.be(true); }); + it('services in environment', async () => { let conversation = await chatClient.complete( 'What are the active services in the environment "test"?' @@ -152,8 +153,10 @@ describe('apm', () => { const result = await chatClient.evaluate(conversation, [ 'Responds with the active services in the environment "test"', - 'Executes get_apm_timeseries to obtain the error rate of the services for the last 4 hours, for the specified services in test environment', - 'Obtains the top 2 frequent errors of the services in the last hour, for the specified services in test environment', + 'Successfully executes a query that filters on service.environment and return service.name', + 'Mentions the two active services and their service names', + 'Succesfully executes a query that returns the error rate for the services in the last four hours', + 'Mentions the top 2 frequent errors of the services in the last hour, for the specified services in test environment', 'Returns the current alerts for the services, for the specified services in test environment', ]); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts index 3bd6fc6a0c2075..6c2296316c333c 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/scenarios/esql/index.spec.ts @@ -181,7 +181,7 @@ describe('ES|QL query generation', () => { it('logs avg cpu', async () => { await evaluateEsqlQuery({ question: - 'My metrics data is in `metrics-*`. I want to see what a query would look like that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m.', + 'Assume my metrics data is in `metrics-*`. I want to see what a query would look like that gets the average CPU per service, limit it to the top 10 results, in 1m buckets, and only include the last 15m.', expected: `FROM .ds-metrics-apm* | WHERE @timestamp >= NOW() - 15 minutes | EVAL bucket = DATE_TRUNC(1 minute, @timestamp) diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts index 5a82159510b6e5..83e42ab780dadb 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/scripts/evaluation/types.ts @@ -6,7 +6,10 @@ */ import type { Client } from '@elastic/elasticsearch'; -import type { Message } from '@kbn/observability-ai-assistant-plugin/public'; +import { + type Message, + ChatCompletionErrorEvent, +} from '@kbn/observability-ai-assistant-plugin/common'; import { KibanaClient } from './kibana_client'; import { SynthtraceEsClients } from './setup_synthtrace'; @@ -28,6 +31,7 @@ export interface EvaluationResult { reasoning: string; score: number; }>; + errors: ChatCompletionErrorEvent[]; } export type EvaluationFunction = (options: ScenarioOptions) => Promise; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts index 89ebfa90cb774c..987414214a17bc 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/changes/index.ts @@ -17,6 +17,8 @@ import { import { getMetricChanges } from './get_metric_changes'; import { getLogChanges } from './get_log_changes'; +export const CHANGES_FUNCTION_NAME = 'changes'; + export function registerChangesFunction({ functions, resources: { @@ -26,7 +28,7 @@ export function registerChangesFunction({ }: FunctionRegistrationParameters) { functions.registerFunction( { - name: 'changes', + name: CHANGES_FUNCTION_NAME, description: 'Returns change points like spikes and dips for logs and metrics.', parameters: changesFunctionParameters, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts index a049279f7c4e43..8a81d9ae32123f 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/index.ts @@ -22,10 +22,11 @@ import { } from '@kbn/observability-ai-assistant-plugin/common/utils/concatenate_chat_completion_chunks'; import { emitWithConcatenatedMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/emit_with_concatenated_message'; import { createFunctionResponseMessage } from '@kbn/observability-ai-assistant-plugin/common/utils/create_function_response_message'; -import { ESQLSearchReponse } from '@kbn/es-types'; import type { FunctionRegistrationParameters } from '..'; import { correctCommonEsqlMistakes } from './correct_common_esql_mistakes'; -import { validateEsqlQuery } from './validate_esql_query'; +import { runAndValidateEsqlQuery } from './validate_esql_query'; + +export const QUERY_FUNCTION_NAME = 'query'; const readFile = promisify(Fs.readFile); const readdir = promisify(Fs.readdir); @@ -70,8 +71,8 @@ const loadEsqlDocs = once(async () => { export function registerQueryFunction({ functions, resources }: FunctionRegistrationParameters) { functions.registerInstruction(({ availableFunctionNames }) => - availableFunctionNames.includes('query') - ? `You MUST use the "query" function when the user wants to: + availableFunctionNames.includes(QUERY_FUNCTION_NAME) + ? `You MUST use the "${QUERY_FUNCTION_NAME}" function when the user wants to: - visualize data - run any arbitrary query - breakdown or filter ES|QL queries that are displayed on the current page @@ -79,9 +80,11 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra - asks general questions about ES|QL DO NOT UNDER ANY CIRCUMSTANCES generate ES|QL queries or explain anything about the ES|QL query language yourself. - DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "query" function for this. + DO NOT UNDER ANY CIRCUMSTANCES try to correct an ES|QL query yourself - always use the "${QUERY_FUNCTION_NAME}" function for this. + + If the user asks for a query, and one of the dataset info functions was called and returned no results, you should still call the query function to generate an example query. - Even if the "context" function was used before that, follow it up with the "query" function. If a query fails, do not attempt to correct it yourself. Again you should call the "query" function, + Even if the "${QUERY_FUNCTION_NAME}" function was used before that, follow it up with the "${QUERY_FUNCTION_NAME}" function. If a query fails, do not attempt to correct it yourself. Again you should call the "${QUERY_FUNCTION_NAME}" function, even if it has been called before. When the "visualize_query" function has been called, a visualization has been displayed to the user. DO NOT UNDER ANY CIRCUMSTANCES follow up a "visualize_query" function call with your own visualization attempt. @@ -93,8 +96,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra { name: 'execute_query', visibility: FunctionVisibility.UserOnly, - description: - 'Display the results of an ES|QL query. ONLY use this if the "query" function has been used before or if the user or screen context has provided a query you can use.', + description: 'Display the results of an ES|QL query.', parameters: { type: 'object', properties: { @@ -107,7 +109,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }, async ({ arguments: { query } }) => { const client = (await resources.context.core).elasticsearch.client.asCurrentUser; - const { error, errorMessages } = await validateEsqlQuery({ + const { error, errorMessages, rows, columns } = await runAndValidateEsqlQuery({ query, client, }); @@ -121,22 +123,18 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }, }; } - const response = (await client.transport.request({ - method: 'POST', - path: '_query', - body: { - query, - }, - })) as ESQLSearchReponse; return { - content: response, + content: { + columns, + rows, + }, }; } ); functions.registerFunction( { - name: 'query', + name: QUERY_FUNCTION_NAME, description: `This function generates, executes and/or visualizes a query based on the user's request. It also explains how ES|QL works and how to convert queries from one language to another. Make sure you call one of the get_dataset functions first if you need index or field names. This function takes no input.`, visibility: FunctionVisibility.AssistantOnly, }, @@ -148,17 +146,30 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra '@timestamp': new Date().toISOString(), message: { role: MessageRole.System, content: `${systemMessage}\n${message ?? ''}` }, }, - ...messages.slice(1), + // remove the query function request + ...messages.filter((msg) => msg.message.role !== MessageRole.System), ]; + const userQuestion = messages + .concat() + .reverse() + .find((message) => message.message.role === MessageRole.User && !message.message.name); + + const abbreviatedUserQuestion = userQuestion!.message.content!.substring(0, 50); + const source$ = ( await chat('classify_esql', { - messages: withEsqlSystemMessage().concat({ - '@timestamp': new Date().toISOString(), - message: { - role: MessageRole.User, - content: `Use the classify_esql function to classify the user's request - in the user message before this. + messages: withEsqlSystemMessage().concat( + createFunctionResponseMessage({ + name: QUERY_FUNCTION_NAME, + content: {}, + }).message, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.User, + content: `Use the classify_esql tool attached to this conversation + to classify the user's request in the user message before this ("${abbreviatedUserQuestion}..."). and get more information about specific functions and commands you think are candidates for answering the question. @@ -212,8 +223,9 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra "I want a bar chart of ... " => ${VisualizeESQLUserIntention.visualizeBar} "I want to see a heat map of ..." => ${VisualizeESQLUserIntention.visualizeHeatmap} `, - }, - }), + }, + } + ), signal, functions: [ { @@ -241,14 +253,16 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra items: { type: 'string', }, - description: 'A list of processing or source commands', + description: + 'A list of processing or source commands that are referenced in the list of commands in this conversation', }, functions: { type: 'array', items: { type: 'string', }, - description: 'A list of functions.', + description: + 'A list of functions that are referenced in the list of functions in this conversation', }, intention: { type: 'string', @@ -267,7 +281,14 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra const response = await lastValueFrom(source$); if (!response.message.function_call.arguments) { - throw new Error('LLM did not call classify_esql function'); + resources.logger.debug( + `LLM should have called "classify_esql", but instead responded with the following message: ${JSON.stringify( + response.message + )}` + ); + throw new Error( + 'LLM did not call classify_esql function during query generation, execute the "query" function and try again' + ); } const args = JSON.parse(response.message.function_call.arguments) as { @@ -303,9 +324,22 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra break; } + const queryFunctionResponseMessage = createFunctionResponseMessage({ + name: QUERY_FUNCTION_NAME, + content: {}, + data: { + // add the included docs for debugging + documentation: { + intention: args.intention, + keywords, + files: messagesToInclude, + }, + }, + }); + const esqlResponse$ = await chat('answer_esql_question', { messages: [ - ...withEsqlSystemMessage(), + ...withEsqlSystemMessage().concat(queryFunctionResponseMessage.message), { '@timestamp': new Date().toISOString(), message: { @@ -328,11 +362,18 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }), }, }, + { + '@timestamp': new Date().toISOString(), + message: { + role: MessageRole.Assistant, + content: 'Thank you for providing the ES|QL info. What can I help you with?', + }, + }, { '@timestamp': new Date().toISOString(), message: { role: MessageRole.User, - content: `Answer the user's question that was previously asked using the attached documentation. + content: `Answer the user's question that was previously asked ("${abbreviatedUserQuestion}...") using the attached documentation. Take into account any previous errors from the \`execute_query\` or \`visualize_query\` function. Format any ES|QL query as follows: \`\`\`esql @@ -341,7 +382,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra Respond in plain text. Do not attempt to use a function. - Prefer to use commands and functions for which you have requested documentation. + You must use commands and functions for which you have requested documentation. ${ args.intention !== VisualizeESQLUserIntention.generateQueryOnly @@ -427,20 +468,7 @@ export function registerQueryFunction({ functions, resources }: FunctionRegistra }, }; }), - startWith( - createFunctionResponseMessage({ - name: 'query', - content: {}, - data: { - // add the included docs for debugging - documentation: { - intention: args.intention, - keywords, - files: messagesToInclude, - }, - }, - }) - ) + startWith(queryFunctionResponseMessage) ); } ); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts index 268b1f5fb5fa6f..0b72dfd1de32d4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/query/validate_esql_query.ts @@ -8,24 +8,20 @@ import { validateQuery } from '@kbn/esql-validation-autocomplete'; import { getAstAndSyntaxErrors } from '@kbn/esql-ast'; import type { ElasticsearchClient } from '@kbn/core/server'; -import { ESQLSearchReponse } from '@kbn/es-types'; -import { esFieldTypeToKibanaFieldType, type KBN_FIELD_TYPES } from '@kbn/field-types'; +import { ESQLSearchResponse, ESQLRow } from '@kbn/es-types'; +import { esFieldTypeToKibanaFieldType } from '@kbn/field-types'; +import { DatatableColumn, DatatableColumnType } from '@kbn/expressions-plugin/common'; import { splitIntoCommands } from './correct_common_esql_mistakes'; -export async function validateEsqlQuery({ +export async function runAndValidateEsqlQuery({ query, client, }: { query: string; client: ElasticsearchClient; }): Promise<{ - columns?: Array<{ - id: string; - name: string; - meta: { - type: KBN_FIELD_TYPES; - }; - }>; + columns?: DatatableColumn[]; + rows?: ESQLRow[]; error?: Error; errorMessages?: string[]; }> { @@ -47,28 +43,25 @@ export async function validateEsqlQuery({ return 'text' in error ? error.text : error.message; }); - // With limit 0 I get only the columns, it is much more performant - const performantQuery = `${query} | limit 0`; - return client.transport .request({ method: 'POST', path: '_query', body: { - query: performantQuery, + query, }, }) .then((res) => { - const esqlResponse = res as ESQLSearchReponse; + const esqlResponse = res as ESQLSearchResponse; const columns = esqlResponse.columns?.map(({ name, type }) => ({ id: name, name, - meta: { type: esFieldTypeToKibanaFieldType(type) }, + meta: { type: esFieldTypeToKibanaFieldType(type) as DatatableColumnType }, })) ?? []; - return { columns }; + return { columns, rows: esqlResponse.values }; }) .catch((error) => { return { diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts index 1523ca510238a2..bca5b04e2da06d 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/visualize_esql.ts @@ -5,9 +5,12 @@ * 2.0. */ import { VisualizeESQLUserIntention } from '@kbn/observability-ai-assistant-plugin/common/functions/visualize_esql'; -import { visualizeESQLFunction } from '../../common/functions/visualize_esql'; -import { FunctionRegistrationParameters } from '.'; -import { validateEsqlQuery } from './query/validate_esql_query'; +import { + visualizeESQLFunction, + type VisualizeQueryResponsev1, +} from '../../common/functions/visualize_esql'; +import type { FunctionRegistrationParameters } from '.'; +import { runAndValidateEsqlQuery } from './query/validate_esql_query'; const getMessageForLLM = ( intention: VisualizeESQLUserIntention, @@ -27,22 +30,32 @@ export function registerVisualizeESQLFunction({ functions, resources, }: FunctionRegistrationParameters) { - functions.registerFunction(visualizeESQLFunction, async ({ arguments: { query, intention } }) => { - const { columns, errorMessages } = await validateEsqlQuery({ - query, - client: (await resources.context.core).elasticsearch.client.asCurrentUser, - }); + functions.registerFunction( + visualizeESQLFunction, + async ({ arguments: { query, intention } }): Promise => { + // errorMessages contains the syntax errors from the client side valdation + // error contains the error from the server side validation, it is always one error + // and help us identify errors like index not found, field not found etc. + const { columns, errorMessages, rows, error } = await runAndValidateEsqlQuery({ + query, + client: (await resources.context.core).elasticsearch.client.asCurrentUser, + }); - const message = getMessageForLLM(intention, query, Boolean(errorMessages?.length)); + const message = getMessageForLLM(intention, query, Boolean(errorMessages?.length)); - return { - data: { - columns, - }, - content: { - message, - errorMessages, - }, - }; - }); + return { + data: { + columns: columns ?? [], + rows: rows ?? [], + }, + content: { + message, + errorMessages: [ + ...(errorMessages ? errorMessages : []), + ...(error ? [error.message] : []), + ], + }, + }; + } + ); } diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts index 36217f5a762e56..bf14959a2fba96 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/index.ts @@ -8,6 +8,8 @@ import type { PluginConfigDescriptor, PluginInitializerContext } from '@kbn/core/server'; import type { ObservabilityAIAssistantAppConfig } from './config'; +export { CHANGES_FUNCTION_NAME } from './functions/changes'; +export { QUERY_FUNCTION_NAME } from './functions/query'; import { config as configSchema } from './config'; export type { ObservabilityAIAssistantAppServerStart, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts index c6b8b56b45a874..aac5637e7d5bb4 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/rule_connector/index.ts @@ -224,7 +224,7 @@ async function executor( content: getSystemMessageFromInstructions({ availableFunctionNames: functionClient.getFunctions().map((fn) => fn.definition.name), registeredInstructions: functionClient.getInstructions(), - knowledgeBaseInstructions: [], + userInstructions: [], requestInstructions: [], }), }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json index ce98c24be2a256..282363e50ec3fd 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/tsconfig.json @@ -69,6 +69,7 @@ "@kbn/task-manager-plugin", "@kbn/cloud-plugin", "@kbn/observability-plugin", + "@kbn/esql-datagrid", "@kbn/alerting-comparators" ], "exclude": ["target/**/*"] diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx index b455d4a13ca8b2..4ec17f34610e25 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_management/public/routes/components/settings_tab/settings_tab.tsx @@ -50,6 +50,7 @@ export function SettingsTab() { { defaultMessage: 'Toggle the AI Assistant button and Contextual Insights on or off in Observability apps by checking or unchecking the AI Assistant feature in Spaces > > Features.', + ignoreTag: true, } )}

    diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/header/header.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/header/header.tsx index e05c8cfdd0be23..79789525c83187 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/header/header.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/header/header.tsx @@ -27,7 +27,7 @@ export const Header = () => { 'xpack.observability_onboarding.experimentalOnboardingFlow.startIngestingDataIntoTextLabel', { defaultMessage: - 'Start ingesting data into your Observability project. Return to this page at any time by clicking Add data.', + 'Start ingesting Observability data into Elastic. Return to this page at any time by clicking Add data.', } )} diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/install_elastic_agent.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/install_elastic_agent.tsx index 2b209d8e98709f..18fdc833483fec 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/install_elastic_agent.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/custom_logs/install_elastic_agent.tsx @@ -70,6 +70,8 @@ export function InstallElasticAgent() { if (!hasAlreadySavedFlow(getState())) { return callApi('GET /internal/observability_onboarding/logs/setup/privileges'); } + // FIXME: Dario could not find a reasonable fix for getState() + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const { data: setup } = useFetcher((callApi) => { @@ -102,6 +104,8 @@ export function InstallElasticAgent() { }); } }, + // FIXME: Dario could not find a reasonable fix for getState() + // eslint-disable-next-line react-hooks/exhaustive-deps [monitoringRole?.hasPrivileges] ); @@ -130,10 +134,14 @@ export function InstallElasticAgent() { }, }); } + // FIXME: Dario could not find a reasonable fix for getState() + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const { apiKeyEncoded, onboardingId } = installShipperSetup ?? getState(); + const succesfullySavedOnboardingState = saveOnboardingStateDataStatus === FETCH_STATUS.SUCCESS; + const { data: yamlConfig = '', status: yamlConfigStatus } = useFetcher( (callApi) => { if (apiKeyEncoded && onboardingId) { @@ -143,7 +151,9 @@ export function InstallElasticAgent() { }); } }, - [apiKeyEncoded, onboardingId, saveOnboardingStateDataStatus === FETCH_STATUS.SUCCESS] + // FIXME: Dario could not find a reasonable fix for succesfullySavedOnboardingState + // eslint-disable-next-line react-hooks/exhaustive-deps + [apiKeyEncoded, onboardingId, succesfullySavedOnboardingState] ); useEffect(() => { diff --git a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/system_logs/install_elastic_agent.tsx b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/system_logs/install_elastic_agent.tsx index a46a7c6627662f..ea25181243571b 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/system_logs/install_elastic_agent.tsx +++ b/x-pack/plugins/observability_solution/observability_onboarding/public/application/quickstart_flows/system_logs/install_elastic_agent.tsx @@ -109,6 +109,8 @@ export function InstallElasticAgent() { const { apiKeyEncoded, onboardingId } = installShipperSetup ?? getState(); + const successfullyInstalledShipperSetup = installShipperSetupStatus === FETCH_STATUS.SUCCESS; + const { data: yamlConfig = '', status: yamlConfigStatus } = useFetcher( (callApi) => { if (apiKeyEncoded && onboardingId) { @@ -118,7 +120,9 @@ export function InstallElasticAgent() { }); } }, - [apiKeyEncoded, onboardingId, installShipperSetupStatus === FETCH_STATUS.SUCCESS] + // FIXME: Dario could not find a reasonable fix for successfullyInstalledShipperSetup + // eslint-disable-next-line react-hooks/exhaustive-deps + [apiKeyEncoded, onboardingId, successfullyInstalledShipperSetup] ); useEffect(() => { diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/get_has_logs.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/get_has_logs.ts index 2b384d198f0c46..bedd1de0a80da7 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/get_has_logs.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/get_has_logs.ts @@ -9,11 +9,11 @@ import { ElasticsearchClient } from '@kbn/core/server'; import { termQuery } from '@kbn/observability-plugin/server'; import { AGENT_ID } from '../../../common/es_fields'; import { - ElasticAgentStepPayload, LogFilesState, ObservabilityOnboardingType, SystemLogsState, } from '../../saved_objects/observability_onboarding_status'; +import { ElasticAgentStepPayload } from '../types'; export async function getHasLogs({ type, diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts index e759cb0a169536..b43edf76ce0a5d 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/flow/route.ts @@ -15,14 +15,12 @@ import { import type { TemplateAgentPolicyInput } from '@kbn/fleet-plugin/common'; import { dump } from 'js-yaml'; import { getObservabilityOnboardingFlow, saveObservabilityOnboardingFlow } from '../../lib/state'; -import { - ElasticAgentStepPayload, - ObservabilityOnboardingFlow, -} from '../../saved_objects/observability_onboarding_status'; +import { ObservabilityOnboardingFlow } from '../../saved_objects/observability_onboarding_status'; import { createObservabilityOnboardingServerRoute } from '../create_observability_onboarding_server_route'; import { getHasLogs } from './get_has_logs'; import { getFallbackESUrl } from '../../lib/get_fallback_urls'; +import { ElasticAgentStepPayload, Integration, StepProgressPayloadRT } from '../types'; const updateOnboardingFlowRoute = createObservabilityOnboardingServerRoute({ endpoint: 'PUT /internal/observability_onboarding/flow/{onboardingId}', @@ -72,7 +70,9 @@ const stepProgressUpdateRoute = createObservabilityOnboardingServerRoute({ status: t.string, }), t.partial({ message: t.string }), - t.partial({ payload: t.record(t.string, t.unknown) }), + t.partial({ + payload: StepProgressPayloadRT, + }), ]), }), async handler(resources) { @@ -112,7 +112,7 @@ const stepProgressUpdateRoute = createObservabilityOnboardingServerRoute({ [name]: { status, message, - payload: payload as unknown as ElasticAgentStepPayload, + payload, }, }, }, @@ -162,7 +162,7 @@ const getProgressRoute = createObservabilityOnboardingServerRoute({ type, state: savedObservabilityOnboardingState.state, esClient, - payload: progress['ea-status']?.payload, + payload: progress['ea-status']?.payload as ElasticAgentStepPayload, }); if (hasLogs) { progress['logs-ingest'] = { status: 'complete' }; @@ -239,14 +239,6 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ }); } - await saveObservabilityOnboardingFlow({ - savedObjectsClient, - savedObjectId: params.path.onboardingId, - observabilityOnboardingState: { - ...savedObservabilityOnboardingState, - } as ObservabilityOnboardingFlow, - }); - let agentPolicyInputs: TemplateAgentPolicyInput[] = []; try { agentPolicyInputs = await ensureInstalledIntegrations(integrationsToInstall, packageClient); @@ -261,6 +253,21 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ throw error; } + await saveObservabilityOnboardingFlow({ + savedObjectsClient, + savedObjectId: params.path.onboardingId, + observabilityOnboardingState: { + ...savedObservabilityOnboardingState, + progress: { + ...savedObservabilityOnboardingState.progress, + 'install-integrations': { + status: 'complete', + payload: integrationsToInstall, + }, + }, + } as ObservabilityOnboardingFlow, + }); + const elasticsearchUrl = plugins.cloud?.setup?.elasticsearchUrl ? [plugins.cloud?.setup?.elasticsearchUrl] : await getFallbackESUrl(services.esLegacyConfigService); @@ -277,17 +284,6 @@ const integrationsInstallRoute = createObservabilityOnboardingServerRoute({ }, }); -type Integration = - | { - pkgName: string; - installSource: 'registry'; - } - | { - pkgName: string; - installSource: 'custom'; - logFilePaths: string[]; - }; - async function ensureInstalledIntegrations( integrationsToInstall: Integration[], packageClient: PackageClient diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts index 11efacc415e57c..e9ab6b14dab544 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/routes/types.ts @@ -11,6 +11,7 @@ import { KibanaResponseFactory, Logger, } from '@kbn/core/server'; +import * as t from 'io-ts'; import { ObservabilityOnboardingServerRouteRepository } from '.'; import { ObservabilityOnboardingConfig } from '..'; import { EsLegacyConfigService } from '../services/es_legacy_config_service'; @@ -50,3 +51,34 @@ export interface ObservabilityOnboardingRouteCreateOptions { xsrfRequired?: boolean; }; } + +export const IntegrationRT = t.union([ + t.type({ + pkgName: t.string, + installSource: t.literal('registry'), + }), + t.type({ + pkgName: t.string, + installSource: t.literal('custom'), + logFilePaths: t.array(t.string), + }), +]); + +export type Integration = t.TypeOf; + +export const ElasticAgentStepPayloadRT = t.type({ + agentId: t.string, +}); + +export type ElasticAgentStepPayload = t.TypeOf; + +export const InstallIntegrationsStepPayloadRT = t.array(IntegrationRT); + +export type InstallIntegrationsStepPayload = t.TypeOf; + +export const StepProgressPayloadRT = t.union([ + ElasticAgentStepPayloadRT, + InstallIntegrationsStepPayloadRT, +]); + +export type StepProgressPayload = t.TypeOf; diff --git a/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts b/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts index afaa6461cc4f41..297f7f33a9d64a 100644 --- a/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts +++ b/x-pack/plugins/observability_solution/observability_onboarding/server/saved_objects/observability_onboarding_status.ts @@ -7,8 +7,10 @@ import { SavedObjectsType } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; +import { StepProgressPayload } from '../routes/types'; export const OBSERVABILITY_ONBOARDING_STATE_SAVED_OBJECT_TYPE = 'observability-onboarding-state'; + export interface LogFilesState { datasetName: string; serviceName?: string; @@ -21,10 +23,6 @@ export interface SystemLogsState { namespace: string; } -export interface ElasticAgentStepPayload { - agentId: string; -} - export type ObservabilityOnboardingType = 'logFiles' | 'systemLogs'; type ObservabilityOnboardingFlowState = LogFilesState | SystemLogsState | undefined; @@ -37,7 +35,7 @@ export interface ObservabilityOnboardingFlow { { status: string; message?: string; - payload?: ElasticAgentStepPayload; + payload?: StepProgressPayload; } >; } @@ -63,6 +61,14 @@ const ElasticAgentStepPayloadSchema = schema.object({ agentId: schema.string(), }); +export const InstallIntegrationsStepPayloadSchema = schema.arrayOf( + schema.object({ + pkgName: schema.string(), + installSource: schema.string(), + logFilePaths: schema.maybe(schema.arrayOf(schema.string())), + }) +); + export const observabilityOnboardingFlow: SavedObjectsType = { name: OBSERVABILITY_ONBOARDING_STATE_SAVED_OBJECT_TYPE, hidden: false, @@ -92,5 +98,26 @@ export const observabilityOnboardingFlow: SavedObjectsType = { }), }, }, + '2': { + changes: [], + schemas: { + create: schema.object({ + type: schema.string(), + state: schema.maybe( + schema.oneOf([LogFilesStateSchema, SystemLogsStateSchema, schema.never()]) + ), + progress: schema.mapOf( + schema.string(), + schema.object({ + status: schema.string(), + message: schema.maybe(schema.string()), + payload: schema.maybe( + schema.oneOf([ElasticAgentStepPayloadSchema, InstallIntegrationsStepPayloadSchema]) + ), + }) + ), + }), + }, + }, }, }; diff --git a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_es_search.ts b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_es_search.ts index e51fdb8964bf51..ef38cf13a8c2aa 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_es_search.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/hooks/use_es_search.ts @@ -110,6 +110,7 @@ export const useEsSearch = (); - const [isLoading, setIsLoading] = useState(false); - - useEffect(() => { - const createDataView = () => - dataViews.create({ + const { data: dataView, loading } = useFetcher(async () => { + if (dataViewId) { + try { + return await dataViews.get(dataViewId); + } catch (e) { + return dataViews.create({ + id: `${indexPatternString}-id`, + title: indexPatternString, + allowNoIndex: true, + }); + } + } else if (indexPatternString) { + return dataViews.create({ id: `${indexPatternString}-id`, title: indexPatternString, allowNoIndex: true, }); - - if (indexPatternString) { - setIsLoading(true); - createDataView() - .then((value) => { - setStateDataView(value); - }) - .finally(() => { - setIsLoading(false); - }); } - }, [indexPatternString, dataViews]); + }, [dataViewId, dataViews, indexPatternString]); - return { dataView: stateDataView, loading: isLoading }; + return { dataView, loading: Boolean(loading) }; } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.test.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.test.tsx index 842c30073ecb19..508f8295121d27 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_details/slo_details.test.tsx @@ -32,6 +32,7 @@ import { useKibana } from '../../utils/kibana_react'; import { render } from '../../utils/test_helper'; import { SloDetailsPage } from './slo_details'; import { TagsList, HeaderMenuPortal } from '@kbn/observability-shared-plugin/public'; +import { useCreateDataView } from '../../hooks/use_create_data_view'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -46,6 +47,7 @@ jest.mock('../../hooks/use_fetch_active_alerts'); jest.mock('../../hooks/use_fetch_slo_details'); jest.mock('../../hooks/use_fetch_historical_summary'); jest.mock('../../hooks/use_delete_slo'); +jest.mock('../../hooks/use_create_data_view'); jest.mock('../../hooks/use_delete_slo_instance'); const useKibanaMock = useKibana as jest.Mock; @@ -56,6 +58,7 @@ const useFetchActiveAlertsMock = useFetchActiveAlerts as jest.Mock; const useFetchSloDetailsMock = useFetchSloDetails as jest.Mock; const useFetchHistoricalSummaryMock = useFetchHistoricalSummary as jest.Mock; const useDeleteSloMock = useDeleteSlo as jest.Mock; +const useCreateDataViewsMock = useCreateDataView as jest.Mock; const useDeleteSloInstanceMock = useDeleteSloInstance as jest.Mock; const TagsListMock = TagsList as jest.Mock; TagsListMock.mockReturnValue(
    Tags list
    ); @@ -132,6 +135,9 @@ describe('SLO Details Page', () => { jest.clearAllMocks(); mockKibana(); useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + useCreateDataViewsMock.mockReturnValue({ + dataView: { getName: () => 'dataview', getIndexPattern: () => '.dataview-index' }, + }); useFetchHistoricalSummaryMock.mockReturnValue({ isLoading: false, data: historicalSummaryData, diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.tsx index ee08e073bcac9e..7424db8a448e64 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/apm_availability/apm_availability_indicator_type_form.tsx @@ -10,6 +10,7 @@ import { APMTransactionErrorRateIndicator } from '@kbn/slo-schema'; import { i18n } from '@kbn/i18n'; import React, { useEffect } from 'react'; import { useFormContext } from 'react-hook-form'; +import { DATA_VIEW_FIELD } from '../custom_common/index_selection'; import { useCreateDataView } from '../../../../hooks/use_create_data_view'; import { GroupByField } from '../common/group_by_field'; import { useFetchApmIndex } from '../../../../hooks/use_fetch_apm_indices'; @@ -23,6 +24,7 @@ import { getGroupByCardinalityFilters } from '../apm_common/get_group_by_cardina export function ApmAvailabilityIndicatorTypeForm() { const { watch, setValue } = useFormContext>(); const { data: apmIndex } = useFetchApmIndex(); + const dataViewId = watch(DATA_VIEW_FIELD); const [ serviceName = '', @@ -53,6 +55,7 @@ export function ApmAvailabilityIndicatorTypeForm() { const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ indexPatternString: apmIndex, + dataViewId, }); return ( @@ -129,7 +132,7 @@ export function ApmAvailabilityIndicatorTypeForm() { ; placeholder: string; @@ -25,10 +26,7 @@ export interface SearchBarProps { } export function QueryBuilder(props: SearchBarProps) { - const { indexPatternString, name } = props; - const { dataView } = useCreateDataView({ - indexPatternString, - }); + const { dataView, name } = props; const [isFlyoutOpen, setIsFlyoutOpen] = useState(false); const [range, setRange] = useState({ from: 'now-15m', to: 'now' }); @@ -67,6 +65,7 @@ export function QueryBuilder(props: SearchBarProps) { searchBarProps={props} /> )} + ); } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx index 49ddd17e65a4e2..d238aacf1df600 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/query_search_bar.tsx @@ -12,7 +12,6 @@ import { kqlQuerySchema, kqlWithFiltersSchema } from '@kbn/slo-schema'; import React, { memo } from 'react'; import styled from 'styled-components'; import { observabilityAppId } from '@kbn/observability-shared-plugin/common'; -import { useCreateDataView } from '../../../../hooks/use_create_data_view'; import { SearchBarProps } from './query_builder'; import { useKibana } from '../../../../utils/kibana_react'; import { CreateSLOForm } from '../../types'; @@ -23,7 +22,7 @@ export const QuerySearchBar = memo( isFlyoutOpen, name, label, - indexPatternString, + dataView, required, tooltip, dataTestSubj, @@ -36,9 +35,6 @@ export const QuerySearchBar = memo( setRange: (range: TimeRange) => void; }) => { const { SearchBar } = useKibana().services.unifiedSearch.ui; - const { dataView } = useCreateDataView({ - indexPatternString, - }); const { control } = useFormContext(); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/runtime_field_used.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/runtime_field_used.tsx new file mode 100644 index 00000000000000..a937a1577e0df4 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/common/runtime_field_used.tsx @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; + +import { FieldPath } from 'react-hook-form'; +import { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { useRunTimeFieldBeingUsed } from '../../hooks/use_find_runtime_usage'; +import { CreateSLOForm } from '../../types'; + +export function RunTimeFieldUsed({ + dataView, + name, +}: { + dataView?: DataView; + name: FieldPath; +}) { + const fieldNames = useRunTimeFieldBeingUsed(name, dataView); + + if (fieldNames.length === 0) { + return null; + } + + return ( + <> + + +

    + {fieldNames.join(', ')}, + }} + /> +

    +
    + + ); +} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx index fe023cd8595490..526c955f2c6d83 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/index_selection.tsx @@ -8,103 +8,114 @@ import { EuiFormRow } from '@elastic/eui'; import { DataView } from '@kbn/data-views-plugin/public'; import { i18n } from '@kbn/i18n'; -import React, { useEffect, useState } from 'react'; +import React, { useEffect } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; import { DataViewPicker } from '@kbn/unified-search-plugin/public'; -import { useFetchDataViews } from '@kbn/observability-plugin/public'; +import { getDataViewPattern, useAdhocDataViews } from './use_adhoc_data_views'; +import { SloPublicPluginsStart } from '../../../..'; import { useKibana } from '../../../../utils/kibana_react'; import { CreateSLOForm } from '../../types'; -export function IndexSelection() { - const { control, getFieldState, setValue, watch } = useFormContext(); - const { dataViews: dataViewsService } = useKibana().services; +export const DATA_VIEW_FIELD = 'indicator.params.dataViewId'; +const INDEX_FIELD = 'indicator.params.index'; +const TIMESTAMP_FIELD = 'indicator.params.timestampField'; - const { isLoading: isDataViewsLoading, data: dataViews = [], refetch } = useFetchDataViews(); +export function IndexSelection({ selectedDataView }: { selectedDataView?: DataView }) { + const { control, getFieldState, setValue, watch } = useFormContext(); + const { dataViews: dataViewsService, dataViewFieldEditor } = useKibana().services; - const { dataViewEditor } = useKibana().services; + const { dataViewEditor } = useKibana().services; - const [adHocDataViews, setAdHocDataViews] = useState([]); + const currentIndexPattern = watch(INDEX_FIELD); + const currentDataViewId = watch(DATA_VIEW_FIELD); - const currentIndexPattern = watch('indicator.params.index'); + const { dataViewsList, isDataViewsLoading, adHocDataViews, setAdHocDataViews, refetch } = + useAdhocDataViews({ + currentIndexPattern, + }); useEffect(() => { - if (!isDataViewsLoading) { - const missingAdHocDataView = - dataViews.find((dataView) => dataView.title === currentIndexPattern) || - adHocDataViews.find((dataView) => dataView.getIndexPattern() === currentIndexPattern); - - 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(); - } + const indPatternId = getDataViewPattern({ + byPatten: currentIndexPattern, + dataViewsList, + adHocDataViews, + }); + if (!currentDataViewId && currentIndexPattern && !isDataViewsLoading && indPatternId) { + setValue(DATA_VIEW_FIELD, indPatternId); } - }, [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) - ); - }; + }, [ + adHocDataViews, + currentDataViewId, + currentIndexPattern, + dataViewsList, + isDataViewsLoading, + setValue, + ]); return ( - + ( { - field.onChange(getDataViewPatternById(newId)); + setValue( + INDEX_FIELD, + getDataViewPattern({ byId: newId, adHocDataViews, dataViewsList })! + ); + field.onChange(newId); dataViewsService.get(newId).then((dataView) => { if (dataView.timeFieldName) { - setValue('indicator.params.timestampField', dataView.timeFieldName); + setValue(TIMESTAMP_FIELD, dataView.timeFieldName); } }); }} - currentDataViewId={getDataViewIdByIndexPattern(field.value)?.id} + onAddField={ + currentDataViewId && selectedDataView + ? () => { + dataViewFieldEditor.openEditor({ + ctx: { + dataView: selectedDataView, + }, + onSave: () => {}, + }); + } + : undefined + } + currentDataViewId={ + field.value ?? + getDataViewPattern({ + byPatten: currentIndexPattern, + dataViewsList, + adHocDataViews, + }) + } onDataViewCreated={() => { dataViewEditor.openEditor({ allowAdHocDataView: true, onSave: (dataView: DataView) => { if (!dataView.isPersisted()) { setAdHocDataViews([...adHocDataViews, dataView]); - field.onChange(dataView.getIndexPattern()); + field.onChange(dataView.id); + setValue(INDEX_FIELD, dataView.getIndexPattern()); } else { refetch(); - field.onChange(dataView.getIndexPattern()); + field.onChange(dataView.id); + setValue(INDEX_FIELD, dataView.getIndexPattern()); } if (dataView.timeFieldName) { - setValue('indicator.params.timestampField', dataView.timeFieldName); + setValue(TIMESTAMP_FIELD, dataView.timeFieldName); } }, }); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/use_adhoc_data_views.ts b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/use_adhoc_data_views.ts new file mode 100644 index 00000000000000..6c8288df6b9d98 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_common/use_adhoc_data_views.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useEffect, useState } from 'react'; +import { DataView, DataViewListItem } from '@kbn/data-views-plugin/common'; +import { useFetchDataViews } from '@kbn/observability-plugin/public'; +import { useKibana } from '../../../../utils/kibana_react'; + +export const getDataViewPattern = ({ + byId, + byPatten, + dataViewsList, + adHocDataViews, +}: { + byId?: string; + byPatten?: string; + dataViewsList: DataViewListItem[]; + adHocDataViews: DataView[]; +}) => { + const allDataViews = [ + ...(dataViewsList ?? []), + ...adHocDataViews.map((dv) => ({ id: dv.id, title: dv.getIndexPattern() })), + ]; + if (byId) { + return allDataViews.find((dv) => dv.id === byId)?.title; + } + if (byPatten) { + return allDataViews.find((dv) => dv.title === byPatten)?.id; + } +}; + +export const useAdhocDataViews = ({ currentIndexPattern }: { currentIndexPattern: string }) => { + const { isLoading: isDataViewsLoading, data: dataViewsList = [], refetch } = useFetchDataViews(); + const { dataViews: dataViewsService } = useKibana().services; + const [adHocDataViews, setAdHocDataViews] = useState([]); + + useEffect(() => { + if (!isDataViewsLoading) { + const missingDataView = getDataViewPattern({ + byPatten: currentIndexPattern, + dataViewsList, + adHocDataViews, + }); + + if (!missingDataView && 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, dataViewsList, dataViewsService, isDataViewsLoading]); + + return { + adHocDataViews, + setAdHocDataViews, + dataViewsList, + isDataViewsLoading, + refetch, + }; +}; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx index b1dc9da27762f8..43f06480840868 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_kql/custom_kql_indicator_type_form.tsx @@ -15,14 +15,16 @@ import { CreateSLOForm } from '../../types'; import { DataPreviewChart } from '../common/data_preview_chart'; import { IndexFieldSelector } from '../common/index_field_selector'; import { QueryBuilder } from '../common/query_builder'; -import { IndexSelection } from '../custom_common/index_selection'; +import { DATA_VIEW_FIELD, IndexSelection } from '../custom_common/index_selection'; export function CustomKqlIndicatorTypeForm() { const { watch } = useFormContext(); const index = watch('indicator.params.index'); + const dataViewId = watch(DATA_VIEW_FIELD); const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ indexPatternString: index, + dataViewId, }); const timestampFields = dataView?.fields?.filter((field) => field.type === 'date') ?? []; @@ -30,7 +32,7 @@ export function CustomKqlIndicatorTypeForm() { - + (); const index = watch('indicator.params.index'); + const dataViewId = watch(DATA_VIEW_FIELD); const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ indexPatternString: index, + dataViewId, }); const timestampFields = dataView?.fields.filter((field) => field.type === 'date'); @@ -79,7 +81,7 @@ export function CustomMetricIndicatorTypeForm() { @@ -141,6 +144,7 @@ export function CustomMetricIndicatorTypeForm() { type="total" metricFields={metricFields ?? []} isLoadingIndex={isIndexFieldsLoading} + dataView={dataView} />
    diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx index de19f2f5146c9e..03939dce314b6c 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/custom_metric/metric_indicator.tsx @@ -13,10 +13,11 @@ import { EuiFlexGroup, EuiFlexItem, EuiFormRow, + EuiHorizontalRule, EuiIconTip, EuiSpacer, } from '@elastic/eui'; -import { FieldSpec } from '@kbn/data-views-plugin/common'; +import { DataView, FieldSpec } from '@kbn/data-views-plugin/common'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { first, range, xor } from 'lodash'; @@ -34,6 +35,7 @@ interface MetricIndicatorProps { type: 'good' | 'total'; metricFields: FieldSpec[]; isLoadingIndex: boolean; + dataView?: DataView; } export const NEW_CUSTOM_METRIC = { name: 'A', aggregation: 'sum' as const, field: '' }; @@ -82,7 +84,12 @@ const equationTooltip = ( /> ); -export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIndicatorProps) { +export function MetricIndicator({ + type, + metricFields, + isLoadingIndex, + dataView, +}: MetricIndicatorProps) { const { control, watch, setValue, register, getFieldState } = useFormContext(); const [options, setOptions] = useState(createOptionsFromFields(metricFields)); const [aggregationOptions, setAggregationOptions] = useState(CUSTOM_METRIC_AGGREGATION_OPTIONS); @@ -125,96 +132,29 @@ export function MetricIndicator({ type, metricFields, isLoadingIndex }: MetricIn return ( <> - {fields?.map((metric, index) => ( - - - - - {i18n.translate('xpack.slo.sloEdit.customMetric.aggregationLabel', { - defaultMessage: 'Aggregation', - })}{' '} - {metric.name} - - } - > - ( - { - if (selected.length) { - return field.onChange(selected[0].value); - } - field.onChange(''); - }} - selectedOptions={ - !!indexPattern && - !!field.value && - CUSTOM_METRIC_AGGREGATION_OPTIONS.some((agg) => agg.value === field.value) - ? [ - { - value: field.value, - label: aggValueToLabel(field.value), - }, - ] - : [] - } - onSearchChange={(searchValue: string) => { - setAggregationOptions( - CUSTOM_METRIC_AGGREGATION_OPTIONS.filter(({ value }) => - value.includes(searchValue) - ) - ); - }} - options={aggregationOptions} - /> - )} - /> - - - {watch(`indicator.params.${type}.metrics.${index}.aggregation`) !== 'doc_count' && ( + {fields?.map((metric, index, arr) => ( +
    + + - {metricLabel} {metric.name} {metricTooltip} + {i18n.translate('xpack.slo.sloEdit.customMetric.aggregationLabel', { + defaultMessage: 'Aggregation', + })}{' '} + {metric.name} } > ( metricField.name === field.value) + CUSTOM_METRIC_AGGREGATION_OPTIONS.some((agg) => agg.value === field.value) ? [ { value: field.value, - label: field.value, + label: aggValueToLabel(field.value), }, ] : [] } onSearchChange={(searchValue: string) => { - setOptions( - createOptionsFromFields(metricFields, ({ value }) => + setAggregationOptions( + CUSTOM_METRIC_AGGREGATION_OPTIONS.filter(({ value }) => value.includes(searchValue) ) ); }} - options={options} + options={aggregationOptions} /> )} /> - )} - - - } - /> - - - - - + {watch(`indicator.params.${type}.metrics.${index}.aggregation`) !== 'doc_count' && ( + + + {metricLabel} {metric.name} {metricTooltip} + + } + > + ( + { + if (selected.length) { + return field.onChange(selected[0].value); + } + field.onChange(''); + }} + selectedOptions={ + !!indexPattern && + !!field.value && + metricFields.some((metricField) => metricField.name === field.value) + ? [ + { + value: field.value, + label: field.value, + }, + ] + : [] + } + onSearchChange={(searchValue: string) => { + setOptions( + createOptionsFromFields(metricFields, ({ value }) => + value.includes(searchValue) + ) + ); + }} + options={options} + /> + )} + /> + + + )} + + + + + + } + /> + {index !== arr.length - 1 && } +
    ))} diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/histogram/histogram_indicator.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/histogram/histogram_indicator.tsx index 3cbe4dcb798e47..009504e5e6979a 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/histogram/histogram_indicator.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/histogram/histogram_indicator.tsx @@ -15,7 +15,7 @@ import { EuiIconTip, EuiSpacer, } from '@elastic/eui'; -import { FieldSpec } from '@kbn/data-views-plugin/common'; +import { DataView, FieldSpec } from '@kbn/data-views-plugin/common'; import { i18n } from '@kbn/i18n'; import React, { Fragment, useEffect, useState } from 'react'; import { Controller, useFormContext } from 'react-hook-form'; @@ -27,6 +27,7 @@ interface HistogramIndicatorProps { type: 'good' | 'total'; histogramFields: FieldSpec[]; isLoadingIndex: boolean; + dataView?: DataView; } const AGGREGATIONS = { @@ -50,7 +51,7 @@ const aggregationTooltip = ( @@ -94,6 +95,7 @@ export function HistogramIndicator({ type, histogramFields, isLoadingIndex, + dataView, }: HistogramIndicatorProps) { const { control, watch, getFieldState } = useFormContext(); const [options, setOptions] = useState(createOptionsFromFields(histogramFields)); @@ -282,7 +284,7 @@ export function HistogramIndicator({ (); const index = watch('indicator.params.index'); + const dataViewId = watch(DATA_VIEW_FIELD); const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ indexPatternString: index, + dataViewId, }); const histogramFields = dataView?.fields.filter((field) => field.type === 'histogram'); @@ -73,7 +75,7 @@ export function HistogramIndicatorTypeForm() { >(); + const dataViewId = watch(DATA_VIEW_FIELD); const [monitorIds = [], projects = [], tags = [], index, globalFilters] = watch([ 'indicator.params.monitorIds', @@ -34,6 +37,11 @@ export function SyntheticsAvailabilityIndicatorTypeForm() { 'indicator.params.filter', ]); + const { dataView } = useCreateDataView({ + indexPatternString: index, + dataViewId, + }); + const [range, _] = useState({ from: moment().subtract(1, 'day').toDate(), to: new Date(), @@ -112,7 +120,7 @@ export function SyntheticsAvailabilityIndicatorTypeForm() { ); -export function MetricIndicator({ indexFields, isLoadingIndex }: MetricIndicatorProps) { +export function MetricIndicator({ indexFields, isLoadingIndex, dataView }: MetricIndicatorProps) { const { control, watch, setValue, register, getFieldState } = useFormContext(); const { fields, append, remove } = useFieldArray({ @@ -112,7 +115,7 @@ export function MetricIndicator({ indexFields, isLoadingIndex }: MetricIndicator return ( <> - {fields?.map((metric, index) => ( + {fields?.map((metric, index, arr) => ( @@ -140,7 +143,29 @@ export function MetricIndicator({ indexFields, isLoadingIndex }: MetricIndicator /> - + + } + /> + {index !== arr.length - 1 && } ))} @@ -288,3 +313,7 @@ export function MetricIndicator({ indexFields, isLoadingIndex }: MetricIndicator ); } + +const filterLabel = i18n.translate('xpack.slo.sloEdit.sliType.timesliceMetric.filterLabel', { + defaultMessage: 'Filter', +}); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/metric_input.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/metric_input.tsx index f4cb60d81daf27..ebb539b97dab2b 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/metric_input.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/metric_input.tsx @@ -19,7 +19,6 @@ import { Controller, useFormContext } from 'react-hook-form'; import { AGGREGATION_OPTIONS, aggValueToLabel } from '../../helpers/aggregation_options'; import { createOptionsFromFields, Option } from '../../helpers/create_options'; import { CreateSLOForm } from '../../types'; -import { QueryBuilder } from '../common/query_builder'; const fieldLabel = i18n.translate('xpack.slo.sloEdit.sliType.timesliceMetric.fieldLabel', { defaultMessage: 'Field', @@ -30,10 +29,6 @@ const aggregationLabel = i18n.translate( { defaultMessage: 'Aggregation' } ); -const filterLabel = i18n.translate('xpack.slo.sloEdit.sliType.timesliceMetric.filterLabel', { - defaultMessage: 'Filter', -}); - const fieldTooltip = (
    )} - - - } - /> - ); } diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx index 8bb748ea075c7a..82736e4e24a251 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/components/timeslice_metric/timeslice_metric_indicator.tsx @@ -24,7 +24,7 @@ import { CreateSLOForm } from '../../types'; import { DataPreviewChart } from '../common/data_preview_chart'; import { IndexFieldSelector } from '../common/index_field_selector'; import { QueryBuilder } from '../common/query_builder'; -import { IndexSelection } from '../custom_common/index_selection'; +import { DATA_VIEW_FIELD, IndexSelection } from '../custom_common/index_selection'; import { MetricIndicator } from './metric_indicator'; import { COMPARATOR_MAPPING } from '../../constants'; import { useCreateDataView } from '../../../../hooks/use_create_data_view'; @@ -34,9 +34,11 @@ export { NEW_TIMESLICE_METRIC } from './metric_indicator'; export function TimesliceMetricIndicatorTypeForm() { const { watch } = useFormContext(); const index = watch('indicator.params.index'); + const dataViewId = watch(DATA_VIEW_FIELD); const { dataView, loading: isIndexFieldsLoading } = useCreateDataView({ indexPatternString: index, + dataViewId, }); const timestampFields = dataView?.fields.filter((field) => field.type === 'date'); @@ -78,7 +80,7 @@ export function TimesliceMetricIndicatorTypeForm() { diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/hooks/use_find_runtime_usage.ts b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/hooks/use_find_runtime_usage.ts new file mode 100644 index 00000000000000..c7406a5dcd8639 --- /dev/null +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/hooks/use_find_runtime_usage.ts @@ -0,0 +1,50 @@ +/* + * Copyright 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 { DataView } from '@kbn/data-views-plugin/common'; +import { QuerySchema, querySchema } from '@kbn/slo-schema'; +import { FieldPath, useFormContext } from 'react-hook-form'; +import { CreateSLOForm } from '../types'; +const isFieldBeingUsed = (fieldName: string, query?: QuerySchema) => { + if (!query) { + return false; + } + const checkKql = (kql: string) => { + const queryStr = kql.replace(/\s{2,}/g, ' ').trim(); + return queryStr.includes(`${fieldName} :`) || queryStr.includes(`${fieldName}:`); + }; + if (typeof query === 'string') { + return checkKql(query); + } else { + const kql = query.kqlQuery; + const inKql = kql && checkKql(kql); + const inFilter = + query.filters && + query.filters.some((filter) => { + return filter.meta.field === fieldName || filter.meta.key === fieldName; + }); + return inKql || inFilter; + } +}; + +export const useRunTimeFieldBeingUsed = ( + name: FieldPath, + dataView?: DataView +): string[] => { + const { watch } = useFormContext(); + const value = watch(name); + + if (!dataView || !value) { + return []; + } + const runTimeMappings = dataView.getRuntimeMappings(); + const filter = querySchema.is(value) ? value : undefined; + const fieldNames = Object.keys(runTimeMappings).filter((key) => { + return isFieldBeingUsed(key, filter); + }); + return fieldNames ?? []; +}; diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx index 8925c22f820500..5f6916720902b0 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slo_edit/slo_edit.test.tsx @@ -21,6 +21,7 @@ import { useFetchApmSuggestions } from '../../hooks/use_fetch_apm_suggestions'; import { useFetchSloDetails } from '../../hooks/use_fetch_slo_details'; import { useUpdateSlo } from '../../hooks/use_update_slo'; import { useCreateRule, useFetchDataViews } from '@kbn/observability-plugin/public'; +import { useCreateDataView } from '../../hooks/use_create_data_view'; import { useFetchIndices } from '../../hooks/use_fetch_indices'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; @@ -36,6 +37,7 @@ jest.mock('react-router-dom', () => ({ jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../hooks/use_fetch_indices'); +jest.mock('../../hooks/use_create_data_view'); jest.mock('../../hooks/use_fetch_slo_details'); jest.mock('../../hooks/use_create_slo'); jest.mock('../../hooks/use_update_slo'); @@ -52,6 +54,7 @@ jest.mock('../../utils/kibana_react', () => ({ const useKibanaMock = useKibana as jest.Mock; const useFetchIndicesMock = useFetchIndices as jest.Mock; const useFetchDataViewsMock = useFetchDataViews as jest.Mock; +const useCreateDataViewsMock = useCreateDataView as jest.Mock; const useFetchSloMock = useFetchSloDetails as jest.Mock; const useCreateSloMock = useCreateSlo as jest.Mock; const useUpdateSloMock = useUpdateSlo as jest.Mock; @@ -90,6 +93,8 @@ const mockKibana = (license: ILicense | null = licenseMock) => { dataViews: { create: jest.fn().mockResolvedValue({ getIndexPattern: jest.fn().mockReturnValue('some-index'), + getRuntimeMappings: jest.fn().mockReturnValue({}), + id: 'some-data-view-id', }), }, docLinks: { @@ -156,8 +161,23 @@ describe('SLO Edit Page', () => { useFetchDataViewsMock.mockReturnValue({ isLoading: false, - data: [{ getName: () => 'dataview', getIndexPattern: () => '.dataview-index' }], + data: [ + { + getName: () => 'dataview', + getIndexPattern: () => '.dataview-index', + getRuntimeMappings: jest.fn().mockReturnValue({}), + }, + ], }); + + useCreateDataViewsMock.mockReturnValue({ + dataView: { + getName: () => 'dataview', + getIndexPattern: () => '.dataview-index', + getRuntimeMappings: jest.fn().mockReturnValue({}), + }, + }); + useFetchIndicesMock.mockReturnValue({ isLoading: false, data: ['some-index', 'index-2'], diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx index 007dd89382073b..1d6debec567b4a 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx @@ -27,6 +27,7 @@ import { useKibana } from '../../utils/kibana_react'; import { render } from '../../utils/test_helper'; import { SlosPage } from './slos'; import { useGetSettings } from '../slo_settings/use_get_settings'; +import { useCreateDataView } from '../../hooks/use_create_data_view'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -43,6 +44,7 @@ jest.mock('../../hooks/use_delete_slo'); jest.mock('../../hooks/use_delete_slo_instance'); jest.mock('../../hooks/use_fetch_historical_summary'); jest.mock('../../hooks/use_capabilities'); +jest.mock('../../hooks/use_create_data_view'); const useGetSettingsMock = useGetSettings as jest.Mock; const useKibanaMock = useKibana as jest.Mock; @@ -53,6 +55,7 @@ const useDeleteSloMock = useDeleteSlo as jest.Mock; const useDeleteSloInstanceMock = useDeleteSloInstance as jest.Mock; const useFetchHistoricalSummaryMock = useFetchHistoricalSummary as jest.Mock; const useCapabilitiesMock = useCapabilities as jest.Mock; +const useCreateDataViewMock = useCreateDataView as jest.Mock; const TagsListMock = TagsList as jest.Mock; TagsListMock.mockReturnValue(
    Tags list
    ); @@ -67,6 +70,7 @@ const mockDeleteInstance = jest.fn(); useCreateSloMock.mockReturnValue({ mutate: mockCreateSlo }); useDeleteSloMock.mockReturnValue({ mutateAsync: mockDeleteSlo }); useDeleteSloInstanceMock.mockReturnValue({ mutateAsync: mockDeleteInstance }); +useCreateDataViewMock.mockReturnValue({}); const mockNavigate = jest.fn(); const mockAddSuccess = jest.fn(); diff --git a/x-pack/plugins/observability_solution/slo/server/plugin.ts b/x-pack/plugins/observability_solution/slo/server/plugin.ts index 7c3dd521a5d527..9c701a34774858 100644 --- a/x-pack/plugins/observability_solution/slo/server/plugin.ts +++ b/x-pack/plugins/observability_solution/slo/server/plugin.ts @@ -25,6 +25,7 @@ import { TaskManagerSetupContract, TaskManagerStartContract, } from '@kbn/task-manager-plugin/server'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { CloudSetup } from '@kbn/cloud-plugin/server'; import { SharePluginSetup } from '@kbn/share-plugin/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; @@ -60,6 +61,7 @@ export interface PluginStart { taskManager: TaskManagerStartContract; spaces?: SpacesPluginStart; ruleRegistry: RuleRegistryPluginStartContract; + dataViews: DataViewsServerPluginStart; } const sloRuleTypes = [SLO_BURN_RATE_RULE_TYPE_ID]; @@ -148,6 +150,10 @@ export class SloPlugin implements Plugin { ...plugins, core, }, + getDataViewsStart: async () => { + const [, pluginStart] = await core.getStartServices(); + return pluginStart.dataViews; + }, getSpacesStart: async () => { const [, pluginStart] = await core.getStartServices(); return pluginStart.spaces; diff --git a/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts b/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts index e74b5abb811b98..8ddabede0d190d 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/register_routes.ts @@ -21,6 +21,7 @@ import { import { SpacesPluginStart } from '@kbn/spaces-plugin/server'; import axios from 'axios'; import * as t from 'io-ts'; +import { DataViewsServerPluginStart } from '@kbn/data-views-plugin/server'; import { SloConfig } from '..'; import { getHTTPResponseCode, ObservabilityError } from '../errors'; import { SloRequestHandlerContext } from '../types'; @@ -43,6 +44,7 @@ export interface RegisterRoutesDependencies { ruleDataService: RuleDataPluginService; getRulesClientWithRequest: (request: KibanaRequest) => Promise; getRacClientWithRequest: (request: KibanaRequest) => Promise; + getDataViewsStart: () => Promise; } export function registerRoutes({ config, repository, core, logger, dependencies }: RegisterRoutes) { diff --git a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts index 61c081b087e157..f5075abac0c0a1 100644 --- a/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts +++ b/x-pack/plugins/observability_solution/slo/server/routes/slo/route.ts @@ -101,17 +101,21 @@ const createSLORoute = createSloServerRoute({ await assertPlatinumLicense(context); const spaces = await dependencies.getSpacesStart(); + const dataViews = await dependencies.getDataViewsStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; const esClient = (await context.core).elasticsearch.client.asCurrentUser; const basePath = dependencies.pluginsSetup.core.http.basePath; const soClient = (await context.core).savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient, logger); + + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -146,16 +150,19 @@ const inspectSLORoute = createSloServerRoute({ await assertPlatinumLicense(context); const spaces = await dependencies.getSpacesStart(); + const dataViews = await dependencies.getDataViewsStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; const basePath = dependencies.pluginsSetup.core.http.basePath; const esClient = (await context.core).elasticsearch.client.asCurrentUser; const soClient = (await context.core).savedObjects.client; const repository = new KibanaSavedObjectsSLORepository(soClient, logger); + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -189,17 +196,19 @@ const updateSLORoute = createSloServerRoute({ const spaces = await dependencies.getSpacesStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; + const dataViews = await dependencies.getDataViewsStart(); const basePath = dependencies.pluginsSetup.core.http.basePath; const esClient = (await context.core).elasticsearch.client.asCurrentUser; const soClient = (await context.core).savedObjects.client; - + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -235,17 +244,21 @@ const deleteSLORoute = createSloServerRoute({ const spaces = await dependencies.getSpacesStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; + const dataViews = await dependencies.getDataViewsStart(); const esClient = (await context.core).elasticsearch.client.asCurrentUser; const soClient = (await context.core).savedObjects.client; const rulesClient = await dependencies.getRulesClientWithRequest(request); + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); + const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( @@ -302,16 +315,18 @@ const enableSLORoute = createSloServerRoute({ const spaces = await dependencies.getSpacesStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; + const dataViews = await dependencies.getDataViewsStart(); const soClient = (await context.core).savedObjects.client; const esClient = (await context.core).elasticsearch.client.asCurrentUser; - + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -339,16 +354,18 @@ const disableSLORoute = createSloServerRoute({ const spaces = await dependencies.getSpacesStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; + const dataViews = await dependencies.getDataViewsStart(); const soClient = (await context.core).savedObjects.client; const esClient = (await context.core).elasticsearch.client.asCurrentUser; - + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -375,17 +392,20 @@ const resetSLORoute = createSloServerRoute({ await assertPlatinumLicense(context); const spaces = await dependencies.getSpacesStart(); + const dataViews = await dependencies.getDataViewsStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; const soClient = (await context.core).savedObjects.client; const esClient = (await context.core).elasticsearch.client.asCurrentUser; const basePath = dependencies.pluginsSetup.core.http.basePath; + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); const repository = new KibanaSavedObjectsSLORepository(soClient, logger); const transformManager = new DefaultTransformManager( transformGenerators, esClient, logger, - spaceId + spaceId, + dataViewsService ); const summaryTransformManager = new DefaultSummaryTransformManager( new DefaultSummaryTransformGenerator(), @@ -629,9 +649,12 @@ const getPreviewData = createSloServerRoute({ const spaces = await dependencies.getSpacesStart(); const spaceId = (await spaces?.spacesService?.getActiveSpace(request))?.id ?? 'default'; + const dataViews = await dependencies.getDataViewsStart(); const esClient = (await context.core).elasticsearch.client.asCurrentUser; - const service = new GetPreviewData(esClient, spaceId); + const soClient = (await context.core).savedObjects.client; + const dataViewsService = await dataViews.dataViewsServiceFactory(soClient, esClient); + const service = new GetPreviewData(esClient, spaceId, dataViewsService); return await service.execute(params.body); }, }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/update_slo.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/update_slo.test.ts.snap deleted file mode 100644 index c1f0099d243430..00000000000000 --- a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/update_slo.test.ts.snap +++ /dev/null @@ -1,88 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`UpdateSLO when error happens during the update restores the previous SLO definition in the repository 1`] = ` -[MockFunction] { - "calls": Array [ - Array [ - "slo-summary-original-id-2", - ], - ], - "results": Array [ - Object { - "type": "return", - "value": undefined, - }, - ], -} -`; - -exports[`UpdateSLO when error happens during the update restores the previous SLO definition in the repository 2`] = ` -[MockFunction] { - "calls": Array [ - Array [ - "slo-summary-original-id-2", - ], - ], - "results": Array [ - Object { - "type": "return", - "value": undefined, - }, - ], -} -`; - -exports[`UpdateSLO when error happens during the update restores the previous SLO definition in the repository 3`] = ` -[MockFunction] { - "calls": Array [ - Array [ - "slo-original-id-2", - ], - ], - "results": Array [ - Object { - "type": "return", - "value": undefined, - }, - ], -} -`; - -exports[`UpdateSLO when error happens during the update restores the previous SLO definition in the repository 4`] = ` -[MockFunction] { - "calls": Array [ - Array [ - "slo-original-id-2", - ], - ], - "results": Array [ - Object { - "type": "return", - "value": undefined, - }, - ], -} -`; - -exports[`UpdateSLO when error happens during the update restores the previous SLO definition in the repository 5`] = ` -[MockFunction] { - "calls": Array [ - Array [ - Object { - "id": ".slo-observability.summary.pipeline-original-id-2", - }, - Object { - "ignore": Array [ - 404, - ], - }, - ], - ], - "results": Array [ - Object { - "type": "return", - "value": Promise {}, - }, - ], -} -`; diff --git a/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts index cefff32016e2b9..7b45b321f40571 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/create_slo.test.ts @@ -24,8 +24,8 @@ import { SLORepository } from './slo_repository'; import { TransformManager } from './transform_manager'; describe('CreateSLO', () => { - let esClientMock: ElasticsearchClientMock; - let loggerMock: jest.Mocked; + let mockEsClient: ElasticsearchClientMock; + let mockLogger: jest.Mocked; let mockRepository: jest.Mocked; let mockTransformManager: jest.Mocked; let mockSummaryTransformManager: jest.Mocked; @@ -34,17 +34,17 @@ describe('CreateSLO', () => { jest.useFakeTimers().setSystemTime(new Date('2024-01-01')); beforeEach(() => { - esClientMock = elasticsearchServiceMock.createElasticsearchClient(); - loggerMock = loggingSystemMock.createLogger(); + mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); + mockLogger = loggingSystemMock.createLogger(); mockRepository = createSLORepositoryMock(); mockTransformManager = createTransformManagerMock(); mockSummaryTransformManager = createSummaryTransformManagerMock(); createSLO = new CreateSLO( - esClientMock, + mockEsClient, mockRepository, mockTransformManager, mockSummaryTransformManager, - loggerMock, + mockLogger, 'some-space', httpServiceMock.createStartContract().basePath ); @@ -82,10 +82,10 @@ describe('CreateSLO', () => { expect(mockTransformManager.install).toHaveBeenCalled(); expect(mockTransformManager.start).toHaveBeenCalled(); - expect(esClientMock.ingest.putPipeline.mock.calls[0]).toMatchSnapshot(); + expect(mockEsClient.ingest.putPipeline.mock.calls[0]).toMatchSnapshot(); expect(mockSummaryTransformManager.install).toHaveBeenCalled(); expect(mockSummaryTransformManager.start).toHaveBeenCalled(); - expect(esClientMock.index.mock.calls[0]).toMatchSnapshot(); + expect(mockEsClient.index.mock.calls[0]).toMatchSnapshot(); expect(response).toEqual(expect.objectContaining({ id: 'unique-id' })); }); @@ -156,7 +156,7 @@ describe('CreateSLO', () => { }); describe('unhappy path', () => { - it('rollbacks new resources on failure', async () => { + it('rollbacks completed operations when rollup transform install fails', async () => { mockTransformManager.install.mockRejectedValue(new Error('Rollup transform install error')); const sloParams = createSLOParams({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -164,12 +164,48 @@ describe('CreateSLO', () => { 'Rollup transform install error' ); - expect(mockSummaryTransformManager.stop).toHaveBeenCalled(); - expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); + expect(mockRepository.deleteById).toHaveBeenCalled(); + + expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); + expect(mockSummaryTransformManager.uninstall).not.toHaveBeenCalled(); + expect(mockTransformManager.stop).not.toHaveBeenCalled(); + expect(mockTransformManager.uninstall).not.toHaveBeenCalled(); + expect(mockEsClient.ingest.deletePipeline).not.toHaveBeenCalled(); + }); + + it('rollbacks completed operations when summary transform start fails', async () => { + mockSummaryTransformManager.start.mockRejectedValue( + new Error('Summary transform install error') + ); + const sloParams = createSLOParams({ indicator: createAPMTransactionErrorRateIndicator() }); + + await expect(createSLO.execute(sloParams)).rejects.toThrowError( + 'Summary transform install error' + ); + + expect(mockRepository.deleteById).toHaveBeenCalled(); expect(mockTransformManager.stop).toHaveBeenCalled(); expect(mockTransformManager.uninstall).toHaveBeenCalled(); - expect(esClientMock.ingest.deletePipeline).toHaveBeenCalled(); + expect(mockEsClient.ingest.deletePipeline).toHaveBeenCalled(); + expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); + + expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); + }); + + it('rollbacks completed operations when create temporary document fails', async () => { + mockEsClient.index.mockRejectedValue(new Error('temporary document index failed')); + const sloParams = createSLOParams({ indicator: createAPMTransactionErrorRateIndicator() }); + + await expect(createSLO.execute(sloParams)).rejects.toThrowError( + 'temporary document index failed' + ); + expect(mockRepository.deleteById).toHaveBeenCalled(); + expect(mockTransformManager.stop).toHaveBeenCalled(); + expect(mockTransformManager.uninstall).toHaveBeenCalled(); + expect(mockEsClient.ingest.deletePipeline).toHaveBeenCalled(); + expect(mockSummaryTransformManager.stop).toHaveBeenCalled(); + expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); }); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts index 60a5da93d9bf7d..cb5b59bb3cf1ee 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/create_slo.ts @@ -8,8 +8,8 @@ import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ElasticsearchClient, IBasePath, Logger } from '@kbn/core/server'; import { ALL_VALUE, CreateSLOParams, CreateSLOResponse } from '@kbn/slo-schema'; +import { asyncForEach } from '@kbn/std'; import { v4 as uuidv4 } from 'uuid'; -import { getTransformQueryComposite } from './utils/get_transform_compite_query'; import { getSLOSummaryPipelineId, getSLOSummaryTransformId, @@ -24,6 +24,7 @@ import { retryTransientEsErrors } from '../utils/retry'; import { SLORepository } from './slo_repository'; import { createTempSummaryDocument } from './summary_transform_generator/helpers/create_temp_summary'; import { TransformManager } from './transform_manager'; +import { getTransformQueryComposite } from './utils/get_transform_compite_query'; export class CreateSLO { constructor( @@ -40,13 +41,20 @@ export class CreateSLO { const slo = this.toSLO(params); validateSLO(slo); + const rollbackOperations = []; + await this.repository.save(slo, { throwOnConflict: true }); + rollbackOperations.push(() => this.repository.deleteById(slo.id)); const rollupTransformId = getSLOTransformId(slo.id, slo.revision); const summaryTransformId = getSLOSummaryTransformId(slo.id, slo.revision); try { await this.transformManager.install(slo); + rollbackOperations.push(() => this.transformManager.uninstall(rollupTransformId)); + await this.transformManager.start(rollupTransformId); + rollbackOperations.push(() => this.transformManager.stop(rollupTransformId)); + await retryTransientEsErrors( () => this.esClient.ingest.putPipeline( @@ -54,9 +62,18 @@ export class CreateSLO { ), { logger: this.logger } ); + rollbackOperations.push(() => + this.esClient.ingest.deletePipeline( + { id: getSLOSummaryPipelineId(slo.id, slo.revision) }, + { ignore: [404] } + ) + ); await this.summaryTransformManager.install(slo); + rollbackOperations.push(() => this.summaryTransformManager.uninstall(summaryTransformId)); + await this.summaryTransformManager.start(summaryTransformId); + rollbackOperations.push(() => this.summaryTransformManager.stop(summaryTransformId)); await retryTransientEsErrors( () => @@ -73,15 +90,13 @@ export class CreateSLO { `Cannot install the SLO [id: ${slo.id}, revision: ${slo.revision}]. Rolling back.` ); - await this.summaryTransformManager.stop(summaryTransformId); - await this.summaryTransformManager.uninstall(summaryTransformId); - await this.transformManager.stop(rollupTransformId); - await this.transformManager.uninstall(rollupTransformId); - await this.esClient.ingest.deletePipeline( - { id: getSLOSummaryPipelineId(slo.id, slo.revision) }, - { ignore: [404] } - ); - await this.repository.deleteById(slo.id); + await asyncForEach(rollbackOperations.reverse(), async (operation) => { + try { + await operation(); + } catch (rollbackErr) { + this.logger.error('Rollback operation failed', rollbackErr); + } + }); throw err; } @@ -89,7 +104,7 @@ export class CreateSLO { return this.toResponse(slo); } - public inspect(params: CreateSLOParams): { + public async inspect(params: CreateSLOParams): Promise<{ slo: CreateSLOParams; pipeline: Record; rollUpTransform: TransformPutTransformRequest; @@ -97,13 +112,13 @@ export class CreateSLO { temporaryDoc: Record; rollUpTransformCompositeQuery: string; summaryTransformCompositeQuery: string; - } { + }> { const slo = this.toSLO(params); validateSLO(slo); - const rollUpTransform = this.transformManager.inspect(slo); + const rollUpTransform = await this.transformManager.inspect(slo); const pipeline = getSLOSummaryPipelineTemplate(slo, this.spaceId, this.basePath); - const summaryTransform = this.summaryTransformManager.inspect(slo); + const summaryTransform = await this.summaryTransformManager.inspect(slo); const temporaryDoc = createTempSummaryDocument(slo, this.spaceId, this.basePath); return { diff --git a/x-pack/plugins/observability_solution/slo/server/services/get_preview_data.ts b/x-pack/plugins/observability_solution/slo/server/services/get_preview_data.ts index 06d740aca3508d..a18c4d035a0961 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/get_preview_data.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/get_preview_data.ts @@ -21,6 +21,7 @@ import { assertNever } from '@kbn/std'; import moment from 'moment'; import { ElasticsearchClient } from '@kbn/core/server'; import { estypes } from '@elastic/elasticsearch'; +import { DataView, DataViewsService } from '@kbn/data-views-plugin/common'; import { getElasticsearchQueryOrThrow } from './transform_generators'; import { buildParamValues } from './transform_generators/synthetics_availability'; @@ -46,7 +47,23 @@ interface Options { groupings?: Record; } export class GetPreviewData { - constructor(private esClient: ElasticsearchClient, private spaceId: string) {} + constructor( + private esClient: ElasticsearchClient, + private spaceId: string, + private dataViewService: DataViewsService + ) {} + + public async buildRuntimeMappings({ dataViewId }: { dataViewId?: string }) { + let dataView: DataView | undefined; + if (dataViewId) { + try { + dataView = await this.dataViewService.get(dataViewId); + } catch (e) { + // If the data view is not found, we will continue without it + } + } + return dataView?.getRuntimeMappings?.() ?? {}; + } private async getAPMTransactionDurationPreviewData( indicator: APMTransactionDurationIndicator, @@ -81,6 +98,9 @@ export class GetPreviewData { const result = await typedSearch(this.esClient, { index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -177,6 +197,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -256,6 +279,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -321,6 +347,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -389,6 +418,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -440,6 +472,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { @@ -523,6 +558,9 @@ export class GetPreviewData { const result = await this.esClient.search({ index, + runtime_mappings: await this.buildRuntimeMappings({ + dataViewId: indicator.params.dataViewId, + }), size: 0, query: { bool: { diff --git a/x-pack/plugins/observability_solution/slo/server/services/summay_transform_manager.ts b/x-pack/plugins/observability_solution/slo/server/services/summay_transform_manager.ts index 27276f59330e88..5529591a81e204 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/summay_transform_manager.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/summay_transform_manager.ts @@ -23,7 +23,7 @@ export class DefaultSummaryTransformManager implements TransformManager { ) {} async install(slo: SLODefinition): Promise { - const transformParams = this.generator.generate(slo); + const transformParams = await this.generator.generate(slo); try { await retryTransientEsErrors(() => this.esClient.transform.putTransform(transformParams), { logger: this.logger, @@ -40,7 +40,7 @@ export class DefaultSummaryTransformManager implements TransformManager { return transformParams.transform_id; } - inspect(slo: SLODefinition): TransformPutTransformRequest { + async inspect(slo: SLODefinition): Promise { return this.generator.generate(slo); } diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts index 2ab6b264429673..b764b83ea93496 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.test.ts @@ -13,28 +13,30 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { ApmTransactionDurationTransformGenerator } from './apm_transaction_duration'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new ApmTransactionDurationTransformGenerator(); +const spaceId = 'custom-space'; describe('APM Transaction Duration Transform Generator', () => { - it('returns the expected transform params with every specified indicator params', () => { + it('returns the expected transform params with every specified indicator params', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createAPMTransactionDurationIndicator() }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); - it('returns the expected transform params for timeslices slo', () => { + it('returns the expected transform params for timeslices slo', async () => { const slo = createSLOWithTimeslicesBudgetingMethod({ id: 'irrelevant', indicator: createAPMTransactionDurationIndicator(), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); - it('returns the expected transform params for timeslices slo using a timesliceTarget = 0', () => { + it('returns the expected transform params for timeslices slo using a timesliceTarget = 0', async () => { const slo = createSLOWithTimeslicesBudgetingMethod({ id: 'irrelevant', indicator: createAPMTransactionDurationIndicator(), @@ -44,12 +46,12 @@ describe('APM Transaction Duration Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); - it("does not include the query filter when params are '*'", () => { + it("does not include the query filter when params are '*'", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ environment: ALL_VALUE, @@ -58,36 +60,36 @@ describe('APM Transaction Duration Transform Generator', () => { transactionType: ALL_VALUE, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); - it('uses the provided index params as source index', () => { + it('uses the provided index params as source index', async () => { const index = 'my-custom-apm-index*'; const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ index, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.index).toEqual(index); }); - it('adds the custom kql filter to the query', () => { + it('adds the custom kql filter to the query', async () => { const filter = `"my.field" : "value" and ("foo" >= 12 or "bar" <= 100)`; const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ filter, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); - it("groups by the 'service.name'", () => { + it("groups by the 'service.name'", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ service: 'my-service', @@ -97,13 +99,13 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'service.environment'", () => { + it("groups by the 'service.environment'", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ service: ALL_VALUE, @@ -113,13 +115,13 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'transaction.name'", () => { + it("groups by the 'transaction.name'", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ service: ALL_VALUE, @@ -129,13 +131,13 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'transaction.type'", () => { + it("groups by the 'transaction.type'", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator({ service: ALL_VALUE, @@ -145,13 +147,13 @@ describe('APM Transaction Duration Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createAPMTransactionDurationIndicator(), settings: { @@ -161,7 +163,7 @@ describe('APM Transaction Duration Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts index 6bbec476754cb7..afb37b4f0a1059 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_duration.ts @@ -13,6 +13,7 @@ import { apmTransactionDurationIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { getElasticsearchQueryOrThrow, TransformGenerator } from '.'; import { getSLOTransformId, @@ -26,7 +27,11 @@ import { parseIndex } from './common'; import { getTimesliceTargetComparator, getFilterRange } from './common'; export class ApmTransactionDurationTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!apmTransactionDurationIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -34,7 +39,7 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo, slo.indicator), @@ -70,7 +75,11 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator return this.buildCommonGroupBy(slo, '@timestamp', extraGroupByFields); } - private buildSource(slo: SLODefinition, indicator: APMTransactionDurationIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: APMTransactionDurationIndicator, + dataViewService: DataViewsService + ) { const queryFilter: estypes.QueryDslQueryContainer[] = [getFilterRange(slo, '@timestamp')]; if (indicator.params.service !== ALL_VALUE) { @@ -104,14 +113,18 @@ export class ApmTransactionDurationTransformGenerator extends TransformGenerator }, }); } + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.dataViewId, + }); if (!!indicator.params.filter) { - queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter)); + queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter, dataView)); } return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts index 5706521cdf2f68..13c73443960afe 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.test.ts @@ -13,8 +13,10 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { ApmTransactionErrorRateTransformGenerator } from './apm_transaction_error_rate'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new ApmTransactionErrorRateTransformGenerator(); +const spaceId = 'custom-space'; describe('APM Transaction Error Rate Transform Generator', () => { it('returns the expected transform params with every specified indicator params', async () => { @@ -22,7 +24,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { id: 'irrelevant', indicator: createAPMTransactionErrorRateIndicator(), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -32,7 +34,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { id: 'irrelevant', indicator: createAPMTransactionErrorRateIndicator(), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -47,7 +49,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -61,7 +63,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { transactionType: ALL_VALUE, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); @@ -73,7 +75,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { index, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.index).toEqual(index); }); @@ -85,12 +87,12 @@ describe('APM Transaction Error Rate Transform Generator', () => { filter, }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); - it("groups by the 'service.name'", () => { + it("groups by the 'service.name'", async () => { const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator({ service: 'my-service', @@ -100,13 +102,13 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'service.environment'", () => { + it("groups by the 'service.environment'", async () => { const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator({ service: ALL_VALUE, @@ -116,13 +118,13 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'transaction.name'", () => { + it("groups by the 'transaction.name'", async () => { const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator({ service: ALL_VALUE, @@ -132,13 +134,13 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("groups by the 'transaction.type'", () => { + it("groups by the 'transaction.type'", async () => { const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator({ service: ALL_VALUE, @@ -148,13 +150,13 @@ describe('APM Transaction Error Rate Transform Generator', () => { }), }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); expect(transform.pivot?.group_by).toMatchSnapshot(); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator(), settings: { @@ -164,7 +166,7 @@ describe('APM Transaction Error Rate Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts index 59b753711a0d89..863a31cfc508c8 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/apm_transaction_error_rate.ts @@ -12,6 +12,7 @@ import { timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; import { estypes } from '@elastic/elasticsearch'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { getElasticsearchQueryOrThrow, TransformGenerator } from '.'; import { getSLOTransformId, @@ -24,7 +25,11 @@ import { InvalidTransformError } from '../../errors'; import { parseIndex, getTimesliceTargetComparator, getFilterRange } from './common'; export class ApmTransactionErrorRateTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!apmTransactionErrorRateIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -32,7 +37,7 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo), @@ -68,7 +73,11 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato return this.buildCommonGroupBy(slo, '@timestamp', extraGroupByFields); } - private buildSource(slo: SLODefinition, indicator: APMTransactionErrorRateIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: APMTransactionErrorRateIndicator, + dataViewService: DataViewsService + ) { const queryFilter: estypes.QueryDslQueryContainer[] = [getFilterRange(slo, '@timestamp')]; if (indicator.params.service !== ALL_VALUE) { @@ -103,13 +112,18 @@ export class ApmTransactionErrorRateTransformGenerator extends TransformGenerato }); } + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.dataViewId, + }); + if (indicator.params.filter) { - queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter)); + queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter, dataView)); } return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/common.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/common.ts index 283bc375a0db0c..35a6e180650fab 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/common.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/common.ts @@ -8,17 +8,18 @@ import { buildEsQuery, fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query'; import { QuerySchema, kqlQuerySchema } from '@kbn/slo-schema'; import { Logger } from '@kbn/logging'; +import { DataView } from '@kbn/data-views-plugin/common'; import { SLODefinition } from '../../domain/models'; import { getDelayInSecondsFromSLO } from '../../domain/services/get_delay_in_seconds_from_slo'; import { InvalidTransformError } from '../../errors'; -export function getElasticsearchQueryOrThrow(kuery: QuerySchema = '') { +export function getElasticsearchQueryOrThrow(kuery: QuerySchema = '', dataView?: DataView) { try { if (kqlQuerySchema.is(kuery)) { return toElasticsearchQuery(fromKueryExpression(kuery)); } else { return buildEsQuery( - undefined, + dataView, { query: kuery?.kqlQuery, language: 'kuery', diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts index 2307956564ba3c..2de75b8f7d86cf 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.test.ts @@ -12,12 +12,14 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { HistogramTransformGenerator } from './histogram'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new HistogramTransformGenerator(); +const spaceId = 'custom-space'; describe('Histogram Transform Generator', () => { describe('validation', () => { - it('throws when the good filter is invalid', () => { + it('throws when the good filter is invalid', async () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ good: { @@ -29,10 +31,13 @@ describe('Histogram Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL: foo:/); + + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL: foo:/ + ); }); - it('throws when the total filter is invalid', () => { + it('throws when the total filter is invalid', async () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ good: { @@ -42,20 +47,25 @@ describe('Histogram Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL: foo:/); + + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL: foo:/ + ); }); - it('throws when the query_filter is invalid', () => { + it('throws when the query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ filter: '{ kql.query: invalid' }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL/ + ); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createHistogramIndicator() }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -65,7 +75,7 @@ describe('Histogram Transform Generator', () => { id: 'irrelevant', indicator: createHistogramIndicator(), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -80,7 +90,7 @@ describe('Histogram Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -89,7 +99,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); @@ -98,7 +108,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator({ index: 'my-own-index*' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.index).toBe('my-own-index*'); }); @@ -109,7 +119,7 @@ describe('Histogram Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -120,7 +130,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator(), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -137,7 +147,7 @@ describe('Histogram Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -146,7 +156,7 @@ describe('Histogram Transform Generator', () => { const anSLO = createSLO({ indicator: createHistogramIndicator(), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -161,12 +171,12 @@ describe('Histogram Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createHistogramIndicator(), settings: { @@ -176,7 +186,7 @@ describe('Histogram Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts index c8cfb52239f896..76325445a862cb 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/histogram.ts @@ -11,20 +11,26 @@ import { histogramIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; + +import { DataViewsService } from '@kbn/data-views-plugin/common'; +import { InvalidTransformError } from '../../errors'; +import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; import { getSLOTransformId, SLO_DESTINATION_INDEX_NAME, SLO_INGEST_PIPELINE_NAME, } from '../../../common/constants'; -import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { SLODefinition } from '../../domain/models'; -import { InvalidTransformError } from '../../errors'; import { GetHistogramIndicatorAggregation } from '../aggregations'; import { getTimesliceTargetComparator, getFilterRange } from './common'; export class HistogramTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!histogramIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -32,7 +38,7 @@ export class HistogramTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -45,15 +51,24 @@ export class HistogramTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private buildSource(slo: SLODefinition, indicator: HistogramIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: HistogramIndicator, + dataViewService: DataViewsService + ) { + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.index, + }); + return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ getFilterRange(slo, indicator.params.timestampField), - getElasticsearchQueryOrThrow(indicator.params.filter), + getElasticsearchQueryOrThrow(indicator.params.filter, dataView), ], }, }, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts index 4b74695c8942e3..c41e0d4b3df530 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.test.ts @@ -12,34 +12,42 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { KQLCustomTransformGenerator } from './kql_custom'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new KQLCustomTransformGenerator(); +const spaceId = 'custom-space'; describe('KQL Custom Transform Generator', () => { describe('validation', () => { - it('throws when the KQL numerator is invalid', () => { + it('throws when the KQL numerator is invalid', async () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ good: '{ kql.query: invalid' }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL/ + ); }); - it('throws when the KQL denominator is invalid', () => { + it('throws when the KQL denominator is invalid', async () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ total: '{ kql.query: invalid' }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL/ + ); }); - it('throws when the KQL query_filter is invalid', () => { + it('throws when the KQL query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ filter: '{ kql.query: invalid' }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL/ + ); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createKQLCustomIndicator() }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -49,7 +57,7 @@ describe('KQL Custom Transform Generator', () => { id: 'irrelevant', indicator: createKQLCustomIndicator(), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -64,7 +72,7 @@ describe('KQL Custom Transform Generator', () => { timesliceWindow: twoMinute(), }, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -73,7 +81,7 @@ describe('KQL Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); @@ -82,7 +90,7 @@ describe('KQL Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createKQLCustomIndicator({ index: 'my-own-index*' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.index).toBe('my-own-index*'); }); @@ -93,7 +101,7 @@ describe('KQL Custom Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -106,7 +114,7 @@ describe('KQL Custom Transform Generator', () => { good: 'latency < 400 and (http.status_code: 2xx or http.status_code: 3xx or http.status_code: 4xx)', }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -117,12 +125,12 @@ describe('KQL Custom Transform Generator', () => { total: 'http.status_code: *', }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createKQLCustomIndicator(), settings: { @@ -132,7 +140,7 @@ describe('KQL Custom Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts index 573a83a5400de9..d721140f243cf7 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/kql_custom.ts @@ -7,19 +7,25 @@ import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; import { kqlCustomIndicatorSchema, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; + +import { DataViewsService } from '@kbn/data-views-plugin/common'; +import { InvalidTransformError } from '../../errors'; +import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; import { getSLOTransformId, SLO_DESTINATION_INDEX_NAME, SLO_INGEST_PIPELINE_NAME, } from '../../../common/constants'; -import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { KQLCustomIndicator, SLODefinition } from '../../domain/models'; -import { InvalidTransformError } from '../../errors'; import { getTimesliceTargetComparator, getFilterRange } from './common'; export class KQLCustomTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!kqlCustomIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -27,7 +33,7 @@ export class KQLCustomTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -40,10 +46,18 @@ export class KQLCustomTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private buildSource(slo: SLODefinition, indicator: KQLCustomIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: KQLCustomIndicator, + dataViewService: DataViewsService + ) { + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.dataViewId, + }); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts index 1f6a1638baf1e3..85da6de832c982 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.test.ts @@ -12,12 +12,14 @@ import { createSLOWithTimeslicesBudgetingMethod, } from '../fixtures/slo'; import { MetricCustomTransformGenerator } from './metric_custom'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new MetricCustomTransformGenerator(); +const spaceId = 'custom-space'; describe('Metric Custom Transform Generator', () => { describe('validation', () => { - it('throws when the good equation is invalid', () => { + it('throws when the good equation is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ good: { @@ -26,9 +28,11 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid equation/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid equation/ + ); }); - it('throws when the good filter is invalid', () => { + it('throws when the good filter is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ good: { @@ -37,9 +41,11 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL: foo:/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL: foo:/ + ); }); - it('throws when the total equation is invalid', () => { + it('throws when the total equation is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ total: { @@ -48,9 +54,11 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid equation/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid equation/ + ); }); - it('throws when the total filter is invalid', () => { + it('throws when the total filter is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ total: { @@ -59,19 +67,23 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL: foo:/); + await expect(() => + generator.getTransformParams(anSLO, spaceId, dataViewsService) + ).rejects.toThrow(/Invalid KQL: foo:/); }); - it('throws when the query_filter is invalid', () => { + it('throws when the query_filter is invalid', async () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ filter: '{ kql.query: invalid' }), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(() => + generator.getTransformParams(anSLO, spaceId, dataViewsService) + ).rejects.toThrow(/Invalid KQL/); }); }); it('returns the expected transform params with every specified indicator params', async () => { const anSLO = createSLO({ id: 'irrelevant', indicator: createMetricCustomIndicator() }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -81,7 +93,7 @@ describe('Metric Custom Transform Generator', () => { id: 'irrelevant', indicator: createMetricCustomIndicator(), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -90,7 +102,7 @@ describe('Metric Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ filter: 'labels.groupId: group-4' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); @@ -99,7 +111,7 @@ describe('Metric Custom Transform Generator', () => { const anSLO = createSLO({ indicator: createMetricCustomIndicator({ index: 'my-own-index*' }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.index).toBe('my-own-index*'); }); @@ -110,7 +122,7 @@ describe('Metric Custom Transform Generator', () => { timestampField: 'my-date-field', }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -126,7 +138,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -140,7 +152,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -156,7 +168,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -170,7 +182,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.numerator']).toMatchSnapshot(); }); @@ -184,7 +196,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -198,7 +210,7 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); @@ -212,12 +224,12 @@ describe('Metric Custom Transform Generator', () => { }, }), }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!['slo.denominator']).toMatchSnapshot(); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createMetricCustomIndicator(), settings: { @@ -227,7 +239,7 @@ describe('Metric Custom Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts index d004b3e01d890a..c6127b600a4ebe 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/metric_custom.ts @@ -7,22 +7,28 @@ import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; import { metricCustomIndicatorSchema, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; + +import { DataViewsService } from '@kbn/data-views-plugin/common'; +import { InvalidTransformError } from '../../errors'; +import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; import { getSLOTransformId, SLO_DESTINATION_INDEX_NAME, SLO_INGEST_PIPELINE_NAME, } from '../../../common/constants'; -import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { MetricCustomIndicator, SLODefinition } from '../../domain/models'; -import { InvalidTransformError } from '../../errors'; import { GetCustomMetricIndicatorAggregation } from '../aggregations'; import { getTimesliceTargetComparator, getFilterRange } from './common'; export const INVALID_EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g; export class MetricCustomTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!metricCustomIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -30,7 +36,7 @@ export class MetricCustomTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -43,15 +49,23 @@ export class MetricCustomTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private buildSource(slo: SLODefinition, indicator: MetricCustomIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: MetricCustomIndicator, + dataViewService: DataViewsService + ) { + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.dataViewId, + }); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ getFilterRange(slo, indicator.params.timestampField), - getElasticsearchQueryOrThrow(indicator.params.filter), + getElasticsearchQueryOrThrow(indicator.params.filter, dataView), ], }, }, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts index 2a3a6f188eaa9a..b292b8d12f342f 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.test.ts @@ -6,6 +6,7 @@ */ import { ALL_VALUE } from '@kbn/slo-schema'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; import { SLODefinition } from '../../domain/models'; import { createSLO, createSyntheticsAvailabilityIndicator } from '../fixtures/slo'; import { SyntheticsAvailabilityTransformGenerator } from './synthetics_availability'; @@ -17,9 +18,9 @@ const generator = new SyntheticsAvailabilityTransformGenerator(); describe('Synthetics Availability Transform Generator', () => { const spaceId = 'custom-space'; - it('returns the expected transform params', () => { + it('returns the expected transform params', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform).toEqual({ _meta: { @@ -164,12 +165,12 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it('groups by config id and observer.name when using default groupings', () => { + it('groups by config id and observer.name when using default groupings', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -187,13 +188,13 @@ describe('Synthetics Availability Transform Generator', () => { ); }); - it('does not include config id and observer.name when using non default groupings', () => { + it('does not include config id and observer.name when using non default groupings', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), groupBy: ['host.name'], }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.pivot?.group_by).not.toEqual( expect.objectContaining({ @@ -223,13 +224,13 @@ describe('Synthetics Availability Transform Generator', () => { it.each([[[]], [[ALL_VALUE]]])( 'adds observer.geo.name and monitor.name to groupings key by default, multi group by', - (groupBy) => { + async (groupBy) => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -250,13 +251,13 @@ describe('Synthetics Availability Transform Generator', () => { it.each([[''], [ALL_VALUE]])( 'adds observer.geo.name and monitor.name to groupings key by default, single group by', - (groupBy) => { + async (groupBy) => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -275,13 +276,13 @@ describe('Synthetics Availability Transform Generator', () => { } ); - it.each([['host.name'], [['host.name']]])('handles custom groupBy', (groupBy) => { + it.each([['host.name'], [['host.name']]])('handles custom groupBy', async (groupBy) => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator(), groupBy, }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.pivot?.group_by).toEqual( expect.objectContaining({ @@ -294,9 +295,9 @@ describe('Synthetics Availability Transform Generator', () => { ); }); - it('filters by summary.final_attempt', () => { + it('filters by summary.final_attempt', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query?.bool?.filter).toContainEqual({ term: { @@ -305,7 +306,7 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it('adds tag filters', () => { + it('adds tag filters', async () => { const tags = [ { value: 'tag-1', label: 'tag1' }, { value: 'tag-2', label: 'tag2' }, @@ -321,7 +322,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -335,7 +336,7 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it('adds monitorId filter', () => { + it('adds monitorId filter', async () => { const monitorIds = [ { value: 'id-1', label: 'Monitor name 1' }, { value: 'id-2', label: 'Monitor name 2' }, @@ -351,7 +352,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -365,7 +366,7 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it('adds project id filter', () => { + it('adds project id filter', async () => { const projects = [ { value: 'id-1', label: 'Project name 1' }, { value: 'id-2', label: 'Project name 2' }, @@ -381,7 +382,7 @@ describe('Synthetics Availability Transform Generator', () => { }, } as SLODefinition['indicator'], }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query?.bool?.filter).toContainEqual({ terms: { @@ -395,9 +396,9 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it('filters by space', () => { + it('filters by space', async () => { const slo = createSLO({ id: 'irrelevant', indicator: createSyntheticsAvailabilityIndicator() }); - const transform = generator.getTransformParams(slo, spaceId); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); expect(transform.source.query?.bool?.filter).toContainEqual({ term: { @@ -406,7 +407,7 @@ describe('Synthetics Availability Transform Generator', () => { }); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLO({ indicator: createSyntheticsAvailabilityIndicator(), settings: { @@ -416,7 +417,7 @@ describe('Synthetics Availability Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo, 'default'); + const transform = await generator.getTransformParams(slo, 'default', dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts index a98f2a2b3e2320..5839a5611351eb 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/synthetics_availability.ts @@ -13,6 +13,7 @@ import { occurrencesBudgetingMethodSchema, SyntheticsAvailabilityIndicator, } from '@kbn/slo-schema'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { getElasticsearchQueryOrThrow, TransformGenerator } from '.'; import { getSLOTransformId, @@ -27,7 +28,11 @@ import { SLODefinition } from '../../domain/models'; import { getFilterRange } from './common'; export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition, spaceId: string): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!syntheticsAvailabilityIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -35,7 +40,7 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator, spaceId), + await this.buildSource(slo, slo.indicator, spaceId, dataViewService), this.buildDestination(), this.buildGroupBy(slo, slo.indicator), this.buildAggregations(slo), @@ -102,10 +107,11 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator ); } - private buildSource( + private async buildSource( slo: SLODefinition, indicator: SyntheticsAvailabilityIndicator, - spaceId: string + spaceId: string, + dataViewService: DataViewsService ) { const queryFilter: estypes.QueryDslQueryContainer[] = [ { term: { 'summary.final_attempt': true } }, @@ -146,11 +152,14 @@ export class SyntheticsAvailabilityTransformGenerator extends TransformGenerator queryFilter.push(getElasticsearchQueryOrThrow(indicator.params.filter)); } + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.dataViewId, + }); + return { index: SYNTHETICS_INDEX_PATTERN, - runtime_mappings: { - ...this.buildCommonRuntimeMappings(slo), - }, + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: queryFilter, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts index 1fcd8c6abe892b..02c69f38d67058 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.test.ts @@ -12,8 +12,11 @@ import { createSLO, } from '../fixtures/slo'; import { TimesliceMetricTransformGenerator } from './timeslice_metric'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; const generator = new TimesliceMetricTransformGenerator(); +const spaceId = 'custom-space'; + const everythingIndicator = createTimesliceMetricIndicator( [ { name: 'A', aggregation: 'avg', field: 'test.field', filter: 'test.category: "test"' }, @@ -28,36 +31,40 @@ const everythingIndicator = createTimesliceMetricIndicator( describe('Timeslice Metric Transform Generator', () => { describe('validation', () => { - it('throws when the budgeting method is occurrences', () => { + it('throws when the budgeting method is occurrences', async () => { const anSLO = createSLO({ indicator: createTimesliceMetricIndicator( [{ name: 'A', aggregation: 'avg', field: 'test.field' }], '(A / 200) + A' ), }); - expect(() => generator.getTransformParams(anSLO)).toThrow( + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( 'The sli.metric.timeslice indicator MUST have a timeslice budgeting method.' ); }); - it('throws when the metric equation is invalid', () => { + it('throws when the metric equation is invalid', async () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: createTimesliceMetricIndicator( [{ name: 'A', aggregation: 'avg', field: 'test.field' }], '(a / 200) + A' ), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid equation/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid equation/ + ); }); - it('throws when the metric filter is invalid', () => { + it('throws when the metric filter is invalid', async () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: createTimesliceMetricIndicator( [{ name: 'A', aggregation: 'avg', field: 'test.field', filter: 'test:' }], '(A / 200) + A' ), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL: test:/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL: test:/ + ); }); - it('throws when the query_filter is invalid', () => { + it('throws when the query_filter is invalid', async () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: createTimesliceMetricIndicator( [{ name: 'A', aggregation: 'avg', field: 'test.field', filter: 'test.category: "test"' }], @@ -65,7 +72,9 @@ describe('Timeslice Metric Transform Generator', () => { 'test:' ), }); - expect(() => generator.getTransformParams(anSLO)).toThrow(/Invalid KQL/); + await expect(generator.getTransformParams(anSLO, spaceId, dataViewsService)).rejects.toThrow( + /Invalid KQL/ + ); }); }); @@ -74,7 +83,7 @@ describe('Timeslice Metric Transform Generator', () => { id: 'irrelevant', indicator: everythingIndicator, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -84,7 +93,7 @@ describe('Timeslice Metric Transform Generator', () => { id: 'irrelevant', indicator: everythingIndicator, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform).toMatchSnapshot(); }); @@ -93,7 +102,7 @@ describe('Timeslice Metric Transform Generator', () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: everythingIndicator, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.query).toMatchSnapshot(); }); @@ -105,7 +114,7 @@ describe('Timeslice Metric Transform Generator', () => { params: { ...everythingIndicator.params, index: 'my-own-index*' }, }, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.source.index).toBe('my-own-index*'); }); @@ -117,7 +126,7 @@ describe('Timeslice Metric Transform Generator', () => { params: { ...everythingIndicator.params, timestampField: 'my-date-field' }, }, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.sync?.time?.field).toBe('my-date-field'); // @ts-ignore @@ -128,7 +137,7 @@ describe('Timeslice Metric Transform Generator', () => { const anSLO = createSLOWithTimeslicesBudgetingMethod({ indicator: everythingIndicator, }); - const transform = generator.getTransformParams(anSLO); + const transform = await generator.getTransformParams(anSLO, spaceId, dataViewsService); expect(transform.pivot!.aggregations!._metric).toEqual({ bucket_script: { @@ -166,7 +175,7 @@ describe('Timeslice Metric Transform Generator', () => { }); }); - it("overrides the range filter when 'preventInitialBackfill' is true", () => { + it("overrides the range filter when 'preventInitialBackfill' is true", async () => { const slo = createSLOWithTimeslicesBudgetingMethod({ indicator: everythingIndicator, settings: { @@ -176,7 +185,7 @@ describe('Timeslice Metric Transform Generator', () => { }, }); - const transform = generator.getTransformParams(slo); + const transform = await generator.getTransformParams(slo, spaceId, dataViewsService); // @ts-ignore const rangeFilter = transform.source.query.bool.filter.find((f) => 'range' in f); diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts index 719766b0c4efe2..579772b0eb1de4 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/timeslice_metric.ts @@ -12,6 +12,7 @@ import { timesliceMetricIndicatorSchema, timeslicesBudgetingMethodSchema, } from '@kbn/slo-schema'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; import { InvalidTransformError } from '../../errors'; import { getSLOTransformTemplate } from '../../assets/transform_templates/slo_transform_template'; import { getElasticsearchQueryOrThrow, parseIndex, TransformGenerator } from '.'; @@ -27,7 +28,11 @@ import { getFilterRange } from './common'; const INVALID_EQUATION_REGEX = /[^A-Z|+|\-|\s|\d+|\.|\(|\)|\/|\*|>|<|=|\?|\:|&|\!|\|]+/g; export class TimesliceMetricTransformGenerator extends TransformGenerator { - public getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + public async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { if (!timesliceMetricIndicatorSchema.is(slo.indicator)) { throw new InvalidTransformError(`Cannot handle SLO of indicator type: ${slo.indicator.type}`); } @@ -35,7 +40,7 @@ export class TimesliceMetricTransformGenerator extends TransformGenerator { return getSLOTransformTemplate( this.buildTransformId(slo), this.buildDescription(slo), - this.buildSource(slo, slo.indicator), + await this.buildSource(slo, slo.indicator, dataViewService), this.buildDestination(), this.buildCommonGroupBy(slo, slo.indicator.params.timestampField), this.buildAggregations(slo, slo.indicator), @@ -48,15 +53,23 @@ export class TimesliceMetricTransformGenerator extends TransformGenerator { return getSLOTransformId(slo.id, slo.revision); } - private buildSource(slo: SLODefinition, indicator: TimesliceMetricIndicator) { + private async buildSource( + slo: SLODefinition, + indicator: TimesliceMetricIndicator, + dataViewService: DataViewsService + ) { + const dataView = await this.getIndicatorDataView({ + dataViewService, + dataViewId: indicator.params.index, + }); return { index: parseIndex(indicator.params.index), - runtime_mappings: this.buildCommonRuntimeMappings(slo), + runtime_mappings: this.buildCommonRuntimeMappings(slo, dataView), query: { bool: { filter: [ getFilterRange(slo, indicator.params.timestampField), - getElasticsearchQueryOrThrow(indicator.params.filter), + getElasticsearchQueryOrThrow(indicator.params.filter, dataView), ], }, }, diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts index 0a2226d98d55ad..37e20144435d7a 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_generators/transform_generator.ts @@ -10,16 +10,18 @@ import { TransformPutTransformRequest, } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { ALL_VALUE, timeslicesBudgetingMethodSchema } from '@kbn/slo-schema'; +import { DataView, DataViewsService } from '@kbn/data-views-plugin/common'; import { TransformSettings } from '../../assets/transform_templates/slo_transform_template'; import { SLODefinition } from '../../domain/models'; export abstract class TransformGenerator { public abstract getTransformParams( slo: SLODefinition, - spaceId: string - ): TransformPutTransformRequest; + spaceId: string, + dataViewService: DataViewsService + ): Promise; - public buildCommonRuntimeMappings(slo: SLODefinition): MappingRuntimeFields { + public buildCommonRuntimeMappings(slo: SLODefinition, dataView?: DataView): MappingRuntimeFields { return { 'slo.id': { type: 'keyword', @@ -33,6 +35,7 @@ export abstract class TransformGenerator { source: `emit(${slo.revision})`, }, }, + ...(dataView?.getRuntimeMappings?.() ?? {}), }; } @@ -81,6 +84,24 @@ export abstract class TransformGenerator { }; } + public async getIndicatorDataView({ + dataViewService, + dataViewId, + }: { + dataViewService: DataViewsService; + dataViewId?: string; + }): Promise { + let dataView: DataView | undefined; + if (dataViewId) { + try { + dataView = await dataViewService.get(dataViewId); + } catch (e) { + // If the data view is not found, we will continue without it + } + } + return dataView; + } + public buildSettings( slo: SLODefinition, sourceIndexTimestampField: string | undefined = '@timestamp' diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts index d7758f0fbdd4a3..7e6cf50c169fa0 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.test.ts @@ -26,6 +26,8 @@ import { createAPMTransactionErrorRateIndicator, createSLO, } from './fixtures/slo'; +import { dataViewsService } from '@kbn/data-views-plugin/server/mocks'; +import { DataViewsService } from '@kbn/data-views-plugin/common'; describe('TransformManager', () => { let esClientMock: ElasticsearchClientMock; @@ -44,7 +46,13 @@ describe('TransformManager', () => { const generators: Record = { 'sli.apm.transactionDuration': new DummyTransformGenerator(), }; - const service = new DefaultTransformManager(generators, esClientMock, loggerMock, spaceId); + const service = new DefaultTransformManager( + generators, + esClientMock, + loggerMock, + spaceId, + dataViewsService + ); await expect( service.install(createSLO({ indicator: createAPMTransactionErrorRateIndicator() })) @@ -60,7 +68,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await expect( @@ -80,7 +89,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); const slo = createSLO({ indicator: createAPMTransactionErrorRateIndicator() }); @@ -101,7 +111,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await transformManager.preview('slo-transform-id'); @@ -120,7 +131,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await transformManager.start('slo-transform-id'); @@ -139,7 +151,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await transformManager.stop('slo-transform-id'); @@ -158,7 +171,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await transformManager.uninstall('slo-transform-id'); @@ -178,7 +192,8 @@ describe('TransformManager', () => { generators, esClientMock, loggerMock, - spaceId + spaceId, + dataViewsService ); await transformManager.uninstall('slo-transform-id'); @@ -189,13 +204,21 @@ describe('TransformManager', () => { }); class DummyTransformGenerator extends TransformGenerator { - getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + async getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { return {} as TransformPutTransformRequest; } } class FailTransformGenerator extends TransformGenerator { - getTransformParams(slo: SLODefinition): TransformPutTransformRequest { + getTransformParams( + slo: SLODefinition, + spaceId: string, + dataViewService: DataViewsService + ): Promise { throw new Error('Some error'); } } diff --git a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts index e00d67e9944bbb..f90d240e300871 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/transform_manager.ts @@ -8,6 +8,7 @@ import { ElasticsearchClient, Logger } from '@kbn/core/server'; import { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { DataViewsService } from '@kbn/data-views-plugin/server'; import { SLODefinition, IndicatorTypes } from '../domain/models'; import { SecurityException } from '../errors'; import { retryTransientEsErrors } from '../utils/retry'; @@ -17,7 +18,7 @@ type TransformId = string; export interface TransformManager { install(slo: SLODefinition): Promise; - inspect(slo: SLODefinition): TransformPutTransformRequest; + inspect(slo: SLODefinition): Promise; preview(transformId: TransformId): Promise; start(transformId: TransformId): Promise; stop(transformId: TransformId): Promise; @@ -29,7 +30,8 @@ export class DefaultTransformManager implements TransformManager { private generators: Record, private esClient: ElasticsearchClient, private logger: Logger, - private spaceId: string + private spaceId: string, + private dataViewService: DataViewsService ) {} async install(slo: SLODefinition): Promise { @@ -39,7 +41,11 @@ export class DefaultTransformManager implements TransformManager { throw new Error(`Unsupported indicator type [${slo.indicator.type}]`); } - const transformParams = generator.getTransformParams(slo, this.spaceId); + const transformParams = await generator.getTransformParams( + slo, + this.spaceId, + this.dataViewService + ); try { await retryTransientEsErrors(() => this.esClient.transform.putTransform(transformParams), { logger: this.logger, @@ -56,14 +62,14 @@ export class DefaultTransformManager implements TransformManager { return transformParams.transform_id; } - inspect(slo: SLODefinition): TransformPutTransformRequest { + async inspect(slo: SLODefinition): Promise { const generator = this.generators[slo.indicator.type]; if (!generator) { this.logger.error(`No transform generator found for indicator type [${slo.indicator.type}]`); throw new Error(`Unsupported indicator type [${slo.indicator.type}]`); } - return generator.getTransformParams(slo, this.spaceId); + return await generator.getTransformParams(slo, this.spaceId, this.dataViewService); } async preview(transformId: string): Promise { diff --git a/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts b/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts index 974f72561aeff1..0c68d20b2308cc 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/update_slo.test.ts @@ -42,14 +42,14 @@ describe('UpdateSLO', () => { let mockRepository: jest.Mocked; let mockTransformManager: jest.Mocked; let mockEsClient: jest.Mocked; - let loggerMock: jest.Mocked; + let mockLogger: jest.Mocked; let mockSummaryTransformManager: jest.Mocked; let updateSLO: UpdateSLO; beforeEach(() => { mockRepository = createSLORepositoryMock(); mockTransformManager = createTransformManagerMock(); - loggerMock = loggingSystemMock.createLogger(); + mockLogger = loggingSystemMock.createLogger(); mockSummaryTransformManager = createSummaryTransformManagerMock(); mockEsClient = elasticsearchServiceMock.createElasticsearchClient(); updateSLO = new UpdateSLO( @@ -57,7 +57,7 @@ describe('UpdateSLO', () => { mockTransformManager, mockSummaryTransformManager, mockEsClient, - loggerMock, + mockLogger, 'some-space', httpServiceMock.createStartContract().basePath ); @@ -298,28 +298,52 @@ describe('UpdateSLO', () => { }); describe('when error happens during the update', () => { - it('restores the previous SLO definition in the repository', async () => { - const slo = createSLO({ + it('restores the previous SLO definition when updated summary transform install fails', async () => { + const originalSlo = createSLO({ id: 'original-id', indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), }); - mockRepository.findById.mockResolvedValueOnce(slo); + mockRepository.findById.mockResolvedValueOnce(originalSlo); mockTransformManager.install.mockRejectedValueOnce(new Error('Transform install error')); const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); - await expect(updateSLO.execute(slo.id, { indicator: newIndicator })).rejects.toThrowError( - 'Transform install error' + await expect( + updateSLO.execute(originalSlo.id, { indicator: newIndicator }) + ).rejects.toThrowError('Transform install error'); + + expect(mockRepository.save).toHaveBeenCalledWith(originalSlo); + + expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); + expect(mockSummaryTransformManager.uninstall).not.toHaveBeenCalled(); + expect(mockEsClient.ingest.deletePipeline).not.toHaveBeenCalled(); + expect(mockTransformManager.stop).not.toHaveBeenCalled(); + expect(mockTransformManager.uninstall).not.toHaveBeenCalled(); + }); + + it('restores the previous SLO definition and rollback succeeded operations until the summary transform start operation fails', async () => { + const originalSlo = createSLO({ + id: 'original-id', + indicator: createAPMTransactionErrorRateIndicator({ environment: 'development' }), + }); + mockRepository.findById.mockResolvedValueOnce(originalSlo); + mockSummaryTransformManager.start.mockRejectedValueOnce( + new Error('summary transform start error') ); - expect(mockRepository.save).toHaveBeenCalledWith(slo); + const newIndicator = createAPMTransactionErrorRateIndicator({ environment: 'production' }); + + await expect( + updateSLO.execute(originalSlo.id, { indicator: newIndicator }) + ).rejects.toThrowError('summary transform start error'); + + expect(mockRepository.save).toHaveBeenCalledWith(originalSlo); + expect(mockSummaryTransformManager.uninstall).toHaveBeenCalled(); + expect(mockEsClient.ingest.deletePipeline).toHaveBeenCalled(); + expect(mockTransformManager.stop).toHaveBeenCalled(); + expect(mockTransformManager.uninstall).toHaveBeenCalled(); - // these calls are related to the updated slo - expect(mockSummaryTransformManager.stop).toMatchSnapshot(); - expect(mockSummaryTransformManager.uninstall).toMatchSnapshot(); - expect(mockTransformManager.stop).toMatchSnapshot(); - expect(mockTransformManager.uninstall).toMatchSnapshot(); - expect(mockEsClient.ingest.deletePipeline).toMatchSnapshot(); + expect(mockSummaryTransformManager.stop).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts b/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts index 5c8812cd4a8863..cefdc703bb4343 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts +++ b/x-pack/plugins/observability_solution/slo/server/services/update_slo.ts @@ -7,6 +7,7 @@ import { ElasticsearchClient, IBasePath, Logger } from '@kbn/core/server'; import { UpdateSLOParams, UpdateSLOResponse, updateSLOResponseSchema } from '@kbn/slo-schema'; +import { asyncForEach } from '@kbn/std'; import { isEqual, pick } from 'lodash'; import { getSLOSummaryPipelineId, @@ -62,17 +63,38 @@ export class UpdateSLO { }); validateSLO(updatedSlo); + + const rollbackOperations = []; + await this.repository.save(updatedSlo); + rollbackOperations.push(() => this.repository.save(originalSlo)); if (!requireRevisionBump) { // At this point, we still need to update the summary pipeline to include the changes (name, desc, tags, ...) in the summary index - await retryTransientEsErrors( - () => - this.esClient.ingest.putPipeline( - getSLOSummaryPipelineTemplate(updatedSlo, this.spaceId, this.basePath) - ), - { logger: this.logger } - ); + + try { + await retryTransientEsErrors( + () => + this.esClient.ingest.putPipeline( + getSLOSummaryPipelineTemplate(updatedSlo, this.spaceId, this.basePath) + ), + { logger: this.logger } + ); + } catch (err) { + this.logger.error( + `Cannot update the SLO summary pipeline [id: ${updatedSlo.id}, revision: ${updatedSlo.revision}].` + ); + + await asyncForEach(rollbackOperations.reverse(), async (operation) => { + try { + await operation(); + } catch (rollbackErr) { + this.logger.error('Rollback operation failed', rollbackErr); + } + }); + + throw err; + } return this.toResponse(updatedSlo); } @@ -82,7 +104,10 @@ export class UpdateSLO { try { await this.transformManager.install(updatedSlo); + rollbackOperations.push(() => this.transformManager.uninstall(updatedRollupTransformId)); + await this.transformManager.start(updatedRollupTransformId); + rollbackOperations.push(() => this.transformManager.stop(updatedRollupTransformId)); await retryTransientEsErrors( () => @@ -91,9 +116,20 @@ export class UpdateSLO { ), { logger: this.logger } ); + rollbackOperations.push(() => + this.esClient.ingest.deletePipeline( + { id: getSLOSummaryPipelineId(updatedSlo.id, updatedSlo.revision) }, + { ignore: [404] } + ) + ); await this.summaryTransformManager.install(updatedSlo); + rollbackOperations.push(() => + this.summaryTransformManager.uninstall(updatedSummaryTransformId) + ); + await this.summaryTransformManager.start(updatedSummaryTransformId); + rollbackOperations.push(() => this.summaryTransformManager.stop(updatedSummaryTransformId)); await retryTransientEsErrors( () => @@ -110,17 +146,13 @@ export class UpdateSLO { `Cannot update the SLO [id: ${updatedSlo.id}, revision: ${updatedSlo.revision}]. Rolling back.` ); - // Restore the previous slo definition - await this.repository.save(originalSlo); - // delete the created resources for the updated slo - await this.summaryTransformManager.stop(updatedSummaryTransformId); - await this.summaryTransformManager.uninstall(updatedSummaryTransformId); - await this.transformManager.stop(updatedRollupTransformId); - await this.transformManager.uninstall(updatedRollupTransformId); - await this.esClient.ingest.deletePipeline( - { id: getSLOSummaryPipelineId(updatedSlo.id, updatedSlo.revision) }, - { ignore: [404] } - ); + await asyncForEach(rollbackOperations.reverse(), async (operation) => { + try { + await operation(); + } catch (rollbackErr) { + this.logger.error('Rollback operation failed', rollbackErr); + } + }); throw err; } diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx index b2192731b4ab9b..f090f807a0fb8f 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/alerts/query_bar.tsx @@ -47,7 +47,7 @@ export const AlertQueryBar = ({ query = '', onChange }: Props) => { const { data: dataView } = useFetcher(async () => { return await dataViews.create({ title: SYNTHETICS_INDEX_PATTERN }); - }, []); + }, [dataViews]); useEffect(() => { onChange(query); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx index f7fff9c9ce3320..90d30606b860dc 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/monitor_inspect.tsx @@ -70,6 +70,9 @@ const MonitorInspect = ({ isValid, monitorFields }: InspectorProps) => { monitor: monitorFields, }); } + // FIXME: Dario couldn't find a solution for monitorFields + // which is not memoized downstream + // eslint-disable-next-line react-hooks/exhaustive-deps }, [isInspecting, hideParams]); let flyout; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx index b4a28335ce132c..2b332ec78671f1 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/components/stderr_logs.tsx @@ -86,7 +86,7 @@ export const StdErrorLogs = ({ } : undefined, }); - }, [checkGroup, timestamp]); + }, [checkGroup, timestamp, discover, exploratoryView]); const search = { box: { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details_successful.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details_successful.tsx index 08194c3b77f26d..25f0ed08434725 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details_successful.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/common/monitor_test_result/result_details_successful.tsx @@ -25,14 +25,22 @@ export const ResultDetailsSuccessful = ({ }) => { const { euiTheme } = useEuiTheme(); + const timestamp = step['@timestamp']; + const monitorId = step.monitor.id; + const stepIndex = Number(step.synthetics.step?.index); + const location = step.observer?.geo?.name; + const { data, loading } = useFetcher(() => { return fetchLastSuccessfulCheck({ - timestamp: step['@timestamp'], - monitorId: step.monitor.id, - stepIndex: Number(step.synthetics.step?.index), - location: step.observer?.geo?.name, + timestamp, + monitorId, + stepIndex, + location, }); - }, [step._id, step['@timestamp']]); + // FIXME: Dario is not sure what step._id is being used for, + // so he'll leave it in place + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [timestamp, monitorId, stepIndex, location, step._id]); const { currentStep } = useJourneySteps( data?.monitor.check_group, diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx index 579cf526c1b3ad..00ddc5b4a7ef3d 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/form/run_test_btn.tsx @@ -52,7 +52,7 @@ export const RunTestButton = ({ id: testRun.id, }); } - }, [testRun?.id]); + }, [testRun?.id, testRun?.monitor]); const { tooltipContent, isDisabled } = useTooltipContent(formState.isValid, inProgress); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/hooks/use_monitor_save.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/hooks/use_monitor_save.tsx index 4fa482eb63bbd1..1ba3cec8858896 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/hooks/use_monitor_save.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/hooks/use_monitor_save.tsx @@ -39,6 +39,9 @@ export const useMonitorSave = ({ monitorData }: { monitorData?: SyntheticsMonito }); } } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [monitorData]); useEffect(() => { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx index 772a4bc36022b4..f339c69610672a 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_add_edit/monitor_edit_page.tsx @@ -45,6 +45,9 @@ export const MonitorEditPage: React.FC = () => { const { data, loading, error } = useFetcher(() => { return getDecryptedMonitorAPI({ id: monitorId }); + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, []); const monitorNotFoundError = useMonitorNotFound( diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/use_recently_viewed_monitors.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/use_recently_viewed_monitors.ts index 74efd982c3d173..0988e6c2aefc53 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/use_recently_viewed_monitors.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitor_details/monitor_selector/use_recently_viewed_monitors.ts @@ -92,6 +92,9 @@ export const useRecentlyViewedMonitors = () => { updateRecentlyViewed(); } } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [monitorQueryId]); return useMemo( diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx index cb8da8a64cad64..78ac9dd2f663f4 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx @@ -255,7 +255,13 @@ export function MonitorDetailFlyout(props: Props) { error, status, loading, - } = useFetcher(() => fetchSyntheticsMonitor({ monitorId: configId }), [configId, upsertSuccess]); + } = useFetcher( + () => fetchSyntheticsMonitor({ monitorId: configId }), + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps + [configId, upsertSuccess] + ); const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/policy_link.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/policy_link.tsx index c36296b1ff42c5..0c9cb465c127ff 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/policy_link.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/policy_link.tsx @@ -24,6 +24,9 @@ export const PolicyLink = ({ name }: { name: string }) => { const { data } = useFetcher(async () => { return ilmLocator?.getLocation({ page: 'policy_edit', policyName: name }); + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [name]); if (!data) { @@ -31,7 +34,7 @@ export const PolicyLink = ({ name }: { name: string }) => { } if (!name) { - return <>--; + return <>{i18n.translate('xpack.synthetics.policyLink.Label', { defaultMessage: '--' })}; } if (!canManageILM) { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts index 6ee8acd4a93e7b..6b3899a5b44c8b 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/private_locations/hooks/use_locations_api.ts @@ -44,6 +44,9 @@ export const usePrivateLocationsAPI = () => { dispatch(getPrivateLocationsAction.get()); return result; } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [formData]); const onSubmit = (data: NewLocation) => { @@ -62,6 +65,9 @@ export const usePrivateLocationsAPI = () => { dispatch(getPrivateLocationsAction.get()); return result; } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [deleteId]); return { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/project_api_keys/project_api_keys.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/project_api_keys/project_api_keys.tsx index 5ea801dea4ed36..4a8752e8b9926f 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/project_api_keys/project_api_keys.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/settings/project_api_keys/project_api_keys.tsx @@ -38,6 +38,9 @@ export const ProjectAPIKeys = () => { return fetchProjectAPIKey(accessToElasticManagedLocations && Boolean(canUsePublicLocations)); } return null; + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [loadAPIKey, canUsePublicLocations]); useEffect(() => { diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/last_successful_screenshot.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/last_successful_screenshot.tsx index 45052a38a21fd0..cde0cb93fed114 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/last_successful_screenshot.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/step_details_page/step_screenshot/last_successful_screenshot.tsx @@ -35,6 +35,9 @@ export const LastSuccessfulScreenshot = ({ stepIndex: Number(stepIndex ?? stepInd), location: step.observer?.geo?.name, }); + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [step._id, step['@timestamp']]); return ( diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_browser_run_once_monitors.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_browser_run_once_monitors.ts index 2ad18149f26dc5..c5b11dc2722339 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_browser_run_once_monitors.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_browser_run_once_monitors.ts @@ -187,6 +187,9 @@ export const useBrowserRunOnceMonitors = ({ } return Promise.resolve(null); + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Synthetics folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [checkGroupCheckSum, setCheckGroupResults, lastRefresh]); // Whenever a new found document is fetched, update lastUpdated diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_test_flyout_open.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_test_flyout_open.ts index ed3bf648cfe57a..082a7ffc84c7ef 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_test_flyout_open.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/hooks/use_test_flyout_open.ts @@ -7,7 +7,7 @@ import { useDispatch, useSelector } from 'react-redux'; import { useRouteMatch } from 'react-router-dom'; -import { useEffect } from 'react'; +import { useEffect, useMemo } from 'react'; import { MONITOR_ROUTE, OVERVIEW_ROUTE } from '../../../../../../common/constants'; import { hideTestNowFlyoutAction, testNowRunsSelector } from '../../../state/manual_test_runs'; @@ -24,9 +24,11 @@ export const useTestFlyoutOpen = () => { const dispatch = useDispatch(); - const flyoutTestOpen = Object.values(testNowRuns).find((value) => { - return value.isTestNowFlyoutOpen; - }); + const flyoutTestOpen = useMemo(() => { + return Object.values(testNowRuns).find((value) => { + return value.isTestNowFlyoutOpen; + }); + }, [testNowRuns]); const isSameMonitor = flyoutTestOpen?.configId === isMonitorDetails?.params.monitorId; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/test_now_mode_flyout_container.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/test_now_mode_flyout_container.tsx index ff3114c98f845e..b550cdbd2745e6 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/test_now_mode_flyout_container.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/components/test_now_mode/test_now_mode_flyout_container.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { useTestFlyoutOpen } from './hooks/use_test_flyout_open'; @@ -50,27 +50,30 @@ export function TestNowModeFlyoutContainer() { [dispatch] ); - const flyout = flyoutOpenTestRun ? ( - handleFlyoutClose(flyoutOpenTestRun.testRunId)} - onDone={onDone} - isPushing={flyoutOpenTestRun.status === 'loading'} - errors={flyoutOpenTestRun.errors ?? []} - /> - ) : null; + const testRun = useMemo(() => { + return flyoutOpenTestRun?.testRunId && flyoutOpenTestRun?.monitor + ? { + id: flyoutOpenTestRun.testRunId, + monitor: flyoutOpenTestRun.monitor, + name: flyoutOpenTestRun.name, + } + : undefined; + }, [flyoutOpenTestRun]); + + const flyout = + flyoutOpenTestRun && testRun ? ( + handleFlyoutClose(flyoutOpenTestRun.testRunId)} + onDone={onDone} + isPushing={flyoutOpenTestRun.status === 'loading'} + errors={flyoutOpenTestRun.errors ?? []} + /> + ) : null; return ( <> diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx index b7a7c8f25602b2..04c502e3f181f4 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/contexts/synthetics_data_view_context.tsx @@ -19,7 +19,7 @@ export const SyntheticsDataViewContextProvider: FC< > = ({ children, dataViews }) => { const { data } = useFetcher>(async () => { return dataViews.create({ title: SYNTHETICS_INDEX_PATTERN }); - }, []); + }, [dataViews]); return ; }; diff --git a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts index f54b5ac839afe5..9442d86265830e 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/api.ts @@ -72,6 +72,7 @@ export const fetchUpsertMonitor = async ({ null, { version: INITIAL_REST_VERSION, + ui: true, } ); } else { diff --git a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_capabilities.ts b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_capabilities.ts index 1f9d7f1538b95d..6e09a9bfe59354 100644 --- a/x-pack/plugins/observability_solution/synthetics/public/hooks/use_capabilities.ts +++ b/x-pack/plugins/observability_solution/synthetics/public/hooks/use_capabilities.ts @@ -62,7 +62,7 @@ export const useCanReadSyntheticsIndex = () => { }, }); }); - }, []); + }, [dataPublicPluginStart.search]); return { canRead: data?.canRead, diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/monitor/ping_list/columns/ping_timestamp/use_in_progress_image.ts b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/monitor/ping_list/columns/ping_timestamp/use_in_progress_image.ts index 0a252651c9ed47..bc85b45857c23d 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/monitor/ping_list/columns/ping_timestamp/use_in_progress_image.ts +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/monitor/ping_list/columns/ping_timestamp/use_in_progress_image.ts @@ -43,6 +43,9 @@ export const useInProgressImage = ({ } if (hasIntersected && !hasImage) return getJourneyScreenshot(imgPath); + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [hasIntersected, imgPath, skippedStep, retryLoading]); useEffect(() => { diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/alerts_containers/use_snap_shot.ts b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/alerts_containers/use_snap_shot.ts index 30445a5441ccac..b6d250a2cb70f4 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/alerts_containers/use_snap_shot.ts +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/alerts/alerts_containers/use_snap_shot.ts @@ -24,6 +24,9 @@ export const useSnapShotCount = ({ query, filters }: { query: string; filters?: dateRangeEnd: 'now', filters: error ? undefined : esKuery, }), + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps [esKuery, query] ); diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/integration_deprecation/index.tsx b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/integration_deprecation/index.tsx index afff54bb69f268..ac7e20db41b179 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/integration_deprecation/index.tsx +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/integration_deprecation/index.tsx @@ -26,6 +26,9 @@ export const IntegrationDeprecation = () => { return getHasIntegrationMonitors(); } return undefined; + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [monitorList.isLoaded]); const hasIntegrationMonitors = !loading && data && data.hasIntegrationMonitors; const [shouldShowNotice, setShouldShowNotice] = useState( diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/snapshot/use_snap_shot.ts b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/snapshot/use_snap_shot.ts index 8932d5755e7000..15ffd98c739c33 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/snapshot/use_snap_shot.ts +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/overview/snapshot/use_snap_shot.ts @@ -22,6 +22,9 @@ export const useSnapShotCount = () => { const { data, loading } = useFetcher( () => fetchSnapshotCount({ query, dateRangeStart, dateRangeEnd, filters: esKuery }), + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps [dateRangeStart, dateRangeEnd, esKuery, lastRefresh, query] ); diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/stderr_logs.tsx b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/stderr_logs.tsx index 1b17bb5f1702b5..7eab37d2b9afe4 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/stderr_logs.tsx +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/stderr_logs.tsx @@ -90,6 +90,9 @@ export const StdErrorLogs = ({ }); } return ''; + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [checkGroup, timestamp]); const search = { diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx index 8a4f101fdc4dab..606019c99429da 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/check_steps/step_expanded_row/step_screenshots.tsx @@ -40,6 +40,9 @@ export const StepScreenshots = ({ step }: Props) => { location: step.observer?.geo?.name, }); } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [step._id, step['@timestamp']]); const lastSuccessfulCheck: Ping | undefined = data; diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/step_screenshot_display.tsx b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/step_screenshot_display.tsx index 7afb544fdeac8b..b7d2f6d85fe2b5 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/step_screenshot_display.tsx +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/components/synthetics/step_screenshot_display.tsx @@ -135,6 +135,9 @@ export const StepScreenshotDisplay: FC = ({ if (isScreenshotRef) { return getJourneyScreenshot(imgSrc); } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [basePath, checkGroup, imgSrc, stepIndex, isScreenshotRef, lastRefresh]); const refDimensions = useMemo(() => { diff --git a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/contexts/uptime_data_view_context.tsx b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/contexts/uptime_data_view_context.tsx index edcf638b4414fe..7abbdf3fde8c86 100644 --- a/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/contexts/uptime_data_view_context.tsx +++ b/x-pack/plugins/observability_solution/uptime/public/legacy_uptime/contexts/uptime_data_view_context.tsx @@ -26,6 +26,9 @@ export const UptimeDataViewContextProvider: FC< // this only creates an dateView in memory, not as saved object return dataViews.create({ title: heartbeatIndices }); } + // FIXME: Dario thinks there is a better way to do this but + // he's getting tired and maybe the Uptime folks can fix it + // eslint-disable-next-line react-hooks/exhaustive-deps }, [heartbeatIndices, indexStatus?.indexExists]); return ; diff --git a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts index 45921be4cbc2e2..aa6fd2a20c062a 100644 --- a/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts +++ b/x-pack/plugins/osquery/cypress/e2e/all/alerts_linked_apps.cy.ts @@ -22,7 +22,8 @@ import { } from '../../tasks/integrations'; import { RESULTS_TABLE, RESULTS_TABLE_BUTTON } from '../../screens/live_query'; -describe( +// FLAKY: https://github.com/elastic/kibana/issues/180852 +describe.skip( 'Alert Event Details', { tags: ['@ess', '@serverless'], diff --git a/x-pack/plugins/reporting/server/core.ts b/x-pack/plugins/reporting/server/core.ts index 5a2b8c15333967..112b08e70df2a6 100644 --- a/x-pack/plugins/reporting/server/core.ts +++ b/x-pack/plugins/reporting/server/core.ts @@ -8,7 +8,7 @@ import * as Rx from 'rxjs'; import { map, take } from 'rxjs'; -import type { +import { AnalyticsServiceStart, CoreSetup, DocLinksServiceSetup, @@ -237,41 +237,6 @@ export class ReportingCore { return exportTypes; } - /** - * If xpack.reporting.roles.enabled === true, register Reporting as a feature - * that is controlled by user role names - */ - public registerFeature() { - const { features } = this.getPluginSetupDeps(); - const deprecatedRoles = this.getDeprecatedAllowedRoles(); - - if (deprecatedRoles !== false) { - // refer to roles.allow configuration (deprecated path) - const allowedRoles = ['superuser', ...(deprecatedRoles ?? [])]; - const privileges = allowedRoles.map((role) => ({ - requiredClusterPrivileges: [], - requiredRoles: [role], - ui: [], - })); - - // self-register as an elasticsearch feature (deprecated) - features.registerElasticsearchFeature({ - id: 'reporting', - catalogue: ['reporting'], - management: { - insightsAndAlerting: ['reporting'], - }, - privileges, - }); - } else { - this.logger.debug( - `Reporting roles configuration is disabled. Please assign access to Reporting use Kibana feature controls for applications.` - ); - // trigger application to register Reporting as a subfeature - features.enableReportingUiCapabilities(); - } - } - /* * Returns configurable server info */ diff --git a/x-pack/plugins/reporting/server/features.ts b/x-pack/plugins/reporting/server/features.ts new file mode 100644 index 00000000000000..45666e2b2460d9 --- /dev/null +++ b/x-pack/plugins/reporting/server/features.ts @@ -0,0 +1,74 @@ +/* + * Copyright 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 { DEFAULT_APP_CATEGORIES, type Logger } from '@kbn/core/server'; +import { i18n } from '@kbn/i18n'; +import type { PluginSetupContract as FeaturesPluginSetup } from '@kbn/features-plugin/server'; + +interface FeatureRegistrationOpts { + features: FeaturesPluginSetup; + deprecatedRoles: string[] | false; + isServerless: boolean; + logger: Logger; +} + +/** + * If xpack.reporting.roles.enabled === true, register Reporting as a feature + * that is controlled by user role names. Also, for Serverless register a + * 'shell' Reporting Kibana feature. + */ +export function registerFeatures({ + isServerless, + features, + deprecatedRoles, + logger, +}: FeatureRegistrationOpts) { + // Register a 'shell' feature specifically for Serverless. If granted, it will automatically provide access to + // reporting capabilities in other features, such as Discover, Dashboards, and Visualizations. On its own, this + // feature doesn't grant any additional privileges. + if (isServerless) { + features.registerKibanaFeature({ + id: 'reporting', + name: i18n.translate('xpack.reporting.features.reportingFeatureName', { + defaultMessage: 'Reporting', + }), + category: DEFAULT_APP_CATEGORIES.management, + app: [], + privileges: { + all: { savedObject: { all: [], read: [] }, ui: [] }, + // No read-only mode currently supported + read: { disabled: true, savedObject: { all: [], read: [] }, ui: [] }, + }, + }); + } + + if (deprecatedRoles !== false) { + // refer to roles.allow configuration (deprecated path) + const allowedRoles = ['superuser', ...(deprecatedRoles ?? [])]; + const privileges = allowedRoles.map((role) => ({ + requiredClusterPrivileges: [], + requiredRoles: [role], + ui: [], + })); + + // self-register as an elasticsearch feature (deprecated) + features.registerElasticsearchFeature({ + id: 'reporting', + catalogue: ['reporting'], + management: { + insightsAndAlerting: ['reporting'], + }, + privileges, + }); + } else { + logger.debug( + `Reporting roles configuration is disabled. Please assign access to Reporting use Kibana feature controls for applications.` + ); + // trigger application to register Reporting as a subfeature + features.enableReportingUiCapabilities(); + } +} diff --git a/x-pack/plugins/reporting/server/plugin.test.ts b/x-pack/plugins/reporting/server/plugin.test.ts index 8e1149b5d80f62..4abb64dc13e8bc 100644 --- a/x-pack/plugins/reporting/server/plugin.test.ts +++ b/x-pack/plugins/reporting/server/plugin.test.ts @@ -5,8 +5,15 @@ * 2.0. */ -import type { CoreSetup, CoreStart, Logger } from '@kbn/core/server'; +import { + CoreSetup, + CoreStart, + DEFAULT_APP_CATEGORIES, + Logger, + type PackageInfo, +} from '@kbn/core/server'; import { coreMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { featuresPluginMock } from '@kbn/features-plugin/server/mocks'; import { createMockConfigSchema } from '@kbn/reporting-mocks-server'; import { CSV_REPORT_TYPE, CSV_REPORT_TYPE_V2 } from '@kbn/reporting-export-types-csv-common'; @@ -18,6 +25,7 @@ import { ReportingPlugin } from './plugin'; import { createMockPluginSetup, createMockPluginStart } from './test_helpers'; import type { ReportingSetupDeps } from './types'; import { ExportTypesRegistry } from '@kbn/reporting-server/export_types_registry'; +import { PluginSetupContract as FeaturesPluginSetupContract } from '@kbn/features-plugin/server'; const sleep = (time: number) => new Promise((r) => setTimeout(r, time)); @@ -30,6 +38,7 @@ describe('Reporting Plugin', () => { let pluginStart: ReportingInternalStart; let logger: jest.Mocked; let plugin: ReportingPlugin; + let featuresSetup: jest.Mocked; beforeEach(async () => { jest.clearAllMocks(); @@ -38,7 +47,10 @@ describe('Reporting Plugin', () => { initContext = coreMock.createPluginInitializerContext(configSchema); coreSetup = coreMock.createSetup(configSchema); coreStart = coreMock.createStart(); - pluginSetup = createMockPluginSetup({}) as unknown as ReportingSetupDeps; + featuresSetup = featuresPluginMock.createSetup(); + pluginSetup = createMockPluginSetup({ + features: featuresSetup, + }) as unknown as ReportingSetupDeps; pluginStart = await createMockPluginStart(coreStart, configSchema); logger = loggingSystemMock.createLogger(); @@ -143,4 +155,33 @@ describe('Reporting Plugin', () => { ); }); }); + + describe('features registration', () => { + it('does not register Kibana reporting feature in traditional build flavour', async () => { + plugin.setup(coreSetup, pluginSetup); + expect(featuresSetup.registerKibanaFeature).not.toHaveBeenCalled(); + expect(featuresSetup.enableReportingUiCapabilities).toHaveBeenCalledTimes(1); + }); + + it('registers Kibana reporting feature in serverless build flavour', async () => { + const serverlessInitContext = coreMock.createPluginInitializerContext(configSchema); + // Force type-cast to convert `ReadOnly` to mutable `PackageInfo`. + (serverlessInitContext.env.packageInfo as PackageInfo).buildFlavor = 'serverless'; + plugin = new ReportingPlugin(serverlessInitContext); + + plugin.setup(coreSetup, pluginSetup); + expect(featuresSetup.registerKibanaFeature).toHaveBeenCalledTimes(1); + expect(featuresSetup.registerKibanaFeature).toHaveBeenCalledWith({ + id: 'reporting', + name: 'Reporting', + category: DEFAULT_APP_CATEGORIES.management, + app: [], + privileges: { + all: { savedObject: { all: [], read: [] }, ui: [] }, + read: { disabled: true, savedObject: { all: [], read: [] }, ui: [] }, + }, + }); + expect(featuresSetup.enableReportingUiCapabilities).toHaveBeenCalledTimes(1); + }); + }); }); diff --git a/x-pack/plugins/reporting/server/plugin.ts b/x-pack/plugins/reporting/server/plugin.ts index ea4722ef5c30ef..3e68310f76cf4b 100644 --- a/x-pack/plugins/reporting/server/plugin.ts +++ b/x-pack/plugins/reporting/server/plugin.ts @@ -26,6 +26,7 @@ import type { } from './types'; import { ReportingRequestHandlerContext } from './types'; import { registerReportingEventTypes, registerReportingUsageCollector } from './usage'; +import { registerFeatures } from './features'; /* * @internal @@ -79,8 +80,13 @@ export class ReportingPlugin // async background setup (async () => { - // Feature registration relies on config, so it cannot be setup before here. - reportingCore.registerFeature(); + // Feature registration relies on config, depending on whether deprecated roles are enabled, so it cannot be setup before here. + registerFeatures({ + features: plugins.features, + deprecatedRoles: reportingCore.getDeprecatedAllowedRoles(), + isServerless: this.initContext.env.packageInfo.buildFlavor === 'serverless', + logger: this.logger, + }); this.logger.debug('Setup complete'); })().catch((e) => { this.logger.error(`Error in Reporting setup, reporting may not function properly`); diff --git a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js index 5a30f9e6ec5f39..16ec3dd11c20e2 100644 --- a/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js +++ b/x-pack/plugins/rollup/public/crud_app/sections/job_list/job_table/job_table.js @@ -305,7 +305,6 @@ export class JobTable extends Component { { @@ -393,7 +392,6 @@ export class JobTable extends Component { id="selectAllJobsCheckbox" checked={this.areAllItemsSelected()} onChange={this.toggleAll} - type="inList" aria-label={i18n.translate('xpack.rollupJobs.jobTable.selectAllRows', { defaultMessage: 'Select all rows', })} diff --git a/x-pack/plugins/security/common/model/api_key.ts b/x-pack/plugins/security/common/model/api_key.ts index 91b144cdc43269..639cf6568c709e 100644 --- a/x-pack/plugins/security/common/model/api_key.ts +++ b/x-pack/plugins/security/common/model/api_key.ts @@ -113,5 +113,5 @@ interface BaseQueryApiKeyResult { canManageApiKeys: boolean; canManageOwnApiKeys: boolean; aggregationTotal: number; - aggregations: Record | undefined; + aggregations: Record | undefined; } diff --git a/x-pack/plugins/security/public/authentication/index.mock.ts b/x-pack/plugins/security/public/authentication/index.mock.ts index 58035767e0f2ca..491b5b82e946a6 100644 --- a/x-pack/plugins/security/public/authentication/index.mock.ts +++ b/x-pack/plugins/security/public/authentication/index.mock.ts @@ -26,8 +26,20 @@ export const authenticationMock = { export const authorizationMock = { createSetup: (): jest.Mocked => ({ isRoleManagementEnabled: jest.fn(), + roles: { + getRoles: jest.fn(), + getRole: jest.fn(), + deleteRole: jest.fn(), + saveRole: jest.fn(), + }, }), createStart: (): jest.Mocked => ({ isRoleManagementEnabled: jest.fn(), + roles: { + getRoles: jest.fn(), + getRole: jest.fn(), + deleteRole: jest.fn(), + saveRole: jest.fn(), + }, }), }; diff --git a/x-pack/plugins/security/public/authorization/authorization_service.ts b/x-pack/plugins/security/public/authorization/authorization_service.ts index 8f003dde8659f7..6e0af055a6cda5 100644 --- a/x-pack/plugins/security/public/authorization/authorization_service.ts +++ b/x-pack/plugins/security/public/authorization/authorization_service.ts @@ -5,18 +5,30 @@ * 2.0. */ +import type { HttpStart } from '@kbn/core/public'; import type { AuthorizationServiceSetup } from '@kbn/security-plugin-types-public'; import type { ConfigType } from '../config'; +import { RolesAPIClient } from '../management'; interface SetupParams { config: ConfigType; + http: HttpStart; } export class AuthorizationService { - public setup({ config }: SetupParams): AuthorizationServiceSetup { + public setup({ config, http }: SetupParams): AuthorizationServiceSetup { const isRoleManagementEnabled = () => config.roleManagementEnabled; + const rolesAPIClient = new RolesAPIClient(http); - return { isRoleManagementEnabled }; + return { + isRoleManagementEnabled, + roles: { + getRoles: rolesAPIClient.getRoles, + getRole: rolesAPIClient.getRole, + deleteRole: rolesAPIClient.deleteRole, + saveRole: rolesAPIClient.saveRole, + }, + }; } } diff --git a/x-pack/plugins/security/public/management/index.ts b/x-pack/plugins/security/public/management/index.ts index fc62c29b3047e4..a47475485896de 100644 --- a/x-pack/plugins/security/public/management/index.ts +++ b/x-pack/plugins/security/public/management/index.ts @@ -7,3 +7,4 @@ export { ManagementService } from './management_service'; export { UserAPIClient } from './users/user_api_client'; +export { RolesAPIClient } from './roles'; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx index 36e6a5782f7849..ccdc71d119f08f 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx @@ -308,7 +308,7 @@ function useFeatures( fatalErrors.add(err); }) .then((retrievedFeatures) => { - setFeatures(retrievedFeatures); + setFeatures(retrievedFeatures?.filter((feature) => !feature.hidden) ?? null); }); }, [fatalErrors, getFeatures]); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privilege_form.test.tsx.snap b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privilege_form.test.tsx.snap index 7080b6a70be9b5..5107e8abf2e0ba 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privilege_form.test.tsx.snap +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/__snapshots__/index_privilege_form.test.tsx.snap @@ -14,7 +14,25 @@ exports[`it renders without crashing 1`] = ` - + - + - + - +
    { + {buildFlavor === 'traditional' && canUseRemoteClusters && ( + <> + +

    + +

    +
    + + +

    + + {this.learnMore(docLinks.links.security.clusterPrivileges)} +

    +
    + + + + + )} {buildFlavor === 'traditional' && ( <> @@ -222,40 +255,6 @@ export class ElasticsearchPrivileges extends Component { /> )} - {buildFlavor === 'traditional' && canUseRemoteClusters && ( - <> - - - - -

    - -

    -
    - - -

    - - {this.learnMore(docLinks.links.security.clusterPrivileges)} -

    -
    - - - )} ); }; diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx index f89195e624f5bb..301f4b4aeea74e 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/index_privilege_form.tsx @@ -9,6 +9,7 @@ import type { EuiComboBoxOptionOption } from '@elastic/eui'; import { EuiButtonIcon, EuiComboBox, + EuiFlexGrid, EuiFlexGroup, EuiFlexItem, EuiFormRow, @@ -16,6 +17,7 @@ import { EuiSpacer, EuiSwitch, } from '@elastic/eui'; +import { css } from '@emotion/react'; import _ from 'lodash'; import React, { Component, Fragment } from 'react'; @@ -24,6 +26,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { monaco } from '@kbn/monaco'; import type { Cluster } from '@kbn/remote-clusters-plugin/public'; +import { euiThemeVars } from '@kbn/ui-theme'; import type { PublicMethodsOf } from '@kbn/utility-types'; import { RemoteClusterComboBox } from './remote_clusters_combo_box'; @@ -127,7 +130,17 @@ export class IndexPrivilegeForm extends Component { private getPrivilegeForm = () => { return ( <> - + {this.props.indexType === 'remote_indices' ? ( { /> - + {this.getFieldLevelControls()} {this.getGrantedDocumentsControl()} diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx index 5e55ebaf1d2812..7f406df106f724 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/es/remote_cluster_privileges_form.tsx @@ -9,17 +9,20 @@ import type { EuiComboBoxOptionOption } from '@elastic/eui'; import { EuiButtonIcon, EuiComboBox, + EuiFlexGrid, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiPanel, EuiSpacer, } from '@elastic/eui'; +import { css } from '@emotion/react'; import React, { Fragment, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import type { Cluster } from '@kbn/remote-clusters-plugin/public'; +import { euiThemeVars } from '@kbn/ui-theme'; import { RemoteClusterComboBox } from './remote_clusters_combo_box'; import type { RoleRemoteClusterPrivilege } from '../../../../../../common'; @@ -92,7 +95,14 @@ export const RemoteClusterPrivilegesForm: React.FunctionComponent = ({ > - + = ({ /> - + {!isRoleReadOnly && ( diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/sub_feature_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/sub_feature_form.tsx index 90f26eee5a930c..03ed9597fcb2db 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/sub_feature_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/feature_table/sub_feature_form.tsx @@ -36,9 +36,7 @@ interface Props { } export const SubFeatureForm = (props: Props) => { - const groupsWithPrivileges = props.subFeature - .getPrivilegeGroups() - .filter((group) => group.privileges.length > 0); + const groupsWithPrivileges = props.subFeature.getPrivilegeGroups(); const getTooltip = () => { if (!props.subFeature.privilegesTooltip) { diff --git a/x-pack/plugins/security/public/management/roles/model/secured_sub_feature.ts b/x-pack/plugins/security/public/management/roles/model/secured_sub_feature.ts index 79e98625cb06f1..11ac512cd5a181 100644 --- a/x-pack/plugins/security/public/management/roles/model/secured_sub_feature.ts +++ b/x-pack/plugins/security/public/management/roles/model/secured_sub_feature.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { SubFeatureConfig } from '@kbn/features-plugin/common'; +import type { SubFeatureConfig, SubFeaturePrivilegeGroupConfig } from '@kbn/features-plugin/common'; import { SubFeature } from '@kbn/features-plugin/common'; import { SubFeaturePrivilege } from './sub_feature_privilege'; @@ -14,6 +14,10 @@ import { SubFeaturePrivilegeGroup } from './sub_feature_privilege_group'; export class SecuredSubFeature extends SubFeature { public readonly privileges: SubFeaturePrivilege[]; public readonly privilegesTooltip: string; + /** + * A list of the privilege groups that have at least one enabled privilege. + */ + private readonly nonEmptyPrivilegeGroups: SubFeaturePrivilegeGroupConfig[]; constructor( config: SubFeatureConfig, @@ -23,14 +27,27 @@ export class SecuredSubFeature extends SubFeature { this.privilegesTooltip = config.privilegesTooltip || ''; - this.privileges = []; - for (const privilege of this.privilegeIterator()) { - this.privileges.push(privilege); - } + this.nonEmptyPrivilegeGroups = this.privilegeGroups.flatMap((group) => { + const filteredPrivileges = group.privileges.filter((privilege) => !privilege.disabled); + if (filteredPrivileges.length === 0) { + return []; + } + + // If some privileges are disabled, we need to update the group to reflect the change. + return [ + group.privileges.length === filteredPrivileges.length + ? group + : ({ ...group, privileges: filteredPrivileges } as SubFeaturePrivilegeGroupConfig), + ]; + }); + + this.privileges = Array.from(this.privilegeIterator()); } public getPrivilegeGroups() { - return this.privilegeGroups.map((pg) => new SubFeaturePrivilegeGroup(pg, this.actionMapping)); + return this.nonEmptyPrivilegeGroups.map( + (pg) => new SubFeaturePrivilegeGroup(pg, this.actionMapping) + ); } public *privilegeIterator({ @@ -38,10 +55,13 @@ export class SecuredSubFeature extends SubFeature { }: { predicate?: (privilege: SubFeaturePrivilege, feature: SecuredSubFeature) => boolean; } = {}): IterableIterator { - for (const group of this.privilegeGroups) { - yield* group.privileges - .map((gp) => new SubFeaturePrivilege(gp, this.actionMapping[gp.id])) - .filter((privilege) => predicate(privilege, this)); + for (const group of this.nonEmptyPrivilegeGroups) { + for (const gp of group.privileges) { + const privilege = new SubFeaturePrivilege(gp, this.actionMapping[gp.id]); + if (predicate(privilege, this)) { + yield privilege; + } + } } } diff --git a/x-pack/plugins/security/public/management/roles/model/sub_feature_privilege.ts b/x-pack/plugins/security/public/management/roles/model/sub_feature_privilege.ts index b5897654a6a389..e9b58ba8b22940 100644 --- a/x-pack/plugins/security/public/management/roles/model/sub_feature_privilege.ts +++ b/x-pack/plugins/security/public/management/roles/model/sub_feature_privilege.ts @@ -21,6 +21,10 @@ export class SubFeaturePrivilege extends KibanaPrivilege { return this.subPrivilegeConfig.name; } + public get disabled() { + return this.subPrivilegeConfig.disabled; + } + public get requireAllSpaces() { return this.subPrivilegeConfig.requireAllSpaces ?? false; } diff --git a/x-pack/plugins/security/public/management/roles/roles_api_client.ts b/x-pack/plugins/security/public/management/roles/roles_api_client.ts index 3742569e9cc72b..c870f99e24dd3e 100644 --- a/x-pack/plugins/security/public/management/roles/roles_api_client.ts +++ b/x-pack/plugins/security/public/management/roles/roles_api_client.ts @@ -13,26 +13,26 @@ import { copyRole } from '../../../common/model'; export class RolesAPIClient { constructor(private readonly http: HttpStart) {} - public async getRoles() { + public getRoles = async () => { return await this.http.get('/api/security/role'); - } + }; - public async getRole(roleName: string) { + public getRole = async (roleName: string) => { return await this.http.get(`/api/security/role/${encodeURIComponent(roleName)}`); - } + }; - public async deleteRole(roleName: string) { + public deleteRole = async (roleName: string) => { await this.http.delete(`/api/security/role/${encodeURIComponent(roleName)}`); - } + }; - public async saveRole({ role, createOnly = false }: { role: Role; createOnly?: boolean }) { + public saveRole = async ({ role, createOnly = false }: { role: Role; createOnly?: boolean }) => { await this.http.put(`/api/security/role/${encodeURIComponent(role.name)}`, { body: JSON.stringify(this.transformRoleForSave(copyRole(role))), query: { createOnly }, }); - } + }; - private transformRoleForSave(role: Role) { + private transformRoleForSave = (role: Role) => { // Remove any placeholder index privileges const isPlaceholderPrivilege = ( indexPrivilege: RoleIndexPrivilege | RoleRemoteIndexPrivilege @@ -71,5 +71,5 @@ export class RolesAPIClient { delete role._transform_error; return role; - } + }; } diff --git a/x-pack/plugins/security/public/plugin.test.tsx b/x-pack/plugins/security/public/plugin.test.tsx index e58ff7ba5e325f..874196f3e4c0e2 100644 --- a/x-pack/plugins/security/public/plugin.test.tsx +++ b/x-pack/plugins/security/public/plugin.test.tsx @@ -40,7 +40,7 @@ describe('Security Plugin', () => { }) ).toEqual({ authc: { getCurrentUser: expect.any(Function), areAPIKeysEnabled: expect.any(Function) }, - authz: { isRoleManagementEnabled: expect.any(Function) }, + authz: { isRoleManagementEnabled: expect.any(Function), roles: expect.any(Object) }, license: { isLicenseAvailable: expect.any(Function), isEnabled: expect.any(Function), @@ -127,6 +127,12 @@ describe('Security Plugin', () => { }, "authz": Object { "isRoleManagementEnabled": [Function], + "roles": Object { + "deleteRole": [Function], + "getRole": [Function], + "getRoles": [Function], + "saveRole": [Function], + }, }, "navControlService": Object { "addUserMenuLinks": [Function], diff --git a/x-pack/plugins/security/public/plugin.tsx b/x-pack/plugins/security/public/plugin.tsx index 429437e9fa39ab..a094082b6a430c 100644 --- a/x-pack/plugins/security/public/plugin.tsx +++ b/x-pack/plugins/security/public/plugin.tsx @@ -115,6 +115,7 @@ export class SecurityPlugin this.authz = this.authorizationService.setup({ config: this.config, + http: core.http, }); this.securityApiClients = { diff --git a/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts b/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts index e27a30ae424457..93efd86f52f54b 100644 --- a/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts +++ b/x-pack/plugins/security/server/authorization/privileges/privileges.test.ts @@ -185,6 +185,293 @@ describe('features', () => { }); }); + test('actions should respect `composedOf` specified at the privilege', () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, + }), + new KibanaFeature({ + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, + privileges: { + all: { + savedObject: { + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], + }, + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], + }, + read: { + savedObject: { + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], + }, + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], + }, + }, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const expectedAllPrivileges = [ + actions.login, + actions.savedObject.get('all-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-2', 'get'), + actions.savedObject.get('all-savedObject-all-2', 'find'), + actions.savedObject.get('all-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'create'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-2', 'update'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-2', 'delete'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-2', 'get'), + actions.savedObject.get('all-savedObject-read-2', 'find'), + actions.savedObject.get('all-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'all-ui-2'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-1', 'get'), + actions.savedObject.get('all-savedObject-all-1', 'find'), + actions.savedObject.get('all-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'create'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-1', 'update'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-1', 'delete'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-1', 'get'), + actions.savedObject.get('all-savedObject-read-1', 'find'), + actions.savedObject.get('all-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'all-ui-1'), + ]; + + const expectedReadPrivileges = [ + actions.login, + actions.savedObject.get('read-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-2', 'get'), + actions.savedObject.get('read-savedObject-all-2', 'find'), + actions.savedObject.get('read-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'create'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-2', 'update'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-2', 'delete'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-2', 'get'), + actions.savedObject.get('read-savedObject-read-2', 'find'), + actions.savedObject.get('read-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'read-ui-2'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-1', 'get'), + actions.savedObject.get('read-savedObject-all-1', 'find'), + actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'create'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-1', 'update'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-1', 'delete'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-1', 'get'), + actions.savedObject.get('read-savedObject-read-1', 'find'), + actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'read-ui-1'), + ]; + + const actual = privileges.get(); + expect(actual).toHaveProperty('features.bar', { + all: [...expectedAllPrivileges], + read: [...expectedReadPrivileges], + minimal_all: [...expectedAllPrivileges], + minimal_read: [...expectedReadPrivileges], + }); + }); + + test('actions should respect `composedOf` specified at the privilege even if the referenced feature is hidden', () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + hidden: true, + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, + }), + new KibanaFeature({ + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, + privileges: { + all: { + savedObject: { + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], + }, + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], + }, + read: { + savedObject: { + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], + }, + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], + }, + }, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const expectedAllPrivileges = [ + actions.login, + actions.savedObject.get('all-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-2', 'get'), + actions.savedObject.get('all-savedObject-all-2', 'find'), + actions.savedObject.get('all-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'create'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-2', 'update'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-2', 'delete'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-2', 'get'), + actions.savedObject.get('all-savedObject-read-2', 'find'), + actions.savedObject.get('all-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'all-ui-2'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-1', 'get'), + actions.savedObject.get('all-savedObject-all-1', 'find'), + actions.savedObject.get('all-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'create'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-1', 'update'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-1', 'delete'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-1', 'get'), + actions.savedObject.get('all-savedObject-read-1', 'find'), + actions.savedObject.get('all-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'all-ui-1'), + ]; + + const expectedReadPrivileges = [ + actions.login, + actions.savedObject.get('read-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-2', 'get'), + actions.savedObject.get('read-savedObject-all-2', 'find'), + actions.savedObject.get('read-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'create'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-2', 'update'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-2', 'delete'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-2', 'get'), + actions.savedObject.get('read-savedObject-read-2', 'find'), + actions.savedObject.get('read-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'read-ui-2'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-1', 'get'), + actions.savedObject.get('read-savedObject-all-1', 'find'), + actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'create'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-1', 'update'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-1', 'delete'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-1', 'get'), + actions.savedObject.get('read-savedObject-read-1', 'find'), + actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'read-ui-1'), + ]; + + const actual = privileges.get(); + expect(actual).toHaveProperty('features.bar', { + all: [...expectedAllPrivileges], + read: [...expectedReadPrivileges], + minimal_all: [...expectedAllPrivileges], + minimal_read: [...expectedReadPrivileges], + }); + }); + test(`features with no privileges aren't listed`, () => { const features: KibanaFeature[] = [ new KibanaFeature({ @@ -192,7 +479,50 @@ describe('features', () => { name: 'Foo KibanaFeature', app: [], category: { id: 'foo', label: 'foo' }, - privileges: null, + privileges: null, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const actual = privileges.get(); + expect(actual).not.toHaveProperty('features.foo'); + }); + + test(`hidden features aren't listed`, () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + hidden: true, + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-1'], + }, + catalogue: ['all-catalogue-1'], + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + management: { + 'read-management': ['read-management-1'], + }, + catalogue: ['read-catalogue-1'], + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, }), ]; @@ -202,6 +532,12 @@ describe('features', () => { const actual = privileges.get(); expect(actual).not.toHaveProperty('features.foo'); + + const checkPredicate = (action: string) => action.includes('all-') || action.includes('read-'); + expect(actual.global.all.some(checkPredicate)).toBe(false); + expect(actual.global.read.some(checkPredicate)).toBe(false); + expect(actual.space.all.some(checkPredicate)).toBe(false); + expect(actual.space.read.some(checkPredicate)).toBe(false); }); }); @@ -377,69 +713,362 @@ describe('features', () => { ]); }); - test('actions defined in a feature privilege with name `read` are included in `read`', () => { - const features: KibanaFeature[] = [ + test('actions defined in any feature privilege of a hidden but referenced feature are included in `all`, ignoring the excludeFromBasePrivileges property', () => { + const getFeatures = ({ + excludeFromBasePrivileges, + }: { + excludeFromBasePrivileges: boolean; + }) => [ + new KibanaFeature({ + hidden: true, + excludeFromBasePrivileges, + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-1'], + }, + catalogue: ['all-catalogue-1'], + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + management: { + 'read-management': ['read-management-1'], + }, + catalogue: ['read-catalogue-1'], + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, + }), + new KibanaFeature({ + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-2'], + }, + catalogue: ['all-catalogue-2'], + savedObject: { + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], + }, + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], + }, + read: { + management: { + 'read-management': ['read-management-2'], + }, + catalogue: ['read-catalogue-2'], + savedObject: { + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], + }, + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], + }, + }, + }), + ]; + + const expectedActions = [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGetFeatures ? [actions.api.get('features')] : []), + ...(expectGetFeatures ? [actions.api.get('taskManager')] : []), + ...(expectGetFeatures ? [actions.api.get('manageSpaces')] : []), + ...(expectManageSpaces + ? [ + actions.space.manage, + actions.ui.get('spaces', 'manage'), + actions.ui.get('management', 'kibana', 'spaces'), + actions.ui.get('catalogue', 'spaces'), + ] + : []), + ...(expectEnterpriseSearch ? [actions.ui.get('enterpriseSearch', 'all')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'save')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + actions.ui.get('catalogue', 'all-catalogue-2'), + actions.ui.get('management', 'all-management', 'all-management-2'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-2', 'get'), + actions.savedObject.get('all-savedObject-all-2', 'find'), + actions.savedObject.get('all-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-2', 'create'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-2', 'update'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-2', 'delete'), + actions.savedObject.get('all-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-2', 'get'), + actions.savedObject.get('all-savedObject-read-2', 'find'), + actions.savedObject.get('all-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'all-ui-2'), + actions.ui.get('catalogue', 'read-catalogue-2'), + actions.ui.get('management', 'read-management', 'read-management-2'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-2', 'get'), + actions.savedObject.get('read-savedObject-all-2', 'find'), + actions.savedObject.get('read-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'create'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-2', 'update'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-2', 'delete'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-2', 'get'), + actions.savedObject.get('read-savedObject-read-2', 'find'), + actions.savedObject.get('read-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'read-ui-2'), + actions.ui.get('catalogue', 'all-catalogue-1'), + actions.ui.get('management', 'all-management', 'all-management-1'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-all-1', 'get'), + actions.savedObject.get('all-savedObject-all-1', 'find'), + actions.savedObject.get('all-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('all-savedObject-all-1', 'create'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('all-savedObject-all-1', 'update'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('all-savedObject-all-1', 'delete'), + actions.savedObject.get('all-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('all-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('all-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('all-savedObject-read-1', 'get'), + actions.savedObject.get('all-savedObject-read-1', 'find'), + actions.savedObject.get('all-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('all-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'all-ui-1'), + actions.ui.get('catalogue', 'read-catalogue-1'), + actions.ui.get('management', 'read-management', 'read-management-1'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-1', 'get'), + actions.savedObject.get('read-savedObject-all-1', 'find'), + actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'create'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-1', 'update'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-1', 'delete'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-1', 'get'), + actions.savedObject.get('read-savedObject-read-1', 'find'), + actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), + actions.ui.get('foo', 'read-ui-1'), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue( + getFeatures({ excludeFromBasePrivileges: false }) + ); + expect( + privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic).get() + ).toHaveProperty(`${group}.all`, expectedActions); + + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue( + getFeatures({ excludeFromBasePrivileges: true }) + ); + expect( + privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic).get() + ).toHaveProperty(`${group}.all`, expectedActions); + }); + + test('actions defined in a feature privilege with name `read` are included in `read`', () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + catalogue: ['ignore-me-1', 'ignore-me-2'], + management: { + foo: ['ignore-me-1', 'ignore-me-2'], + }, + privileges: { + all: { + management: { + 'ignore-me': ['ignore-me-1', 'ignore-me-2'], + }, + catalogue: ['ignore-me-1', 'ignore-me-2'], + savedObject: { + all: ['ignore-me-1', 'ignore-me-2'], + read: ['ignore-me-1', 'ignore-me-2'], + }, + ui: ['ignore-me-1', 'ignore-me-2'], + }, + read: { + management: { + 'read-management': ['read-management-1', 'read-management-2'], + }, + catalogue: ['read-catalogue-1', 'read-catalogue-2'], + savedObject: { + all: ['read-savedObject-all-1', 'read-savedObject-all-2'], + read: ['read-savedObject-read-1', 'read-savedObject-read-2'], + }, + ui: ['read-ui-1', 'read-ui-2'], + }, + }, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const actual = privileges.get(); + expect(actual).toHaveProperty(`${group}.read`, [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + actions.ui.get('catalogue', 'read-catalogue-1'), + actions.ui.get('catalogue', 'read-catalogue-2'), + actions.ui.get('management', 'read-management', 'read-management-1'), + actions.ui.get('management', 'read-management', 'read-management-2'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-1', 'get'), + actions.savedObject.get('read-savedObject-all-1', 'find'), + actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'create'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-1', 'update'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-1', 'delete'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-2', 'get'), + actions.savedObject.get('read-savedObject-all-2', 'find'), + actions.savedObject.get('read-savedObject-all-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-2', 'create'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-2', 'update'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-2', 'delete'), + actions.savedObject.get('read-savedObject-all-2', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-2', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-1', 'get'), + actions.savedObject.get('read-savedObject-read-1', 'find'), + actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-read-2', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-2', 'get'), + actions.savedObject.get('read-savedObject-read-2', 'find'), + actions.savedObject.get('read-savedObject-read-2', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('foo', 'read-ui-1'), + actions.ui.get('foo', 'read-ui-2'), + ]); + }); + + test('actions defined in a feature privilege with name `read` of a hidden but referenced feature are included in `read`, ignoring the excludeFromBasePrivileges property', () => { + const getFeatures = ({ + excludeFromBasePrivileges, + }: { + excludeFromBasePrivileges: boolean; + }) => [ new KibanaFeature({ + hidden: true, + excludeFromBasePrivileges, id: 'foo', name: 'Foo KibanaFeature', app: [], category: { id: 'foo', label: 'foo' }, - catalogue: ['ignore-me-1', 'ignore-me-2'], - management: { - foo: ['ignore-me-1', 'ignore-me-2'], + privileges: { + all: { + management: { + 'all-management': ['all-management-1'], + }, + catalogue: ['all-catalogue-1'], + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + management: { + 'read-management': ['read-management-1'], + }, + catalogue: ['read-catalogue-1'], + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, }, + }), + new KibanaFeature({ + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, privileges: { all: { management: { - 'ignore-me': ['ignore-me-1', 'ignore-me-2'], + 'all-management': ['all-management-2'], }, - catalogue: ['ignore-me-1', 'ignore-me-2'], + catalogue: ['all-catalogue-2'], savedObject: { - all: ['ignore-me-1', 'ignore-me-2'], - read: ['ignore-me-1', 'ignore-me-2'], + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], }, - ui: ['ignore-me-1', 'ignore-me-2'], + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], }, read: { management: { - 'read-management': ['read-management-1', 'read-management-2'], + 'read-management': ['read-management-2'], }, - catalogue: ['read-catalogue-1', 'read-catalogue-2'], + catalogue: ['read-catalogue-2'], savedObject: { - all: ['read-savedObject-all-1', 'read-savedObject-all-2'], - read: ['read-savedObject-read-1', 'read-savedObject-read-2'], + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], }, - ui: ['read-ui-1', 'read-ui-2'], + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], }, }, }), ]; - const mockFeaturesPlugin = featuresPluginMock.createSetup(); - mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); - const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); - - const actual = privileges.get(); - expect(actual).toHaveProperty(`${group}.read`, [ + const expectedActions = [ actions.login, ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), - actions.ui.get('catalogue', 'read-catalogue-1'), actions.ui.get('catalogue', 'read-catalogue-2'), - actions.ui.get('management', 'read-management', 'read-management-1'), actions.ui.get('management', 'read-management', 'read-management-2'), - actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), - actions.savedObject.get('read-savedObject-all-1', 'get'), - actions.savedObject.get('read-savedObject-all-1', 'find'), - actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), - actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), - actions.savedObject.get('read-savedObject-all-1', 'create'), - actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), - actions.savedObject.get('read-savedObject-all-1', 'update'), - actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), - actions.savedObject.get('read-savedObject-all-1', 'delete'), - actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), - actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), actions.savedObject.get('read-savedObject-all-2', 'bulk_get'), actions.savedObject.get('read-savedObject-all-2', 'get'), actions.savedObject.get('read-savedObject-all-2', 'find'), @@ -452,19 +1081,49 @@ describe('features', () => { actions.savedObject.get('read-savedObject-all-2', 'delete'), actions.savedObject.get('read-savedObject-all-2', 'bulk_delete'), actions.savedObject.get('read-savedObject-all-2', 'share_to_space'), - actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), - actions.savedObject.get('read-savedObject-read-1', 'get'), - actions.savedObject.get('read-savedObject-read-1', 'find'), - actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), - actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), actions.savedObject.get('read-savedObject-read-2', 'bulk_get'), actions.savedObject.get('read-savedObject-read-2', 'get'), actions.savedObject.get('read-savedObject-read-2', 'find'), actions.savedObject.get('read-savedObject-read-2', 'open_point_in_time'), actions.savedObject.get('read-savedObject-read-2', 'close_point_in_time'), + actions.ui.get('bar', 'read-ui-2'), + actions.ui.get('catalogue', 'read-catalogue-1'), + actions.ui.get('management', 'read-management', 'read-management-1'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-all-1', 'get'), + actions.savedObject.get('read-savedObject-all-1', 'find'), + actions.savedObject.get('read-savedObject-all-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'close_point_in_time'), + actions.savedObject.get('read-savedObject-all-1', 'create'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_create'), + actions.savedObject.get('read-savedObject-all-1', 'update'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_update'), + actions.savedObject.get('read-savedObject-all-1', 'delete'), + actions.savedObject.get('read-savedObject-all-1', 'bulk_delete'), + actions.savedObject.get('read-savedObject-all-1', 'share_to_space'), + actions.savedObject.get('read-savedObject-read-1', 'bulk_get'), + actions.savedObject.get('read-savedObject-read-1', 'get'), + actions.savedObject.get('read-savedObject-read-1', 'find'), + actions.savedObject.get('read-savedObject-read-1', 'open_point_in_time'), + actions.savedObject.get('read-savedObject-read-1', 'close_point_in_time'), actions.ui.get('foo', 'read-ui-1'), - actions.ui.get('foo', 'read-ui-2'), - ]); + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue( + getFeatures({ excludeFromBasePrivileges: false }) + ); + expect( + privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic).get() + ).toHaveProperty(`${group}.read`, expectedActions); + + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue( + getFeatures({ excludeFromBasePrivileges: true }) + ); + expect( + privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic).get() + ).toHaveProperty(`${group}.read`, expectedActions); }); test('actions defined in a reserved privilege are not included in `all` or `read`', () => { @@ -596,6 +1255,104 @@ describe('features', () => { ]); }); + test('actions defined via `composedOf` in a feature with excludeFromBasePrivileges are not included in `all` or `read', () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + hidden: true, + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-1'], + }, + catalogue: ['all-catalogue-1'], + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + management: { + 'read-management': ['read-management-1'], + }, + catalogue: ['read-catalogue-1'], + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, + }), + new KibanaFeature({ + excludeFromBasePrivileges: true, + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-2'], + }, + catalogue: ['all-catalogue-2'], + savedObject: { + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], + }, + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], + }, + read: { + management: { + 'read-management': ['read-management-2'], + }, + catalogue: ['read-catalogue-2'], + savedObject: { + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], + }, + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], + }, + }, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const actual = privileges.get(); + expect(actual).toHaveProperty(`${group}.all`, [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGetFeatures ? [actions.api.get('features')] : []), + ...(expectGetFeatures ? [actions.api.get('taskManager')] : []), + ...(expectGetFeatures ? [actions.api.get('manageSpaces')] : []), + ...(expectManageSpaces + ? [ + actions.space.manage, + actions.ui.get('spaces', 'manage'), + actions.ui.get('management', 'kibana', 'spaces'), + actions.ui.get('catalogue', 'spaces'), + ] + : []), + ...(expectEnterpriseSearch ? [actions.ui.get('enterpriseSearch', 'all')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'save')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + ]); + expect(actual).toHaveProperty(`${group}.read`, [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + ]); + }); + test('actions defined in an individual feature privilege with excludeFromBasePrivileges are not included in `all` or `read`', () => { const features: KibanaFeature[] = [ new KibanaFeature({ @@ -665,6 +1422,105 @@ describe('features', () => { ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), ]); }); + + test('actions defined via `composedOf` in an individual feature privilege with excludeFromBasePrivileges are not included in `all` or `read`', () => { + const features: KibanaFeature[] = [ + new KibanaFeature({ + hidden: true, + id: 'foo', + name: 'Foo KibanaFeature', + app: [], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + management: { + 'all-management': ['all-management-1'], + }, + catalogue: ['all-catalogue-1'], + savedObject: { + all: ['all-savedObject-all-1'], + read: ['all-savedObject-read-1'], + }, + ui: ['all-ui-1'], + }, + read: { + management: { + 'read-management': ['read-management-1'], + }, + catalogue: ['read-catalogue-1'], + savedObject: { + all: ['read-savedObject-all-1'], + read: ['read-savedObject-read-1'], + }, + ui: ['read-ui-1'], + }, + }, + }), + new KibanaFeature({ + id: 'bar', + name: 'Bar KibanaFeature', + app: [], + category: { id: 'bar', label: 'bar' }, + privileges: { + all: { + excludeFromBasePrivileges: true, + management: { + 'all-management': ['all-management-2'], + }, + catalogue: ['all-catalogue-2'], + savedObject: { + all: ['all-savedObject-all-2'], + read: ['all-savedObject-read-2'], + }, + ui: ['all-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['all'] }], + }, + read: { + excludeFromBasePrivileges: true, + management: { + 'read-management': ['read-management-2'], + }, + catalogue: ['read-catalogue-2'], + savedObject: { + all: ['read-savedObject-all-2'], + read: ['read-savedObject-read-2'], + }, + ui: ['read-ui-2'], + composedOf: [{ feature: 'foo', privileges: ['read'] }], + }, + }, + }), + ]; + + const mockFeaturesPlugin = featuresPluginMock.createSetup(); + mockFeaturesPlugin.getKibanaFeatures.mockReturnValue(features); + const privileges = privilegesFactory(actions, mockFeaturesPlugin, mockLicenseServiceBasic); + + const actual = privileges.get(); + expect(actual).toHaveProperty(`${group}.all`, [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGetFeatures ? [actions.api.get('features')] : []), + ...(expectGetFeatures ? [actions.api.get('taskManager')] : []), + ...(expectGetFeatures ? [actions.api.get('manageSpaces')] : []), + ...(expectManageSpaces + ? [ + actions.space.manage, + actions.ui.get('spaces', 'manage'), + actions.ui.get('management', 'kibana', 'spaces'), + actions.ui.get('catalogue', 'spaces'), + ] + : []), + ...(expectEnterpriseSearch ? [actions.ui.get('enterpriseSearch', 'all')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'save')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + ]); + expect(actual).toHaveProperty(`${group}.read`, [ + actions.login, + ...(expectDecryptedTelemetry ? [actions.api.get('decryptedTelemetry')] : []), + ...(expectGlobalSettings ? [actions.ui.get('globalSettings', 'show')] : []), + ]); + }); }); } ); diff --git a/x-pack/plugins/security/server/authorization/privileges/privileges.ts b/x-pack/plugins/security/server/authorization/privileges/privileges.ts index e9e8ccbfe8d927..ee1901520df85d 100644 --- a/x-pack/plugins/security/server/authorization/privileges/privileges.ts +++ b/x-pack/plugins/security/server/authorization/privileges/privileges.ts @@ -7,6 +7,10 @@ import { uniq } from 'lodash'; +import type { + FeatureKibanaPrivileges, + FeatureKibanaPrivilegesReference, +} from '@kbn/features-plugin/common'; import type { PluginSetupContract as FeaturesPluginSetup, KibanaFeature, @@ -41,6 +45,10 @@ export function privilegesFactory( const readActionsSet = new Set(); basePrivilegeFeatures.forEach((feature) => { + if (feature.hidden) { + return; + } + for (const { privilegeId, privilege } of featuresService.featurePrivilegeIterator(feature, { augmentWithSubFeaturePrivileges: true, licenseHasAtLeast, @@ -56,9 +64,31 @@ export function privilegesFactory( } }); - const allActions = [...allActionsSet]; - const readActions = [...readActionsSet]; + // Remember privilege as composable to update it later, once actions for all referenced privileges are also + // calculated and registered. + const composableFeaturePrivileges: Array<{ + featureId: string; + privilegeId: string; + excludeFromBasePrivileges?: boolean; + composedOf: readonly FeatureKibanaPrivilegesReference[]; + }> = []; + const tryStoreComposableFeature = ( + feature: KibanaFeature, + privilegeId: string, + privilege: FeatureKibanaPrivileges + ) => { + if (privilege.composedOf) { + composableFeaturePrivileges.push({ + featureId: feature.id, + privilegeId, + composedOf: privilege.composedOf, + excludeFromBasePrivileges: + feature.excludeFromBasePrivileges || privilege.excludeFromBasePrivileges, + }); + } + }; + const hiddenFeatures = new Set(); const featurePrivileges: Record> = {}; for (const feature of features) { featurePrivileges[feature.id] = {}; @@ -66,20 +96,26 @@ export function privilegesFactory( augmentWithSubFeaturePrivileges: true, licenseHasAtLeast, })) { - featurePrivileges[feature.id][featurePrivilege.privilegeId] = [ + const fullPrivilegeId = featurePrivilege.privilegeId; + featurePrivileges[feature.id][fullPrivilegeId] = [ actions.login, ...uniq(featurePrivilegeBuilder.getActions(featurePrivilege.privilege, feature)), ]; + + tryStoreComposableFeature(feature, fullPrivilegeId, featurePrivilege.privilege); } for (const featurePrivilege of featuresService.featurePrivilegeIterator(feature, { augmentWithSubFeaturePrivileges: false, licenseHasAtLeast, })) { - featurePrivileges[feature.id][`minimal_${featurePrivilege.privilegeId}`] = [ + const minimalPrivilegeId = `minimal_${featurePrivilege.privilegeId}`; + featurePrivileges[feature.id][minimalPrivilegeId] = [ actions.login, ...uniq(featurePrivilegeBuilder.getActions(featurePrivilege.privilege, feature)), ]; + + tryStoreComposableFeature(feature, minimalPrivilegeId, featurePrivilege.privilege); } if ( @@ -97,10 +133,53 @@ export function privilegesFactory( } } - if (Object.keys(featurePrivileges[feature.id]).length === 0) { - delete featurePrivileges[feature.id]; + if (feature.hidden || Object.keys(featurePrivileges[feature.id]).length === 0) { + hiddenFeatures.add(feature.id); } } + + // Update composable feature privileges to include and deduplicate actions from the referenced privileges. + // Note that we should do it _before_ removing hidden features. Also, currently, feature privilege composition + // doesn't respect the minimum license level required by the feature whose privileges are being included in + // another feature. This could potentially enable functionality in a license lower than originally intended. It + // might or might not be desired, but we're accepting this for now, as every attempt to compose a feature + // undergoes a stringent review process. + for (const composableFeature of composableFeaturePrivileges) { + const composedActions = composableFeature.composedOf.flatMap((privilegeReference) => + privilegeReference.privileges.flatMap( + (privilege) => featurePrivileges[privilegeReference.feature][privilege] + ) + ); + featurePrivileges[composableFeature.featureId][composableFeature.privilegeId] = [ + ...new Set( + featurePrivileges[composableFeature.featureId][composableFeature.privilegeId].concat( + composedActions + ) + ), + ]; + + if (!composableFeature.excludeFromBasePrivileges) { + for (const action of composedActions) { + // Login action is special since it's added explicitly for feature and base privileges. + if (action === actions.login) { + continue; + } + + allActionsSet.add(action); + if (composableFeature.privilegeId === 'read') { + readActionsSet.add(action); + } + } + } + } + + // Remove hidden features to avoid registering standalone privileges for them. + for (const hiddenFeatureId of hiddenFeatures) { + delete featurePrivileges[hiddenFeatureId]; + } + + const allActions = [...allActionsSet]; + const readActions = [...readActionsSet]; return { features: featurePrivileges, global: { diff --git a/x-pack/plugins/security/server/config_deprecations.ts b/x-pack/plugins/security/server/config_deprecations.ts index 511fe1d04119dc..2e6a14b2028a2e 100644 --- a/x-pack/plugins/security/server/config_deprecations.ts +++ b/x-pack/plugins/security/server/config_deprecations.ts @@ -122,6 +122,7 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ title: i18n.translate('xpack.security.deprecations.maxRedirectURLSizeTitle', { defaultMessage: '"xpack.security.authc.providers.saml..maxRedirectURLSize" has no effect', + ignoreTag: true, }), message: i18n.translate('xpack.security.deprecations.maxRedirectURLSizeMessage', { defaultMessage: 'This setting is no longer used.', @@ -133,6 +134,7 @@ export const securityConfigDeprecationProvider: ConfigDeprecationProvider = ({ i18n.translate('xpack.security.deprecations.maxRedirectURLSize.manualSteps1', { defaultMessage: 'Remove "xpack.security.authc.providers.saml..maxRedirectURLSize" from kibana.yml.', + ignoreTag: true, }), ], }, diff --git a/x-pack/plugins/security/server/lib/role_utils.test.ts b/x-pack/plugins/security/server/lib/role_utils.test.ts index ec808f231808d6..ebd083b8ff60ee 100644 --- a/x-pack/plugins/security/server/lib/role_utils.test.ts +++ b/x-pack/plugins/security/server/lib/role_utils.test.ts @@ -5,7 +5,13 @@ * 2.0. */ -import { transformPrivilegesToElasticsearchPrivileges } from './role_utils'; +import { KibanaFeature } from '@kbn/features-plugin/common'; +import { getKibanaRoleSchema } from '@kbn/security-plugin-types-server'; + +import { + transformPrivilegesToElasticsearchPrivileges, + validateKibanaPrivileges, +} from './role_utils'; import { ALL_SPACES_ID } from '../../common/constants'; describe('transformPrivilegesToElasticsearchPrivileges', () => { @@ -24,3 +30,163 @@ describe('transformPrivilegesToElasticsearchPrivileges', () => { ]); }); }); + +describe('validateKibanaPrivileges', () => { + test('properly validates sub-feature privileges', () => { + const existingKibanaFeatures = [ + new KibanaFeature({ + id: 'feature1', + name: 'Feature1', + app: ['app1'], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + app: ['foo'], + catalogue: ['foo'], + savedObject: { all: ['foo'], read: [] }, + ui: ['save', 'show'], + }, + read: { + app: ['foo'], + catalogue: ['foo'], + savedObject: { all: [], read: ['foo'] }, + ui: ['show'], + }, + }, + }), + new KibanaFeature({ + id: 'feature2', + name: 'Feature2', + app: ['app2'], + category: { id: 'foo', label: 'foo' }, + privileges: { + all: { + app: ['foo'], + catalogue: ['foo'], + savedObject: { all: ['foo'], read: [] }, + ui: ['save', 'show'], + }, + read: { + app: ['foo'], + catalogue: ['foo'], + savedObject: { all: [], read: ['foo'] }, + ui: ['show'], + }, + }, + subFeatures: [ + { + name: 'subFeature1', + privilegeGroups: [ + { + groupType: 'independent', + privileges: [ + { + id: 'subFeaturePrivilege1', + name: 'SubFeaturePrivilege1', + includeIn: 'all', + savedObject: { all: [], read: [] }, + ui: [], + }, + { + disabled: true, + id: 'subFeaturePrivilege2', + name: 'SubFeaturePrivilege2', + includeIn: 'all', + savedObject: { all: [], read: [] }, + ui: [], + }, + { + disabled: true, + id: 'subFeaturePrivilege3', + name: 'SubFeaturePrivilege3', + includeIn: 'all', + savedObject: { all: [], read: [] }, + ui: [], + }, + ], + }, + ], + }, + { + name: 'subFeature2', + privilegeGroups: [ + { + groupType: 'mutually_exclusive', + privileges: [ + { + disabled: true, + id: 'subFeaturePrivilege4', + name: 'SubFeaturePrivilege4', + includeIn: 'all', + savedObject: { all: [], read: [] }, + ui: [], + }, + { + id: 'subFeaturePrivilege5', + name: 'SubFeaturePrivilege5', + includeIn: 'all', + savedObject: { all: [], read: [] }, + ui: [], + }, + ], + }, + ], + }, + ], + }), + ]; + + const { validationErrors: emptyErrors } = validateKibanaPrivileges( + existingKibanaFeatures, + getKibanaRoleSchema(() => ({ global: [], space: [] })).validate([ + { + feature: { + feature2: ['all', 'subFeaturePrivilege1', 'subFeaturePrivilege5'], + }, + }, + ]) + ); + expect(emptyErrors).toHaveLength(0); + + const { validationErrors: nonEmptyErrors1 } = validateKibanaPrivileges( + existingKibanaFeatures, + getKibanaRoleSchema(() => ({ global: [], space: [] })).validate([ + { + feature: { + feature2: [ + 'all', + 'subFeaturePrivilege1', + 'subFeaturePrivilege2', + 'subFeaturePrivilege5', + ], + }, + }, + ]) + ); + expect(nonEmptyErrors1).toEqual([ + 'Feature [feature2] does not support specified sub-feature privileges [subFeaturePrivilege2].', + ]); + + const { validationErrors: nonEmptyErrors2 } = validateKibanaPrivileges( + existingKibanaFeatures, + getKibanaRoleSchema(() => ({ global: [], space: [] })).validate([ + { + feature: { + feature2: [ + 'all', + 'subFeaturePrivilege1', + 'subFeaturePrivilege2', + 'subFeaturePrivilege3', + 'subFeaturePrivilege4', + 'subFeaturePrivilege5', + ], + }, + }, + ]) + ); + expect(nonEmptyErrors2).toEqual([ + 'Feature [feature2] does not support specified sub-feature privileges [subFeaturePrivilege2, subFeaturePrivilege3].', + 'Feature [feature2] does not support specified sub-feature privileges [subFeaturePrivilege4].', + ]); + }); +}); diff --git a/x-pack/plugins/security/server/lib/role_utils.ts b/x-pack/plugins/security/server/lib/role_utils.ts index 1df5254a38df06..5e714cb1f7623a 100644 --- a/x-pack/plugins/security/server/lib/role_utils.ts +++ b/x-pack/plugins/security/server/lib/role_utils.ts @@ -69,12 +69,12 @@ export const validateKibanaPrivileges = ( const validationErrors = kibanaPrivileges.flatMap((priv) => { const forAllSpaces = priv.spaces.includes(ALL_SPACES_ID); - return Object.entries(priv.feature ?? {}).flatMap(([featureId, feature]) => { + return Object.entries(priv.feature ?? {}).flatMap(([featureId, featurePrivileges]) => { const errors: string[] = []; - const kibanaFeature = kibanaFeatures.find((f) => f.id === featureId); + const kibanaFeature = kibanaFeatures.find((f) => f.id === featureId && !f.hidden); if (!kibanaFeature) return errors; - if (feature.includes('all')) { + if (featurePrivileges.includes('all')) { if (kibanaFeature.privileges?.all.disabled) { errors.push(`Feature [${featureId}] does not support privilege [all].`); } @@ -88,7 +88,7 @@ export const validateKibanaPrivileges = ( } } - if (feature.includes('read')) { + if (featurePrivileges.includes('read')) { if (kibanaFeature.privileges?.read.disabled) { errors.push(`Feature [${featureId}] does not support privilege [read].`); } @@ -103,12 +103,25 @@ export const validateKibanaPrivileges = ( } kibanaFeature.subFeatures.forEach((subFeature) => { - if ( + // Check if the definition includes any sub-feature privileges. + const subFeaturePrivileges = subFeature.privilegeGroups.flatMap((group) => + group.privileges.filter((privilege) => featurePrivileges.includes(privilege.id)) + ); + + // If the definition includes any disabled sub-feature privileges, return an error. + const disabledSubFeaturePrivileges = subFeaturePrivileges.filter( + (privilege) => privilege.disabled + ); + if (disabledSubFeaturePrivileges.length > 0) { + errors.push( + `Feature [${featureId}] does not support specified sub-feature privileges [${disabledSubFeaturePrivileges + .map((privilege) => privilege.id) + .join(', ')}].` + ); + } else if ( subFeature.requireAllSpaces && !forAllSpaces && - subFeature.privilegeGroups.some((group) => - group.privileges.some((privilege) => feature.includes(privilege.id)) - ) + subFeaturePrivileges.length > 0 ) { errors.push( `Sub-feature privilege [${kibanaFeature.name} - ${ diff --git a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts index 9414646ef9e437..8a481c4b60cbfb 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts @@ -16,7 +16,7 @@ export function defineDeleteRolesRoutes({ router }: RouteDefinitionParams) { { path: '/api/security/role/{name}', options: { - description: `Delete a role`, + summary: `Delete a role`, }, validate: { params: schema.object({ name: schema.string({ minLength: 1 }) }), diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get.ts b/x-pack/plugins/security/server/routes/authorization/roles/get.ts index e14ebd09c98ed5..9109d89d956fd6 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get.ts @@ -22,7 +22,7 @@ export function defineGetRolesRoutes({ { path: '/api/security/role/{name}', options: { - description: `Get a role`, + summary: `Get a role`, }, validate: { params: schema.object({ name: schema.string({ minLength: 1 }) }), diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts index 5732f493bf25df..a7d995f0a2639a 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts @@ -22,7 +22,7 @@ export function defineGetAllRolesRoutes({ { path: '/api/security/role', options: { - description: `Get all roles`, + summary: `Get all roles`, }, validate: false, }, diff --git a/x-pack/plugins/security/server/routes/authorization/roles/put.ts b/x-pack/plugins/security/server/routes/authorization/roles/put.ts index 337b0dc198b28c..3a62b93819bd68 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/put.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/put.ts @@ -46,7 +46,7 @@ export function definePutRolesRoutes({ { path: '/api/security/role/{name}', options: { - description: `Create or update a role`, + summary: `Create or update a role`, }, validate: { params: schema.object({ name: schema.string({ minLength: 1, maxLength: 1024 }) }), diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts index f1dad1c012f8ca..ccd42b45718f8b 100644 --- a/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts @@ -44,7 +44,7 @@ describe('Invalidate sessions routes', () => { it('correctly defines route.', () => { expect(routeConfig.options).toEqual({ - description: 'Invalidate user sessions', + summary: 'Invalidate user sessions', tags: ['access:sessionManagement'], }); diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.ts index 76a70a771b55ca..1cf65bb9191c66 100644 --- a/x-pack/plugins/security/server/routes/session_management/invalidate.ts +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.ts @@ -35,7 +35,7 @@ export function defineInvalidateSessionsRoutes({ router, getSession }: RouteDefi }, options: { tags: ['access:sessionManagement'], - description: `Invalidate user sessions`, + summary: `Invalidate user sessions`, }, }, async (_context, request, response) => { diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_crud/bulk_create_rules/bulk_create_rules_route.schema.yaml b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_crud/bulk_create_rules/bulk_create_rules_route.schema.yaml index 3b5d56f5b736db..002fa5613eed93 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_crud/bulk_create_rules/bulk_create_rules_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/bulk_crud/bulk_create_rules/bulk_create_rules_route.schema.yaml @@ -5,6 +5,7 @@ info: paths: /api/detection_engine/rules/_bulk_create: post: + x-labels: [ess] operationId: BulkCreateRules x-codegen-enabled: true deprecated: true diff --git a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/crud/create_rule/create_rule_route.schema.yaml b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/crud/create_rule/create_rule_route.schema.yaml index 4dff72dc216e19..464a2df0641e37 100644 --- a/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/crud/create_rule/create_rule_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/crud/create_rule/create_rule_route.schema.yaml @@ -5,6 +5,7 @@ info: paths: /api/detection_engine/rules: post: + x-labels: [ess, serverless] operationId: CreateRule x-codegen-enabled: true description: Create a single detection rule diff --git a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts index 806ae7f289f261..62fa05d794725a 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_generators/fleet_agent_generator.ts @@ -84,6 +84,7 @@ export class FleetAgentGenerator extends BaseDataGenerator { const hostname = this.randomHostname(); const now = new Date().toISOString(); const osFamily = this.randomOSFamily(); + const version = overrides?._source?.agent?.version ?? this.randomVersion(); const componentStatus = this.randomChoice( FleetServerAgentComponentStatuses ); @@ -113,19 +114,19 @@ export class FleetAgentGenerator extends BaseDataGenerator { enrolled_at: now, agent: { id: agentId, - version: this.randomVersion(), + version, }, local_metadata: { elastic: { agent: { - 'build.original': `8.0.0-SNAPSHOT (build: ${this.randomString( + 'build.original': `${version} (build: ${this.randomString( 5 )} at 2021-05-07 18:42:49 +0000 UTC)`, id: agentId, log_level: 'info', snapshot: true, upgradeable: true, - version: '8.0.0', + version, }, }, host: { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts index 1a91b283d241c7..dcb4c270310986 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_agent.ts @@ -6,15 +6,20 @@ */ import type { Client } from '@elastic/elasticsearch'; -import type { DeleteByQueryResponse } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { + DeleteByQueryResponse, + IndexRequest, +} from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KbnClient } from '@kbn/test'; import type { FleetServerAgent } from '@kbn/fleet-plugin/common'; import { AGENTS_INDEX } from '@kbn/fleet-plugin/common'; import type { BulkRequest } from '@elastic/elasticsearch/lib/api/types'; +import type { DeepPartial } from 'utility-types'; +import type { ToolingLog } from '@kbn/tooling-log'; import { usageTracker } from './usage_tracker'; import type { HostMetadata } from '../types'; import { FleetAgentGenerator } from '../data_generators/fleet_agent_generator'; -import { wrapErrorAndRejectPromise } from './utils'; +import { createToolingLogger, wrapErrorAndRejectPromise } from './utils'; const defaultFleetAgentGenerator = new FleetAgentGenerator(); @@ -189,3 +194,31 @@ export const deleteIndexedFleetAgents = async ( return response; }; + +export const indexFleetServerAgent = async ( + esClient: Client, + log: ToolingLog = createToolingLogger(), + overrides: DeepPartial = {} +): Promise => { + const doc = defaultFleetAgentGenerator.generateEsHit({ + _source: overrides, + }); + + const indexRequest: IndexRequest = { + index: doc._index, + id: doc._id, + body: doc._source, + op_type: 'create', + refresh: 'wait_for', + }; + + log.verbose(`Indexing new fleet agent with:\n${JSON.stringify(indexRequest, null, 2)}`); + + await esClient.index(indexRequest).catch(wrapErrorAndRejectPromise); + + return { + fleetAgentsIndex: doc._index, + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + agents: [doc._source!], + }; +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts index 63d6819c0db60e..a245b9ab1ddb88 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_fleet_server.ts @@ -6,53 +6,155 @@ */ import type { Client } from '@elastic/elasticsearch'; -import { FLEET_SERVER_SERVERS_INDEX } from '@kbn/fleet-plugin/common'; +import { kibanaPackageJson } from '@kbn/repo-info'; +import type { KbnClient } from '@kbn/test'; +import type { + GetPackagePoliciesResponse, + AgentPolicy, + GetOneAgentPolicyResponse, + CreateAgentPolicyResponse, +} from '@kbn/fleet-plugin/common'; +import { + AGENT_POLICY_API_ROUTES, + agentPolicyRouteService, + AGENTS_INDEX, + FLEET_SERVER_PACKAGE, + PACKAGE_POLICY_SAVED_OBJECT_TYPE, + packagePolicyRouteService, +} from '@kbn/fleet-plugin/common'; +import type { ToolingLog } from '@kbn/tooling-log'; +import { indexFleetServerAgent } from './index_fleet_agent'; +import { catchAxiosErrorFormatAndThrow } from '../format_axios_error'; import { usageTracker } from './usage_tracker'; -import { wrapErrorAndRejectPromise } from './utils'; +import { createToolingLogger, wrapErrorAndRejectPromise } from './utils'; /** - * Will ensure that at least one fleet server is present in the `.fleet-servers` index. This will - * enable the `Agent` section of kibana Fleet to be displayed + * Will ensure that at least one fleet server is present in the `.fleet-agents` index. This will + * enable the `Agent` section of kibana Fleet to be displayed. We skip on serverless because + * Fleet Server agents are not checked against there. * * @param esClient + * @param kbnClient + * @param log * @param version */ export const enableFleetServerIfNecessary = usageTracker.track( 'enableFleetServerIfNecessary', - async (esClient: Client, version: string = '8.0.0') => { - const res = await esClient.search({ - index: FLEET_SERVER_SERVERS_INDEX, - ignore_unavailable: true, - rest_total_hits_as_int: true, - }); - - if (res.hits.total) { - return; + async ( + esClient: Client, + isServerless: boolean = false, + kbnClient: KbnClient, + log: ToolingLog = createToolingLogger(), + version: string = kibanaPackageJson.version + ) => { + const agentPolicy = await getOrCreateFleetServerAgentPolicy(kbnClient, log); + + if (!isServerless && !(await hasFleetServerAgent(esClient, agentPolicy.id))) { + log.debug(`Indexing a new fleet server agent`); + const lastCheckin = new Date(); + lastCheckin.setFullYear(lastCheckin.getFullYear() + 1); + + const indexedAgent = await indexFleetServerAgent(esClient, log, { + policy_id: agentPolicy.id, + agent: { version }, + last_checkin_status: 'online', + last_checkin: lastCheckin.toISOString(), + }); + + log.verbose(`New fleet server agent indexed:\n${JSON.stringify(indexedAgent)}`); + } else { + log.debug(`Nothing to do. A Fleet Server agent is already registered with Fleet`); } + } +); - // Create a Fake fleet-server in this kibana instance - await esClient - .index({ - index: FLEET_SERVER_SERVERS_INDEX, - refresh: 'wait_for', - body: { - agent: { - id: '12988155-475c-430d-ac89-84dc84b67cd1', - version, - }, - host: { - architecture: 'linux', - id: 'c3e5f4f690b4a3ff23e54900701a9513', - ip: ['127.0.0.1', '::1', '10.201.0.213', 'fe80::4001:aff:fec9:d5'], - name: 'endpoint-data-generator', - }, - server: { - id: '12988155-475c-430d-ac89-84dc84b67cd1', - version, - }, - '@timestamp': '2021-05-12T18:42:52.009482058Z', - }, +const getOrCreateFleetServerAgentPolicy = async ( + kbnClient: KbnClient, + log: ToolingLog = createToolingLogger() +): Promise => { + const packagePolicies = await kbnClient + .request({ + method: 'GET', + headers: { 'elastic-api-version': '2023-10-31' }, + path: packagePolicyRouteService.getListPath(), + query: { + perPage: 1, + kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: "${FLEET_SERVER_PACKAGE}"`, + }, + }) + .catch(catchAxiosErrorFormatAndThrow); + + if (packagePolicies.data.items[0]) { + log.debug(`Found an existing package policy - fetching associated agent policy`); + log.verbose(JSON.stringify(packagePolicies.data.items[0])); + + return kbnClient + .request({ + headers: { 'elastic-api-version': '2023-10-31' }, + method: 'GET', + path: agentPolicyRouteService.getInfoPath(packagePolicies.data.items[0].policy_id), }) - .catch(wrapErrorAndRejectPromise); + .catch(catchAxiosErrorFormatAndThrow) + .then((response) => { + log.verbose( + `Existing agent policy for Fleet Server:\n${JSON.stringify(response.data.item)}` + ); + + return response.data.item; + }); } -); + + log.debug(`Creating a new fleet server agent policy`); + + // create new Fleet Server agent policy + return kbnClient + .request({ + method: 'POST', + path: AGENT_POLICY_API_ROUTES.CREATE_PATTERN, + headers: { 'elastic-api-version': '2023-10-31' }, + body: { + name: `Fleet Server policy (${Math.random().toString(32).substring(2)})`, + description: `Created by CLI Tool via: ${__filename}`, + namespace: 'default', + monitoring_enabled: [], + // This will ensure the Fleet Server integration policy + // is also created and added to the agent policy + has_fleet_server: true, + }, + }) + .then((response) => { + log.verbose( + `No fleet server agent policy found. Created a new one:\n${JSON.stringify( + response.data.item + )}` + ); + + return response.data.item; + }) + .catch(catchAxiosErrorFormatAndThrow); +}; + +const hasFleetServerAgent = async ( + esClient: Client, + fleetServerAgentPolicyId: string +): Promise => { + const searchResponse = await esClient + .search( + { + index: AGENTS_INDEX, + ignore_unavailable: true, + rest_total_hits_as_int: true, + size: 1, + _source: false, + query: { + match: { + policy_id: fleetServerAgentPolicyId, + }, + }, + }, + { ignore: [404] } + ) + .catch(wrapErrorAndRejectPromise); + + return Boolean(searchResponse?.hits.total); +}; diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts index 01974b85d6f657..f695bfc3afa67f 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/utils.ts @@ -10,13 +10,14 @@ import type { ToolingLogTextWriterConfig } from '@kbn/tooling-log'; import { ToolingLog } from '@kbn/tooling-log'; import type { Flags } from '@kbn/dev-cli-runner'; import moment from 'moment/moment'; +import { EndpointError } from '../errors'; export const RETRYABLE_TRANSIENT_ERRORS: Readonly> = [ 'no_shard_available_action_exception', 'illegal_index_shard_state_exception', ]; -export class EndpointDataLoadingError extends Error { +export class EndpointDataLoadingError extends EndpointError { constructor(message: string, public meta?: unknown) { super(message); } @@ -88,7 +89,8 @@ export const retryOnError = async ( return result; } catch (err) { - log.warning(msg(`attempt ${thisAttempt} failed with: ${err.message}`), err); + log.warning(msg(`attempt ${thisAttempt} failed with: ${err.message.split('\n').at(0)}`)); + log.verbose(err); // If not an error that is retryable, then end loop here and return that error; if (!isRetryableError(err)) { diff --git a/x-pack/plugins/security_solution/common/endpoint/index_data.ts b/x-pack/plugins/security_solution/common/endpoint/index_data.ts index 5caf47b1ade330..1e0009a8a5cf91 100644 --- a/x-pack/plugins/security_solution/common/endpoint/index_data.ts +++ b/x-pack/plugins/security_solution/common/endpoint/index_data.ts @@ -74,6 +74,7 @@ export const indexHostsAndAlerts = usageTracker.track( withResponseActions = true, numResponseActions?: number, alertIds?: string[], + isServerless: boolean = false, logger_?: ToolingLog ): Promise => { const random = seedrandom(seed); @@ -103,7 +104,7 @@ export const indexHostsAndAlerts = usageTracker.track( // If `fleet` integration is true, then ensure a (fake) fleet-server is connected if (fleet) { - await enableFleetServerIfNecessary(client); + await enableFleetServerIfNecessary(client, isServerless, kbnClient, logger); } // Keep a map of host applied policy ids (fake) to real ingest package configs (policy record) diff --git a/x-pack/plugins/security_solution/package.json b/x-pack/plugins/security_solution/package.json index d2afe4e4ae7482..b6823c220ee8b6 100644 --- a/x-pack/plugins/security_solution/package.json +++ b/x-pack/plugins/security_solution/package.json @@ -24,6 +24,7 @@ "cypress:dw:endpoint:open": "echo '\n** WARNING **: Run script `cypress:dw:endpoint:open` no longer valid! Use `cypress:dw:open` instead\n'", "junit:merge": "../../../node_modules/.bin/mochawesome-merge ../../../target/kibana-security-solution/cypress/results/mochawesome*.json > ../../../target/kibana-security-solution/cypress/results/output.json && ../../../node_modules/.bin/marge ../../../target/kibana-security-solution/cypress/results/output.json --reportDir ../../../target/kibana-security-solution/cypress/results && yarn junit:transform && mkdir -p ../../../target/junit && cp ../../../target/kibana-security-solution/cypress/results/*.xml ../../../target/junit/", "test:generate": "node scripts/endpoint/resolver_generator", + "test:generate:serverless-dev": "node scripts/endpoint/resolver_generator --node http://elastic_serverless:changeme@127.0.0.1:9200 --kibana http://elastic_serverless:changeme@127.0.0.1:5601", "mappings:generate": "node scripts/mappings/mappings_generator", "mappings:load": "node scripts/mappings/mappings_loader", "junit:transform": "node scripts/junit_transformer --pathPattern '../../../target/kibana-security-solution/cypress/results/*.xml' --rootDirectory ../../../ --reportName 'Security Solution Cypress' --writeInPlace", @@ -31,4 +32,4 @@ "openapi:generate:debug": "node --inspect-brk scripts/openapi/generate", "openapi:bundle": "node scripts/openapi/bundle" } -} +} \ No newline at end of file diff --git a/x-pack/plugins/security_solution/public/common/components/control_columns/translations.ts b/x-pack/plugins/security_solution/public/common/components/control_columns/translations.ts index 31872dd0087a0b..ab8f90224bf52a 100644 --- a/x-pack/plugins/security_solution/public/common/components/control_columns/translations.ts +++ b/x-pack/plugins/security_solution/public/common/components/control_columns/translations.ts @@ -18,5 +18,5 @@ export const CHECKBOX_FOR_ROW = ({ i18n.translate('xpack.securitySolution.controlColumns.checkboxForRowAriaLabel', { values: { ariaRowindex, checked, columnValues }, defaultMessage: - '{checked, select, false {unchecked} true {checked}} checkbox for the alert or event in row {ariaRowindex}, with columns {columnValues}', + '{checked, select, true {checked} other {unchecked}} checkbox for the alert or event in row {ariaRowindex}, with columns {columnValues}', }); diff --git a/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx b/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx index b4758bf79616db..d08d405d5d674d 100644 --- a/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/osquery/osquery_flyout.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback } from 'react'; +import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; import { EuiFlyout, @@ -13,6 +13,7 @@ import { EuiFlyoutBody, EuiFlyoutHeader, EuiTitle, + useEuiTheme, useGeneratedHtmlId, } from '@elastic/eui'; import { useQueryClient } from '@tanstack/react-query'; @@ -46,6 +47,14 @@ const OsqueryFlyoutComponent: React.FC = ({ onClose, ecsData, }) => { + const { euiTheme } = useEuiTheme(); + + // we need this flyout to be above the timeline flyout (which has a z-index of 1002) + const maskProps = useMemo( + () => ({ style: `z-index: ${(euiTheme.levels.flyout as number) + 3}` }), + [euiTheme.levels.flyout] + ); + const { services: { osquery }, } = useKibana(); @@ -63,7 +72,13 @@ const OsqueryFlyoutComponent: React.FC = ({ if (osquery?.OsqueryAction) { return ( - +

    {ACTION_OSQUERY}

    diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts index a46cc515ce7fcc..4f5c00c6861ee4 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_details.cy.ts @@ -19,7 +19,12 @@ import { loadPage } from '../../tasks/common'; describe( 'Policy Details', { - tags: ['@ess', '@serverless'], + tags: [ + '@ess', + '@serverless', + // skipped on MKI since feature flags are not supported there + '@skipInServerlessMKI', + ], env: { ftrConfig: { kbnServerArgs: [ diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/common.ts b/x-pack/plugins/security_solution/public/management/cypress/support/common.ts index 2364f08b396811..92d5eeba9aa288 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/common.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/common.ts @@ -17,6 +17,9 @@ export const setupStackServicesUsingCypressConfig = async (config: Cypress.Plugi return RUNTIME_SERVICES_CACHE.get(config)!; } + const isServerless = config.env.IS_SERVERLESS; + const isCloudServerless = config.env.CLOUD_SERVERLESS; + const stackServices = await createRuntimeServices({ kibanaUrl: config.env.KIBANA_URL, elasticsearchUrl: config.env.ELASTICSEARCH_URL, @@ -25,7 +28,8 @@ export const setupStackServicesUsingCypressConfig = async (config: Cypress.Plugi password: config.env.KIBANA_PASSWORD, esUsername: config.env.ELASTICSEARCH_USERNAME, esPassword: config.env.ELASTICSEARCH_PASSWORD, - asSuperuser: !config.env.CLOUD_SERVERLESS, + asSuperuser: !isCloudServerless, + useCertForSsl: !isCloudServerless && isServerless, }).then(({ log, ...others }) => { return { ...others, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts index acf0a3af4531a5..e96b3a057a21b6 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/data_loaders.ts @@ -217,6 +217,7 @@ export const dataLoaders = ( withResponseActions, numResponseActions, alertIds, + isServerless, }); }, diff --git a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts index f89dedad7bff9f..841a857846a2a2 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/support/plugin_handlers/endpoint_data_loader.ts @@ -45,6 +45,7 @@ export interface CyLoadEndpointDataOptions isolation: boolean; bothIsolatedAndNormalEndpoints?: boolean; alertIds?: string[]; + isServerless?: boolean; } /** @@ -73,6 +74,7 @@ export const cyLoadEndpointDataHandler = async ( isolation, numResponseActions, alertIds, + isServerless = false, } = options; const DocGenerator = EndpointDocGenerator.custom({ @@ -80,6 +82,8 @@ export const cyLoadEndpointDataHandler = async ( }); if (waitUntilTransformed) { + log.info(`Stopping transforms...`); + // need this before indexing docs so that the united transform doesn't // create a checkpoint with a timestamp after the doc timestamps await stopTransform(esClient, log, metadataTransformPrefix); @@ -88,6 +92,8 @@ export const cyLoadEndpointDataHandler = async ( await stopTransform(esClient, log, METADATA_UNITED_TRANSFORM_V2); } + log.info(`Calling indexHostAndAlerts() to index [${numHosts}] endpoint hosts...`); + // load data into the system const indexedData = await indexHostsAndAlerts( esClient as Client, @@ -106,25 +112,31 @@ export const cyLoadEndpointDataHandler = async ( withResponseActions, numResponseActions, alertIds, + isServerless, log ); + log.info(`Hosts have been indexed`); + if (waitUntilTransformed) { + log.info(`starting transforms...`); + // missing transforms are ignored, start either name - await startTransform(esClient, metadataTransformPrefix); - await startTransform(esClient, METADATA_CURRENT_TRANSFORM_V2); + await startTransform(esClient, log, metadataTransformPrefix); + await startTransform(esClient, log, METADATA_CURRENT_TRANSFORM_V2); const metadataIds = Array.from(new Set(indexedData.hosts.map((host) => host.agent.id))); - await waitForEndpoints(esClient, 'endpoint_index', metadataIds); + await waitForEndpoints(esClient, log, 'endpoint_index', metadataIds); - await startTransform(esClient, METADATA_UNITED_TRANSFORM); - await startTransform(esClient, METADATA_UNITED_TRANSFORM_V2); + await startTransform(esClient, log, METADATA_UNITED_TRANSFORM); + await startTransform(esClient, log, METADATA_UNITED_TRANSFORM_V2); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const agentIds = Array.from(new Set(indexedData.agents.map((agent) => agent.agent!.id))); - await waitForEndpoints(esClient, 'united_index', agentIds); + await waitForEndpoints(esClient, log, 'united_index', agentIds); } + log.info(`Done - [${numHosts}] endpoint hosts have been indexed and are now available in kibana`); return indexedData; }; @@ -133,6 +145,8 @@ const stopTransform = async ( log: ToolingLog, transformId: string ): Promise => { + log.debug(`Stopping transform id: ${transformId}`); + await esClient.transform .stopTransform({ transform_id: `${transformId}*`, @@ -147,17 +161,27 @@ const stopTransform = async ( }); }; -const startTransform = async (esClient: Client, transformId: string): Promise => { +const startTransform = async ( + esClient: Client, + log: ToolingLog, + transformId: string +): Promise => { const transformsResponse = await esClient.transform.getTransformStats({ transform_id: `${transformId}*`, }); + log.verbose( + `Transform status found for [${transformId}*] returned:\n${dump(transformsResponse)}` + ); + await Promise.all( transformsResponse.transforms.map((transform) => { if (STARTED_TRANSFORM_STATES.has(transform.state)) { return Promise.resolve(); } + log.debug(`Staring transform id: [${transform.id}]`); + return esClient.transform.startTransform({ transform_id: transform.id }); }) ); @@ -173,6 +197,7 @@ const startTransform = async (esClient: Client, transformId: string): Promise => { @@ -218,8 +243,13 @@ const waitForEndpoints = async ( const expectedSize = ids.length || 1; + log.info(`Waiting for [${expectedSize}] endpoint hosts to be available`); + log.verbose(`Query for searching index [${index}]:\n${dump(body, 10)}`); + await pRetry( - async () => { + async (attemptCount) => { + log.debug(`Attempt [${attemptCount}]: Searching [${index}] to check if hosts are availble`); + const response = await esClient.search({ index, size: expectedSize, @@ -227,12 +257,16 @@ const waitForEndpoints = async ( rest_total_hits_as_int: true, }); + log.verbose(`Attempt [${attemptCount}]: Search response:\n${dump(response, 10)}`); + // If not the expected number of Endpoints, then throw an error so we keep trying if (response.hits.total !== expectedSize) { throw new Error( `Expected number of endpoints not found. Looking for ${expectedSize} but received ${response.hits.total}` ); } + + log.info(`Attempt [${attemptCount}]: Done - [${expectedSize}] host are now available`); }, { forever: false } ); diff --git a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx index a9cf833696a579..a8dc888541f33f 100644 --- a/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx +++ b/x-pack/plugins/security_solution/public/sourcerer/containers/index.tsx @@ -15,6 +15,7 @@ import { getDataViewStateFromIndexFields } from '../../common/containers/source/ import { useFetchIndex } from '../../common/containers/source'; import type { State } from '../../common/store/types'; import { sortWithExcludesAtEnd } from '../../../common/utils/sourcerer'; +import { useUnstableSecuritySolutionDataView } from '../experimental/use_unstable_security_solution_data_view'; export const useSourcererDataView = ( scopeId: SourcererScopeName = SourcererScopeName.default @@ -114,7 +115,7 @@ export const useSourcererDataView = ( return dataViewBrowserFields; }, [sourcererDataView.fields, sourcererDataView.patternList]); - return useMemo( + const stableSourcererValues = useMemo( () => ({ browserFields: browserFields(), dataViewId: sourcererDataView.id, @@ -143,4 +144,10 @@ export const useSourcererDataView = ( legacyPatterns.length, ] ); + + return useUnstableSecuritySolutionDataView( + scopeId, + // NOTE: data view derived from current implementation is used as a fallback + stableSourcererValues + ); }; diff --git a/x-pack/plugins/security_solution/public/sourcerer/experimental/is_enabled.ts b/x-pack/plugins/security_solution/public/sourcerer/experimental/is_enabled.ts new file mode 100644 index 00000000000000..efdc2c74688471 --- /dev/null +++ b/x-pack/plugins/security_solution/public/sourcerer/experimental/is_enabled.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +/** + * Allows toggling between sourcerer implementations in runtime. Simply set the value in local storage + * to: + * - display the experimental component instead of the stable one + * - use experimental data views hook instead of the stable one + */ +export const IS_EXPERIMENTAL_SOURCERER_ENABLED = !!window.localStorage.getItem( + 'EXPERIMENTAL_SOURCERER_ENABLED' +); diff --git a/x-pack/plugins/security_solution/public/sourcerer/experimental/readme.md b/x-pack/plugins/security_solution/public/sourcerer/experimental/readme.md new file mode 100644 index 00000000000000..077bef147cbed9 --- /dev/null +++ b/x-pack/plugins/security_solution/public/sourcerer/experimental/readme.md @@ -0,0 +1,18 @@ +# Experimental Sourcerer Replacement + +## Introduction + +This directory is a home for Discovery Components based re-implementation of the Sourcerer. + +Currently, it can be enabled and used only by setting the localStorage value, like this: + +``` +window.localStorage.setItem('EXPERIMENTAL_SOURCERER_ENABLED', true) +``` + +The reason for having this feature toggle like this is we want to be able to inspect both implementations side by side, +using the same Kibana instance deployed locally (for now). + +## Architecture + +TODO diff --git a/x-pack/plugins/security_solution/public/sourcerer/experimental/use_unstable_security_solution_data_view.ts b/x-pack/plugins/security_solution/public/sourcerer/experimental/use_unstable_security_solution_data_view.ts new file mode 100644 index 00000000000000..a841834a8b1fee --- /dev/null +++ b/x-pack/plugins/security_solution/public/sourcerer/experimental/use_unstable_security_solution_data_view.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 { type SourcererScopeName, type SelectedDataView } from '../store/model'; + +import { IS_EXPERIMENTAL_SOURCERER_ENABLED } from './is_enabled'; + +/** + * FOR INTERNAL USE ONLY + * This hook provides data for experimental Sourcerer replacement in Security Solution. + * Do not use in client code as the API will change frequently. + * It will be extended in the future, covering more and more functionality from the current sourcerer. + */ +export const useUnstableSecuritySolutionDataView = ( + _scopeId: SourcererScopeName, + fallbackDataView: SelectedDataView +): SelectedDataView => { + // TODO: extend the fallback state with values computed using new logic + return IS_EXPERIMENTAL_SOURCERER_ENABLED ? fallbackDataView : fallbackDataView; +}; diff --git a/x-pack/plugins/security_solution/scripts/endpoint/agent_emulator/services/endpoint_loader.ts b/x-pack/plugins/security_solution/scripts/endpoint/agent_emulator/services/endpoint_loader.ts index 9658ea46a09d83..b2e0f8a5c0cdf6 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/agent_emulator/services/endpoint_loader.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/agent_emulator/services/endpoint_loader.ts @@ -21,6 +21,7 @@ import { METADATA_DATASTREAM } from '../../../../common/endpoint/constants'; import { EndpointMetadataGenerator } from '../../../../common/endpoint/data_generators/endpoint_metadata_generator'; import { getEndpointPackageInfo } from '../../../../common/endpoint/utils/package'; import { ENDPOINT_ALERTS_INDEX, ENDPOINT_EVENTS_INDEX } from '../../common/constants'; +import { isServerlessKibanaFlavor } from '../../common/stack_services'; let WAS_FLEET_SETUP_DONE = false; @@ -90,8 +91,9 @@ export const loadEndpoints = async ({ } if (!WAS_FLEET_SETUP_DONE) { + const isServerless = await isServerlessKibanaFlavor(kbnClient); await setupFleetForEndpoint(kbnClient); - await enableFleetServerIfNecessary(esClient); + await enableFleetServerIfNecessary(esClient, isServerless, kbnClient, log); // eslint-disable-next-line require-atomic-updates WAS_FLEET_SETUP_DONE = true; } diff --git a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts index 1eefe220c0d399..3707436c042f2d 100644 --- a/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts +++ b/x-pack/plugins/security_solution/scripts/endpoint/common/fleet_server/fleet_server_services.ts @@ -16,7 +16,6 @@ import { AGENT_POLICY_API_ROUTES, API_VERSIONS, FLEET_SERVER_PACKAGE, - FLEET_SERVER_SERVERS_INDEX, PACKAGE_POLICY_SAVED_OBJECT_TYPE, } from '@kbn/fleet-plugin/common'; import type { @@ -42,13 +41,8 @@ import { } from '@kbn/dev-utils'; import { maybeCreateDockerNetwork, SERVERLESS_NODES, verifyDockerInstalled } from '@kbn/es'; import { resolve } from 'path'; -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { captureCallingStack, dump, prefixedOutputLogger } from '../utils'; -import { - createToolingLogger, - RETRYABLE_TRANSIENT_ERRORS, - retryOnError, -} from '../../../../common/endpoint/data_loaders/utils'; +import { createToolingLogger } from '../../../../common/endpoint/data_loaders/utils'; import { isServerlessKibanaFlavor } from '../stack_services'; import type { FormattedAxiosError } from '../../../../common/endpoint/format_axios_error'; import { catchAxiosErrorFormatAndThrow } from '../../../../common/endpoint/format_axios_error'; @@ -329,9 +323,12 @@ const startFleetServerWithDocker = async ({ await updateFleetElasticsearchOutputHostNames(kbnClient, log); if (isServerless) { - log.info(`Waiting for server [${hostname}] to register with Elasticsearch`); - await waitForFleetServerToRegisterWithElasticsearch(kbnClient, hostname, 180000); + log.info(`Waiting for Fleet Server [${hostname}] to start running`); + if (!(await isFleetServerRunning(kbnClient, log))) { + throw Error(`Unable to start Fleet Server [${hostname}]`); + } } else { + log.info(`Waiting for Fleet Server [${hostname}] to enroll with Fleet`); await waitForHostToEnroll(kbnClient, log, hostname, 120000); } @@ -683,7 +680,7 @@ export const isFleetServerRunning = async ( const url = new URL(fleetServerUrl); url.pathname = '/api/status'; - return pRetry( + return pRetry( async () => { return axios .request({ @@ -698,75 +695,20 @@ export const isFleetServerRunning = async ( `Fleet server is up and running at [${fleetServerUrl}]. Status: `, response.data ); - return true; }) - .catch(catchAxiosErrorFormatAndThrow) - .catch((e) => { - log.debug(`Fleet server not up at [${fleetServerUrl}]`); - log.verbose(`Call to [${url.toString()}] failed with:`, e); - return false; - }); - }, - { maxTimeout: 10000 } - ); -}; - -/** - * Checks and waits until the given fleet server hostname has been registered into elasticsearch. - * This check can be used when enrolling a standalone fleet-server, since those would not show up - * in Kibana's Fleet UI. - */ -const waitForFleetServerToRegisterWithElasticsearch = async ( - kbnClient: KbnClient, - fleetServerHostname: string, - timeoutMs: number = 30000 -): Promise => { - const started = new Date(); - const hasTimedOut = (): boolean => { - const elapsedTime = Date.now() - started.getTime(); - return elapsedTime > timeoutMs; - }; - let found = false; - - while (!found && !hasTimedOut()) { - found = await retryOnError(async () => { - const fleetServerRecord = await kbnClient - .request({ - method: 'POST', - path: '/api/console/proxy', - query: { - path: `${FLEET_SERVER_SERVERS_INDEX}/_search`, - method: 'GET', - }, - body: { - query: { - bool: { - filter: [ - { - term: { - 'host.name': fleetServerHostname, - }, - }, - ], - }, - }, - }, - }) - .then((response) => response.data) .catch(catchAxiosErrorFormatAndThrow); - - return ((fleetServerRecord?.hits?.total as estypes.SearchTotalHits)?.value ?? 0) === 1; - }, RETRYABLE_TRANSIENT_ERRORS); - - if (!found) { - // sleep and check again - await new Promise((r) => setTimeout(r, 2000)); + }, + { + maxTimeout: 10000, + retries: 5, + onFailedAttempt: (e) => { + log.warning( + `Fleet server not (yet) up at [${fleetServerUrl}]. Retrying... (attempt #${e.attemptNumber}, ${e.retriesLeft} retries left)` + ); + log.verbose(`Call to [${url.toString()}] failed with:`, e); + }, } - } - - if (!found) { - throw new Error( - `Timed out waiting for fleet server [${fleetServerHostname}] to register with Elasticsearch` - ); - } + ) + .then(() => true) + .catch(() => false); }; diff --git a/x-pack/plugins/security_solution/scripts/openapi/bundle.js b/x-pack/plugins/security_solution/scripts/openapi/bundle.js index 82280d0ef0ebfd..cba548cfd29039 100644 --- a/x-pack/plugins/security_solution/scripts/openapi/bundle.js +++ b/x-pack/plugins/security_solution/scripts/openapi/bundle.js @@ -15,6 +15,20 @@ bundle({ sourceGlob: join(SECURITY_SOLUTION_ROOT, 'common/api/**/*.schema.yaml'), outputFilePath: join( SECURITY_SOLUTION_ROOT, - 'target/openapi/security_solution-{version}.bundled.schema.yaml' + 'target/openapi/serverless/security_solution-{version}.bundled.schema.yaml' ), + options: { + includeLabels: ['serverless'], + }, +}); + +bundle({ + sourceGlob: join(SECURITY_SOLUTION_ROOT, 'common/api/**/*.schema.yaml'), + outputFilePath: join( + SECURITY_SOLUTION_ROOT, + 'target/openapi/ess/security_solution-{version}.bundled.schema.yaml' + ), + options: { + includeLabels: ['ess'], + }, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/create_prebuilt_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/create_prebuilt_rules.ts index ef3d34b6575052..8da1055156d3d3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/create_prebuilt_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/create_prebuilt_rules.ts @@ -9,7 +9,7 @@ import { MAX_RULES_TO_UPDATE_IN_PARALLEL } from '../../../../../../common/consta import { initPromisePool } from '../../../../../utils/promise_pool'; import { withSecuritySpan } from '../../../../../utils/with_security_span'; import type { PrebuiltRuleAsset } from '../../model/rule_assets/prebuilt_rule_asset'; -import type { IDetectionRulesClient } from '../../../rule_management/logic/rule_management/detection_rules_client'; +import type { IDetectionRulesClient } from '../../../rule_management/logic/detection_rules_client/detection_rules_client_interface'; export const createPrebuiltRules = ( detectionRulesClient: IDetectionRulesClient, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/upgrade_prebuilt_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/upgrade_prebuilt_rules.ts index 4ae595cca16b0b..2c9a81a7af6ce4 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/upgrade_prebuilt_rules.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/upgrade_prebuilt_rules.ts @@ -9,7 +9,7 @@ import { MAX_RULES_TO_UPDATE_IN_PARALLEL } from '../../../../../../common/consta import { initPromisePool } from '../../../../../utils/promise_pool'; import { withSecuritySpan } from '../../../../../utils/with_security_span'; import type { PrebuiltRuleAsset } from '../../model/rule_assets/prebuilt_rule_asset'; -import type { IDetectionRulesClient } from '../../../rule_management/logic/rule_management/detection_rules_client'; +import type { IDetectionRulesClient } from '../../../rule_management/logic/detection_rules_client/detection_rules_client_interface'; /** * Upgrades existing prebuilt rules given a set of rules and output index. diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts index a2e6f2f0385463..fa9fcc1fa5e225 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/routes/__mocks__/request_context.ts @@ -38,7 +38,7 @@ import { riskEngineDataClientMock } from '../../../entity_analytics/risk_engine/ import { riskScoreDataClientMock } from '../../../entity_analytics/risk_score/risk_score_data_client.mock'; import { assetCriticalityDataClientMock } from '../../../entity_analytics/asset_criticality/asset_criticality_data_client.mock'; import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; -import { detectionRulesClientMock } from '../../rule_management/logic/rule_management/__mocks__/detection_rules_client'; +import { detectionRulesClientMock } from '../../rule_management/logic/detection_rules_client/__mocks__/detection_rules_client'; export const createMockClients = () => { const core = coreMock.createRequestHandlerContext(); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts index c5dfc3a0d847ee..c8c257770e26a0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions/api/create_rule_exceptions/route.ts @@ -37,13 +37,13 @@ import { CreateRuleExceptionsRequestParams, } from '../../../../../../common/api/detection_engine/rule_exceptions'; -import { readRules } from '../../../rule_management/logic/rule_management/read_rules'; +import { readRules } from '../../../rule_management/logic/detection_rules_client/read_rules'; import { checkDefaultRuleExceptionListReferences } from '../../../rule_management/logic/exceptions/check_for_default_rule_exception_list'; import type { RuleParams } from '../../../rule_schema'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { buildSiemResponse } from '../../../routes/utils'; import { buildRouteValidation } from '../../../../../utils/build_validation/route_validation'; -import type { IDetectionRulesClient } from '../../../rule_management/logic/rule_management/detection_rules_client'; +import type { IDetectionRulesClient } from '../../../rule_management/logic/detection_rules_client/detection_rules_client_interface'; export const createRuleExceptionsRoute = (router: SecuritySolutionPluginRouter) => { router.versioned diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts index 1ef231bb0b5ad9..d59ba5676b6072 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/fetch_rules_by_query_or_ids.ts @@ -11,7 +11,7 @@ import { MAX_RULES_TO_UPDATE_IN_PARALLEL } from '../../../../../../../common/con import type { PromisePoolOutcome } from '../../../../../../utils/promise_pool'; import { initPromisePool } from '../../../../../../utils/promise_pool'; import type { RuleAlertType } from '../../../../rule_schema'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { findRules } from '../../../logic/search/find_rules'; import { MAX_RULES_TO_PROCESS_TOTAL } from './route'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts index d74afe0bea65e3..37ad3dc7d8487a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_actions/route.test.ts @@ -30,10 +30,10 @@ import { getBulkDisableRuleActionSchemaMock, } from '../../../../../../../common/api/detection_engine/rule_management/mocks'; import { loggingSystemMock } from '@kbn/core/server/mocks'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; jest.mock('../../../../../machine_learning/authz'); -jest.mock('../../../logic/rule_management/read_rules', () => ({ readRules: jest.fn() })); +jest.mock('../../../logic/detection_rules_client/read_rules', () => ({ readRules: jest.fn() })); describe('Perform bulk action route', () => { const readRulesMock = readRules as jest.Mock; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_create_rules/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_create_rules/route.ts index e4373e1563532f..a8e5a0446c6e3f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_create_rules/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_create_rules/route.ts @@ -16,7 +16,7 @@ import { } from '../../../../../../../common/api/detection_engine/rule_management'; import type { SecuritySolutionPluginRouter } from '../../../../../../types'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getDuplicates } from './get_duplicates'; import { transformValidateBulkError } from '../../../utils/validate'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_delete_rules/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_delete_rules/route.ts index 2ac6fb3340bab2..234439eb49052f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_delete_rules/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_delete_rules/route.ts @@ -24,7 +24,7 @@ import { createBulkErrorObject, transformBulkError, } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getIdBulkError } from '../../../utils/utils'; import { transformValidateBulkError } from '../../../utils/validate'; import { getDeprecatedBulkEndpointHeader, logDeprecatedBulkEndpoint } from '../../deprecation'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts index 1ed5f529b20143..a3752d421380bb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_patch_rules/route.ts @@ -19,7 +19,7 @@ import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { transformBulkError, buildSiemResponse } from '../../../../routes/utils'; import { getIdBulkError } from '../../../utils/utils'; import { transformValidateBulkError } from '../../../utils/validate'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getDeprecatedBulkEndpointHeader, logDeprecatedBulkEndpoint } from '../../deprecation'; import { validateRuleDefaultExceptionList } from '../../../logic/exceptions/validate_rule_default_exception_list'; import { validateRulesWithDuplicatedDefaultExceptionsList } from '../../../logic/exceptions/validate_rules_with_duplicated_default_exceptions_list'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_update_rules/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_update_rules/route.ts index 2b3ee7c2f751a5..e08d781cd74d8f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_update_rules/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/bulk_update_rules/route.ts @@ -24,7 +24,7 @@ import { buildSiemResponse, createBulkErrorObject, } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getDeprecatedBulkEndpointHeader, logDeprecatedBulkEndpoint } from '../../deprecation'; import { validateRuleDefaultExceptionList } from '../../../logic/exceptions/validate_rule_default_exception_list'; import { validateRulesWithDuplicatedDefaultExceptionsList } from '../../../logic/exceptions/validate_rules_with_duplicated_default_exceptions_list'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.ts index db01f1f7838928..03642aa12266b2 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/create_rule/route.ts @@ -16,7 +16,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constant import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { checkDefaultRuleExceptionListReferences } from '../../../logic/exceptions/check_for_default_rule_exception_list'; import { validateRuleDefaultExceptionList } from '../../../logic/exceptions/validate_rule_default_exception_list'; import { transformValidate, validateResponseActionsPermissions } from '../../../utils/validate'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/delete_rule/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/delete_rule/route.ts index 31b72c76daaa62..3cf9aa6a2fb557 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/delete_rule/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/delete_rule/route.ts @@ -16,7 +16,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constant import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getIdError, transform } from '../../../utils/utils'; export const deleteRuleRoute = (router: SecuritySolutionPluginRouter) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/patch_rule/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/patch_rule/route.ts index 78c5a15ef05812..38b283b2c5fb67 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/patch_rule/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/patch_rule/route.ts @@ -16,7 +16,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constant import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { checkDefaultRuleExceptionListReferences } from '../../../logic/exceptions/check_for_default_rule_exception_list'; import { validateRuleDefaultExceptionList } from '../../../logic/exceptions/validate_rule_default_exception_list'; import { getIdError } from '../../../utils/utils'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/read_rule/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/read_rule/route.ts index aabf5383679308..95992618b06256 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/read_rule/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/read_rule/route.ts @@ -16,7 +16,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constant import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { getIdError, transform } from '../../../utils/utils'; export const readRuleRoute = (router: SecuritySolutionPluginRouter, logger: Logger) => { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.ts index 8c46e1979a43d7..5ac2df600908cf 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/update_rule/route.ts @@ -16,7 +16,7 @@ import { DETECTION_ENGINE_RULES_URL } from '../../../../../../../common/constant import type { SecuritySolutionPluginRouter } from '../../../../../../types'; import { buildRouteValidationWithZod } from '../../../../../../utils/build_validation/route_validation'; import { buildSiemResponse } from '../../../../routes/utils'; -import { readRules } from '../../../logic/rule_management/read_rules'; +import { readRules } from '../../../logic/detection_rules_client/read_rules'; import { checkDefaultRuleExceptionListReferences } from '../../../logic/exceptions/check_for_default_rule_exception_list'; import { validateRuleDefaultExceptionList } from '../../../logic/exceptions/validate_rule_default_exception_list'; import { getIdError } from '../../../utils/utils'; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/__mocks__/detection_rules_client.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/__mocks__/detection_rules_client.ts new file mode 100644 index 00000000000000..b6d14a307801ec --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/__mocks__/detection_rules_client.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 type { IDetectionRulesClient } from '../detection_rules_client_interface'; + +export type DetectionRulesClientMock = jest.Mocked; + +const createDetectionRulesClientMock = () => { + const mocked: DetectionRulesClientMock = { + createCustomRule: jest.fn(), + createPrebuiltRule: jest.fn(), + updateRule: jest.fn(), + patchRule: jest.fn(), + deleteRule: jest.fn(), + upgradePrebuiltRule: jest.fn(), + importRule: jest.fn(), + }; + return mocked; +}; + +export const detectionRulesClientMock: { + create: () => DetectionRulesClientMock; +} = { + create: createDetectionRulesClientMock, +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/__mocks__/read_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/__mocks__/read_rules.ts similarity index 100% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/__mocks__/read_rules.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/__mocks__/read_rules.ts diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_custom_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_custom_rule.test.ts similarity index 76% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_custom_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_custom_rule.test.ts index 7cf68102d6a835..a8335108d7cbeb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_custom_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_custom_rule.test.ts @@ -7,8 +7,6 @@ import { rulesClientMock } from '@kbn/alerting-plugin/server/mocks'; -import { createCustomRule } from './detection_rules_client'; - import { getCreateRulesSchemaMock, getCreateMachineLearningRulesSchemaMock, @@ -17,23 +15,28 @@ import { import { DEFAULT_INDICATOR_SOURCE_PATH } from '../../../../../../common/constants'; import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); describe('DetectionRulesClient.createCustomRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { jest.resetAllMocks(); rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('should create a rule with the correct parameters and options', async () => { const params = getCreateRulesSchemaMock(); - await createCustomRule(rulesClient, { params }, mlAuthz); + await detectionRulesClient.createCustomRule({ params }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -44,8 +47,6 @@ describe('DetectionRulesClient.createCustomRule', () => { immutable: false, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -56,18 +57,16 @@ describe('DetectionRulesClient.createCustomRule', () => { }); await expect( - createCustomRule(rulesClient, { params: getCreateMachineLearningRulesSchemaMock() }, mlAuthz) + detectionRulesClient.createCustomRule({ params: getCreateMachineLearningRulesSchemaMock() }) ).rejects.toThrow('mocked MLAuth error'); expect(rulesClient.create).not.toHaveBeenCalled(); }); it('calls the rulesClient with legacy ML params', async () => { - await createCustomRule( - rulesClient, - { params: getCreateMachineLearningRulesSchemaMock() }, - mlAuthz - ); + await detectionRulesClient.createCustomRule({ + params: getCreateMachineLearningRulesSchemaMock(), + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -78,23 +77,17 @@ describe('DetectionRulesClient.createCustomRule', () => { immutable: false, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); it('calls the rulesClient with ML params', async () => { - await createCustomRule( - rulesClient, - { - params: { - ...getCreateMachineLearningRulesSchemaMock(), - machine_learning_job_id: ['new_job_1', 'new_job_2'], - }, + await detectionRulesClient.createCustomRule({ + params: { + ...getCreateMachineLearningRulesSchemaMock(), + machine_learning_job_id: ['new_job_1', 'new_job_2'], }, - mlAuthz - ); + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -105,8 +98,6 @@ describe('DetectionRulesClient.createCustomRule', () => { immutable: false, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -115,13 +106,9 @@ describe('DetectionRulesClient.createCustomRule', () => { const params = getCreateThreatMatchRulesSchemaMock(); delete params.threat_indicator_path; - await createCustomRule( - rulesClient, - { - params, - }, - mlAuthz - ); + await detectionRulesClient.createCustomRule({ + params, + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -131,14 +118,13 @@ describe('DetectionRulesClient.createCustomRule', () => { immutable: false, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); it('does not populate a threatIndicatorPath value for other rules if empty', async () => { - await createCustomRule(rulesClient, { params: getCreateRulesSchemaMock() }, mlAuthz); + await detectionRulesClient.createCustomRule({ params: getCreateRulesSchemaMock() }); + expect(rulesClient.create).not.toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -147,8 +133,6 @@ describe('DetectionRulesClient.createCustomRule', () => { immutable: false, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_prebuilt_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_prebuilt_rule.test.ts similarity index 81% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_prebuilt_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_prebuilt_rule.test.ts index b99f94344332fc..d2a61dcc65e45b 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/create_prebuilt_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.create_prebuilt_rule.test.ts @@ -7,8 +7,6 @@ import { rulesClientMock } from '@kbn/alerting-plugin/server/mocks'; -import { createPrebuiltRule } from './detection_rules_client'; - import { getCreateRulesSchemaMock, getCreateMachineLearningRulesSchemaMock, @@ -17,23 +15,28 @@ import { import { DEFAULT_INDICATOR_SOURCE_PATH } from '../../../../../../common/constants'; import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); describe('DetectionRulesClient.createPrebuiltRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { jest.resetAllMocks(); rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('creates a rule with the correct parameters and options', async () => { const ruleAsset = { ...getCreateRulesSchemaMock(), version: 1, rule_id: 'rule-id' }; - await createPrebuiltRule(rulesClient, { ruleAsset }, mlAuthz); + await detectionRulesClient.createPrebuiltRule({ ruleAsset }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -45,8 +48,6 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { immutable: true, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -57,7 +58,7 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { throw new Error('mocked MLAuth error'); }); - await expect(createPrebuiltRule(rulesClient, { ruleAsset }, mlAuthz)).rejects.toThrow( + await expect(detectionRulesClient.createPrebuiltRule({ ruleAsset })).rejects.toThrow( 'mocked MLAuth error' ); @@ -70,13 +71,9 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { version: 1, rule_id: 'rule-id', }; - await createPrebuiltRule( - rulesClient, - { - ruleAsset, - }, - mlAuthz - ); + await detectionRulesClient.createPrebuiltRule({ + ruleAsset, + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -88,8 +85,6 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { immutable: true, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -101,13 +96,9 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { version: 1, rule_id: 'rule-id', }; - await createPrebuiltRule( - rulesClient, - { - ruleAsset, - }, - mlAuthz - ); + await detectionRulesClient.createPrebuiltRule({ + ruleAsset, + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -119,8 +110,6 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { immutable: true, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -129,13 +118,9 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { const ruleAsset = { ...getCreateThreatMatchRulesSchemaMock(), version: 1, rule_id: 'rule-id' }; delete ruleAsset.threat_indicator_path; - await createPrebuiltRule( - rulesClient, - { - ruleAsset, - }, - mlAuthz - ); + await detectionRulesClient.createPrebuiltRule({ + ruleAsset, + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -146,15 +131,13 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { immutable: true, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); it('does not populate a threatIndicatorPath value for other rules if empty', async () => { const ruleAsset = { ...getCreateRulesSchemaMock(), version: 1, rule_id: 'rule-id' }; - await createPrebuiltRule(rulesClient, { ruleAsset }, mlAuthz); + await detectionRulesClient.createPrebuiltRule({ ruleAsset }); expect(rulesClient.create).not.toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -164,8 +147,6 @@ describe('DetectionRulesClient.createPrebuiltRule', () => { immutable: true, }), }), - options: {}, - allowMissingConnectorSecrets: undefined, }) ); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/delete_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.delete_rule.test.ts similarity index 59% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/delete_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.delete_rule.test.ts index d811e5fa21ce06..37cb8e0aa709e3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/delete_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.delete_rule.test.ts @@ -6,18 +6,26 @@ */ import { rulesClientMock } from '@kbn/alerting-plugin/server/mocks'; -import { deleteRule } from './detection_rules_client'; +import { buildMlAuthz } from '../../../../machine_learning/authz'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; + +jest.mock('../../../../machine_learning/authz'); describe('DetectionRulesClient.deleteRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('should call rulesClient.delete passing the expected ruleId', async () => { const ruleId = 'ruleId'; - await deleteRule(rulesClient, { + await detectionRulesClient.deleteRule({ ruleId, }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/import_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.import_rule.test.ts similarity index 82% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/import_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.import_rule.test.ts index cc7ae2bf28038c..4d2cb0ee655196 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/import_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.import_rule.test.ts @@ -6,13 +6,14 @@ */ import { rulesClientMock } from '@kbn/alerting-plugin/server/mocks'; -import { importRule } from './detection_rules_client'; import { readRules } from './read_rules'; import { getCreateRulesSchemaMock } from '../../../../../../common/api/detection_engine/model/rule_schema/mocks'; import { getRuleMock } from '../../../routes/__mocks__/request_responses'; import { getQueryRuleParams } from '../../../rule_schema/mocks'; import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); @@ -21,6 +22,8 @@ jest.mock('./read_rules'); describe('DetectionRulesClient.importRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); const immutable = false as const; // Can only take value of false const allowMissingConnectorSecrets = true; @@ -39,19 +42,16 @@ describe('DetectionRulesClient.importRule', () => { beforeEach(() => { rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('calls rulesClient.create with the correct parameters when rule_id does not match an installed rule', async () => { (readRules as jest.Mock).mockResolvedValue(null); - await importRule( - rulesClient, - { - ruleToImport, - overwriteRules: true, - options: { allowMissingConnectorSecrets }, - }, - mlAuthz - ); + await detectionRulesClient.importRule({ + ruleToImport, + overwriteRules: true, + allowMissingConnectorSecrets, + }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ @@ -64,7 +64,6 @@ describe('DetectionRulesClient.importRule', () => { version: ruleToImport.version, }), }), - options: {}, allowMissingConnectorSecrets, }) ); @@ -76,15 +75,11 @@ describe('DetectionRulesClient.importRule', () => { }); await expect( - importRule( - rulesClient, - { - ruleToImport, - overwriteRules: true, - options: { allowMissingConnectorSecrets }, - }, - mlAuthz - ) + detectionRulesClient.importRule({ + ruleToImport, + overwriteRules: true, + allowMissingConnectorSecrets, + }) ).rejects.toThrow('mocked MLAuth error'); expect(rulesClient.create).not.toHaveBeenCalled(); @@ -94,15 +89,11 @@ describe('DetectionRulesClient.importRule', () => { describe('when rule_id matches an installed rule', () => { it('calls rulesClient.update with the correct parameters when overwriteRules is true', async () => { (readRules as jest.Mock).mockResolvedValue(existingRule); - await importRule( - rulesClient, - { - ruleToImport, - overwriteRules: true, - options: { allowMissingConnectorSecrets }, - }, - mlAuthz - ); + await detectionRulesClient.importRule({ + ruleToImport, + overwriteRules: true, + allowMissingConnectorSecrets, + }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -136,18 +127,14 @@ describe('DetectionRulesClient.importRule', () => { }; (readRules as jest.Mock).mockResolvedValue(existingRuleWithTimestampOverride); - await importRule( - rulesClient, - { - ruleToImport: { - ...ruleToImport, - timestamp_override: undefined, - }, - overwriteRules: true, - options: { allowMissingConnectorSecrets }, + await detectionRulesClient.importRule({ + ruleToImport: { + ...ruleToImport, + timestamp_override: undefined, }, - mlAuthz - ); + overwriteRules: true, + allowMissingConnectorSecrets, + }); expect(rulesClient.create).not.toHaveBeenCalled(); expect(rulesClient.update).toHaveBeenCalledWith( @@ -164,15 +151,11 @@ describe('DetectionRulesClient.importRule', () => { it('rejects when overwriteRules is false', async () => { (readRules as jest.Mock).mockResolvedValue(existingRule); await expect( - importRule( - rulesClient, - { - ruleToImport, - overwriteRules: false, - options: { allowMissingConnectorSecrets }, - }, - mlAuthz - ) + detectionRulesClient.importRule({ + ruleToImport, + overwriteRules: false, + allowMissingConnectorSecrets, + }) ).rejects.toMatchObject({ error: { status_code: 409, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/patch_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.patch_rule.test.ts similarity index 90% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/patch_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.patch_rule.test.ts index 29bc4c678ac2d9..7f1c2198886366 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/patch_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.patch_rule.test.ts @@ -13,10 +13,11 @@ import { getCreateMachineLearningRulesSchemaMock, getCreateRulesSchemaMock, } from '../../../../../../common/api/detection_engine/model/rule_schema/mocks'; -import { patchRule } from './detection_rules_client'; import { readRules } from './read_rules'; import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); @@ -25,10 +26,13 @@ jest.mock('./read_rules'); describe('DetectionRulesClient.patchRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('calls the rulesClient with expected params', async () => { @@ -37,7 +41,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -58,7 +62,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - const rule = await patchRule(rulesClient, { nextParams }, mlAuthz); + const rule = await detectionRulesClient.patchRule({ nextParams }); expect(rule.enabled).toBe(true); }); @@ -69,7 +73,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getMlRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -91,7 +95,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getMlRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -117,7 +121,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.disable).toHaveBeenCalledWith( expect.objectContaining({ @@ -138,7 +142,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.enable).toHaveBeenCalledWith( expect.objectContaining({ @@ -157,7 +161,7 @@ describe('DetectionRulesClient.patchRule', () => { enabled: true, }; - await expect(patchRule(rulesClient, { nextParams }, mlAuthz)).rejects.toThrow( + await expect(detectionRulesClient.patchRule({ nextParams })).rejects.toThrow( 'mocked MLAuth error' ); @@ -183,7 +187,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -221,7 +225,7 @@ describe('DetectionRulesClient.patchRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await patchRule(rulesClient, { nextParams }, mlAuthz); + await detectionRulesClient.patchRule({ nextParams }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.ts new file mode 100644 index 00000000000000..7256441697e655 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { MlAuthz } from '../../../../machine_learning/authz'; + +import type { RuleAlertType } from '../../../rule_schema'; +import type { + IDetectionRulesClient, + CreateCustomRuleArgs, + CreatePrebuiltRuleArgs, + UpdateRuleArgs, + PatchRuleArgs, + DeleteRuleArgs, + UpgradePrebuiltRuleArgs, + ImportRuleArgs, +} from './detection_rules_client_interface'; + +import { createCustomRule } from './methods/create_custom_rule'; +import { createPrebuiltRule } from './methods/create_prebuilt_rule'; +import { updateRule } from './methods/update_rule'; +import { patchRule } from './methods/patch_rule'; +import { deleteRule } from './methods/delete_rule'; +import { upgradePrebuiltRule } from './methods/upgrade_prebuilt_rule'; +import { importRule } from './methods/import_rule'; + +import { withSecuritySpan } from '../../../../../utils/with_security_span'; + +export const createDetectionRulesClient = ( + rulesClient: RulesClient, + mlAuthz: MlAuthz +): IDetectionRulesClient => ({ + async createCustomRule(args: CreateCustomRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.createCustomRule', async () => { + return createCustomRule(rulesClient, args, mlAuthz); + }); + }, + + async createPrebuiltRule(args: CreatePrebuiltRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.createPrebuiltRule', async () => { + return createPrebuiltRule(rulesClient, args, mlAuthz); + }); + }, + + async updateRule(args: UpdateRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.updateRule', async () => { + return updateRule(rulesClient, args, mlAuthz); + }); + }, + + async patchRule(args: PatchRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.patchRule', async () => { + return patchRule(rulesClient, args, mlAuthz); + }); + }, + + async deleteRule(args: DeleteRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.deleteRule', async () => { + return deleteRule(rulesClient, args); + }); + }, + + async upgradePrebuiltRule(args: UpgradePrebuiltRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.upgradePrebuiltRule', async () => { + return upgradePrebuiltRule(rulesClient, args, mlAuthz); + }); + }, + + async importRule(args: ImportRuleArgs): Promise { + return withSecuritySpan('DetectionRulesClient.importRule', async () => { + return importRule(rulesClient, args, mlAuthz); + }); + }, +}); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/update_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.update_rule.test.ts similarity index 89% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/update_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.update_rule.test.ts index b0ee5a64267758..671460b046fea0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/update_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.update_rule.test.ts @@ -13,10 +13,11 @@ import { getCreateMachineLearningRulesSchemaMock, getCreateRulesSchemaMock, } from '../../../../../../common/api/detection_engine/model/rule_schema/mocks'; -import { updateRule } from './detection_rules_client'; import { readRules } from './read_rules'; import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); @@ -25,10 +26,13 @@ jest.mock('./read_rules'); describe('DetectionRulesClient.updateRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('calls the rulesClient with expected params', async () => { @@ -37,7 +41,7 @@ describe('DetectionRulesClient.updateRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -58,7 +62,7 @@ describe('DetectionRulesClient.updateRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - const rule = await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + const rule = await detectionRulesClient.updateRule({ ruleUpdate }); expect(rule.enabled).toBe(true); }); @@ -69,7 +73,7 @@ describe('DetectionRulesClient.updateRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getMlRuleParams())); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -92,7 +96,7 @@ describe('DetectionRulesClient.updateRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getMlRuleParams())); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -118,7 +122,7 @@ describe('DetectionRulesClient.updateRule', () => { rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); (readRules as jest.Mock).mockResolvedValueOnce(existingRule); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.disable).toHaveBeenCalledWith( expect.objectContaining({ @@ -139,7 +143,7 @@ describe('DetectionRulesClient.updateRule', () => { rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); (readRules as jest.Mock).mockResolvedValueOnce(existingRule); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.enable).toHaveBeenCalledWith( expect.objectContaining({ @@ -158,7 +162,7 @@ describe('DetectionRulesClient.updateRule', () => { enabled: true, }; - await expect(updateRule(rulesClient, { ruleUpdate }, mlAuthz)).rejects.toThrow( + await expect(detectionRulesClient.updateRule({ ruleUpdate })).rejects.toThrow( 'mocked MLAuth error' ); @@ -184,7 +188,7 @@ describe('DetectionRulesClient.updateRule', () => { (readRules as jest.Mock).mockResolvedValueOnce(existingRule); rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ @@ -222,7 +226,7 @@ describe('DetectionRulesClient.updateRule', () => { rulesClient.update.mockResolvedValue(getRuleMock(getQueryRuleParams())); (readRules as jest.Mock).mockResolvedValueOnce(existingRule); - await updateRule(rulesClient, { ruleUpdate }, mlAuthz); + await detectionRulesClient.updateRule({ ruleUpdate }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/upgrade_prebuilt_rule.rule_management_client.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.upgrade_prebuilt_rule.test.ts similarity index 88% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/upgrade_prebuilt_rule.rule_management_client.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.upgrade_prebuilt_rule.test.ts index 1997df6f3fff16..97a564cbf86e60 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/upgrade_prebuilt_rule.rule_management_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client.upgrade_prebuilt_rule.test.ts @@ -7,8 +7,6 @@ import { rulesClientMock } from '@kbn/alerting-plugin/server/mocks'; -import { upgradePrebuiltRule } from './detection_rules_client'; - import { getCreateEqlRuleSchemaMock, getCreateRulesSchemaMock, @@ -21,6 +19,8 @@ import { getEqlRuleParams, getQueryRuleParams } from '../../../rule_schema/mocks import { buildMlAuthz } from '../../../../machine_learning/authz'; import { throwAuthzError } from '../../../../machine_learning/validation'; +import { createDetectionRulesClient } from './detection_rules_client'; +import type { IDetectionRulesClient } from './detection_rules_client_interface'; jest.mock('../../../../machine_learning/authz'); jest.mock('../../../../machine_learning/validation'); @@ -28,10 +28,13 @@ jest.mock('./read_rules'); describe('DetectionRulesClient.upgradePrebuiltRule', () => { let rulesClient: ReturnType; + let detectionRulesClient: IDetectionRulesClient; + const mlAuthz = (buildMlAuthz as jest.Mock)(); beforeEach(() => { rulesClient = rulesClientMock.create(); + detectionRulesClient = createDetectionRulesClient(rulesClient, mlAuthz); }); it('throws if no matching rule_id is found', async () => { @@ -42,7 +45,7 @@ describe('DetectionRulesClient.upgradePrebuiltRule', () => { }; (readRules as jest.Mock).mockResolvedValue(null); - await expect(upgradePrebuiltRule(rulesClient, { ruleAsset }, mlAuthz)).rejects.toThrow( + await expect(detectionRulesClient.upgradePrebuiltRule({ ruleAsset })).rejects.toThrow( `Failed to find rule ${ruleAsset.rule_id}` ); }); @@ -58,7 +61,7 @@ describe('DetectionRulesClient.upgradePrebuiltRule', () => { rule_id: 'rule-id', }; - await expect(upgradePrebuiltRule(rulesClient, { ruleAsset }, mlAuthz)).rejects.toThrow( + await expect(detectionRulesClient.upgradePrebuiltRule({ ruleAsset })).rejects.toThrow( 'mocked MLAuth error' ); @@ -100,12 +103,12 @@ describe('DetectionRulesClient.upgradePrebuiltRule', () => { }); it('deletes the old rule ', async () => { - await upgradePrebuiltRule(rulesClient, { ruleAsset }, mlAuthz); + await detectionRulesClient.upgradePrebuiltRule({ ruleAsset }); expect(rulesClient.delete).toHaveBeenCalled(); }); it('creates a new rule with the new type and expected params of the original rules', async () => { - await upgradePrebuiltRule(rulesClient, { ruleAsset }, mlAuthz); + await detectionRulesClient.upgradePrebuiltRule({ ruleAsset }); expect(rulesClient.create).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ @@ -127,7 +130,6 @@ describe('DetectionRulesClient.upgradePrebuiltRule', () => { options: { id: installedRule.id, // id is maintained }, - allowMissingConnectorSecrets: undefined, }) ); }); @@ -151,7 +153,7 @@ describe('DetectionRulesClient.upgradePrebuiltRule', () => { }); it('patches the existing rule with the new params from the rule asset', async () => { - await upgradePrebuiltRule(rulesClient, { ruleAsset }, mlAuthz); + await detectionRulesClient.upgradePrebuiltRule({ ruleAsset }); expect(rulesClient.update).toHaveBeenCalledWith( expect.objectContaining({ data: expect.objectContaining({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client_interface.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client_interface.ts new file mode 100644 index 00000000000000..d99b0b9c2cbd05 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client_interface.ts @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RuleCreateProps } from '../../../../../../common/api/detection_engine/model/rule_schema'; +import type { PrebuiltRuleAsset } from '../../../prebuilt_rules'; +import type { + RuleUpdateProps, + RulePatchProps, + RuleObjectId, + RuleToImport, +} from '../../../../../../common/api/detection_engine'; +import type { RuleAlertType } from '../../../rule_schema'; + +export interface IDetectionRulesClient { + createCustomRule: (createCustomRulePayload: CreateCustomRuleArgs) => Promise; + createPrebuiltRule: (createPrebuiltRulePayload: CreatePrebuiltRuleArgs) => Promise; + updateRule: (updateRulePayload: UpdateRuleArgs) => Promise; + patchRule: (patchRulePayload: PatchRuleArgs) => Promise; + deleteRule: (deleteRulePayload: DeleteRuleArgs) => Promise; + upgradePrebuiltRule: ( + upgradePrebuiltRulePayload: UpgradePrebuiltRuleArgs + ) => Promise; + importRule: (importRulePayload: ImportRuleArgs) => Promise; +} + +export interface CreateCustomRuleArgs { + params: RuleCreateProps; +} + +export interface CreatePrebuiltRuleArgs { + ruleAsset: PrebuiltRuleAsset; +} + +export interface UpdateRuleArgs { + ruleUpdate: RuleUpdateProps; +} + +export interface PatchRuleArgs { + nextParams: RulePatchProps; +} + +export interface DeleteRuleArgs { + ruleId: RuleObjectId; +} + +export interface UpgradePrebuiltRuleArgs { + ruleAsset: PrebuiltRuleAsset; +} + +export interface ImportRuleArgs { + ruleToImport: RuleToImport; + overwriteRules?: boolean; + allowMissingConnectorSecrets?: boolean; +} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_custom_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_custom_rule.ts new file mode 100644 index 00000000000000..c9b3b7b542a17f --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_custom_rule.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 type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { CreateCustomRuleArgs } from '../detection_rules_client_interface'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { RuleAlertType, RuleParams } from '../../../../rule_schema'; +import { convertCreateAPIToInternalSchema } from '../../../normalization/rule_converters'; + +import { validateMlAuth } from '../utils'; + +export const createCustomRule = async ( + rulesClient: RulesClient, + args: CreateCustomRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { params } = args; + await validateMlAuth(mlAuthz, params.type); + + const internalRule = convertCreateAPIToInternalSchema(params, { immutable: false }); + const rule = await rulesClient.create({ + data: internalRule, + }); + + return rule; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_prebuilt_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_prebuilt_rule.ts new file mode 100644 index 00000000000000..0ada0197137a47 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/create_prebuilt_rule.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { CreatePrebuiltRuleArgs } from '../detection_rules_client_interface'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { RuleAlertType, RuleParams } from '../../../../rule_schema'; +import { convertCreateAPIToInternalSchema } from '../../../normalization/rule_converters'; + +import { validateMlAuth } from '../utils'; + +export const createPrebuiltRule = async ( + rulesClient: RulesClient, + args: CreatePrebuiltRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { ruleAsset } = args; + + await validateMlAuth(mlAuthz, ruleAsset.type); + + const internalRule = convertCreateAPIToInternalSchema(ruleAsset, { + immutable: true, + defaultEnabled: false, + }); + + const rule = await rulesClient.create({ + data: internalRule, + }); + + return rule; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/delete_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/delete_rule.ts new file mode 100644 index 00000000000000..ec1491e8159d77 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/delete_rule.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { DeleteRuleArgs } from '../detection_rules_client_interface'; + +export const deleteRule = async (rulesClient: RulesClient, args: DeleteRuleArgs): Promise => { + const { ruleId } = args; + await rulesClient.delete({ id: ruleId }); +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/import_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/import_rule.ts new file mode 100644 index 00000000000000..8761478e30eda4 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/import_rule.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { ImportRuleArgs } from '../detection_rules_client_interface'; +import type { RuleAlertType, RuleParams } from '../../../../rule_schema'; +import { createBulkErrorObject } from '../../../../routes/utils'; +import { + convertCreateAPIToInternalSchema, + convertUpdateAPIToInternalSchema, +} from '../../../normalization/rule_converters'; + +import { validateMlAuth } from '../utils'; + +import { readRules } from '../read_rules'; + +export const importRule = async ( + rulesClient: RulesClient, + importRulePayload: ImportRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { ruleToImport, overwriteRules, allowMissingConnectorSecrets } = importRulePayload; + + await validateMlAuth(mlAuthz, ruleToImport.type); + + const existingRule = await readRules({ + rulesClient, + ruleId: ruleToImport.rule_id, + id: undefined, + }); + + if (!existingRule) { + const internalRule = convertCreateAPIToInternalSchema(ruleToImport, { + immutable: false, + }); + + return rulesClient.create({ + data: internalRule, + allowMissingConnectorSecrets, + }); + } else if (existingRule && overwriteRules) { + const newInternalRule = convertUpdateAPIToInternalSchema({ + existingRule, + ruleUpdate: ruleToImport, + }); + + return rulesClient.update({ + id: existingRule.id, + data: newInternalRule, + }); + } else { + throw createBulkErrorObject({ + ruleId: existingRule.params.ruleId, + statusCode: 409, + message: `rule_id: "${existingRule.params.ruleId}" already exists`, + }); + } +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/patch_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/patch_rule.ts new file mode 100644 index 00000000000000..b7c8c1539d664a --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/patch_rule.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 type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { PatchRuleArgs } from '../detection_rules_client_interface'; +import type { RuleAlertType } from '../../../../rule_schema'; +import { getIdError } from '../../../utils/utils'; +import { convertPatchAPIToInternalSchema } from '../../../normalization/rule_converters'; + +import { validateMlAuth, ClientError, toggleRuleEnabledOnUpdate } from '../utils'; + +import { readRules } from '../read_rules'; + +export const patchRule = async ( + rulesClient: RulesClient, + args: PatchRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { nextParams } = args; + const { rule_id: ruleId, id } = nextParams; + + const existingRule = await readRules({ + rulesClient, + ruleId, + id, + }); + + if (existingRule == null) { + const error = getIdError({ id, ruleId }); + throw new ClientError(error.message, error.statusCode); + } + + await validateMlAuth(mlAuthz, nextParams.type ?? existingRule.params.type); + + const patchedRule = convertPatchAPIToInternalSchema(nextParams, existingRule); + + const update = await rulesClient.update({ + id: existingRule.id, + data: patchedRule, + }); + + await toggleRuleEnabledOnUpdate(rulesClient, existingRule, nextParams.enabled); + + if (nextParams.enabled != null) { + return { ...update, enabled: nextParams.enabled }; + } else { + return update; + } +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/update_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/update_rule.ts new file mode 100644 index 00000000000000..a37b5eaddcee01 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/update_rule.ts @@ -0,0 +1,53 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { RuleAlertType } from '../../../../rule_schema'; +import type { UpdateRuleArgs } from '../detection_rules_client_interface'; +import { getIdError } from '../../../utils/utils'; +import { convertUpdateAPIToInternalSchema } from '../../../normalization/rule_converters'; + +import { validateMlAuth, ClientError, toggleRuleEnabledOnUpdate } from '../utils'; + +import { readRules } from '../read_rules'; + +export const updateRule = async ( + rulesClient: RulesClient, + args: UpdateRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { ruleUpdate } = args; + const { rule_id: ruleId, id } = ruleUpdate; + + await validateMlAuth(mlAuthz, ruleUpdate.type); + + const existingRule = await readRules({ + rulesClient, + ruleId, + id, + }); + + if (existingRule == null) { + const error = getIdError({ id, ruleId }); + throw new ClientError(error.message, error.statusCode); + } + + const newInternalRule = convertUpdateAPIToInternalSchema({ + existingRule, + ruleUpdate, + }); + + const update = await rulesClient.update({ + id: existingRule.id, + data: newInternalRule, + }); + + await toggleRuleEnabledOnUpdate(rulesClient, existingRule, ruleUpdate.enabled); + + return { ...update, enabled: ruleUpdate.enabled ?? existingRule.enabled }; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/upgrade_prebuilt_rule.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/upgrade_prebuilt_rule.ts new file mode 100644 index 00000000000000..528f81ac9c57b0 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/methods/upgrade_prebuilt_rule.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RulesClient } from '@kbn/alerting-plugin/server'; +import type { MlAuthz } from '../../../../../machine_learning/authz'; +import type { RuleAlertType, RuleParams } from '../../../../rule_schema'; +import type { UpgradePrebuiltRuleArgs } from '../detection_rules_client_interface'; +import { + convertPatchAPIToInternalSchema, + convertCreateAPIToInternalSchema, +} from '../../../normalization/rule_converters'; +import { transformAlertToRuleAction } from '../../../../../../../common/detection_engine/transform_actions'; + +import { validateMlAuth, ClientError } from '../utils'; + +import { readRules } from '../read_rules'; + +export const upgradePrebuiltRule = async ( + rulesClient: RulesClient, + upgradePrebuiltRulePayload: UpgradePrebuiltRuleArgs, + mlAuthz: MlAuthz +): Promise => { + const { ruleAsset } = upgradePrebuiltRulePayload; + + await validateMlAuth(mlAuthz, ruleAsset.type); + + const existingRule = await readRules({ + rulesClient, + ruleId: ruleAsset.rule_id, + id: undefined, + }); + + if (!existingRule) { + throw new ClientError(`Failed to find rule ${ruleAsset.rule_id}`, 500); + } + + if (ruleAsset.type !== existingRule.params.type) { + // If we're trying to change the type of a prepackaged rule, we need to delete the old one + // and replace it with the new rule, keeping the enabled setting, actions, throttle, id, + // and exception lists from the old rule + await rulesClient.delete({ id: existingRule.id }); + + const internalRule = convertCreateAPIToInternalSchema( + { + ...ruleAsset, + enabled: existingRule.enabled, + exceptions_list: existingRule.params.exceptionsList, + actions: existingRule.actions.map(transformAlertToRuleAction), + timeline_id: existingRule.params.timelineId, + timeline_title: existingRule.params.timelineTitle, + }, + { immutable: true, defaultEnabled: existingRule.enabled } + ); + + return rulesClient.create({ + data: internalRule, + options: { id: existingRule.id }, + }); + } + + // Else, simply patch it. + const patchedRule = convertPatchAPIToInternalSchema(ruleAsset, existingRule); + + await rulesClient.update({ + id: existingRule.id, + data: patchedRule, + }); + + const updatedRule = await readRules({ + rulesClient, + ruleId: ruleAsset.rule_id, + id: undefined, + }); + + if (!updatedRule) { + throw new ClientError(`Rule ${ruleAsset.rule_id} not found after upgrade`, 500); + } + + return updatedRule; +}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/read_rules.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/read_rules.test.ts similarity index 100% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/read_rules.test.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/read_rules.test.ts diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/read_rules.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/read_rules.ts similarity index 100% rename from x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/read_rules.ts rename to x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/read_rules.ts diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/utils.ts new file mode 100644 index 00000000000000..0173ba5aea370c --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/detection_rules_client/utils.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 type { RulesClient } from '@kbn/alerting-plugin/server'; + +import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; +import type { MlAuthz } from '../../../../machine_learning/authz'; + +import type { RuleAlertType } from '../../../rule_schema'; +import { throwAuthzError } from '../../../../machine_learning/validation'; + +export const toggleRuleEnabledOnUpdate = async ( + rulesClient: RulesClient, + existingRule: RuleAlertType, + updatedRuleEnabled?: boolean +) => { + if (existingRule.enabled && updatedRuleEnabled === false) { + await rulesClient.disable({ id: existingRule.id }); + } else if (!existingRule.enabled && updatedRuleEnabled === true) { + await rulesClient.enable({ id: existingRule.id }); + } +}; + +export const validateMlAuth = async (mlAuthz: MlAuthz, ruleType: Type) => { + throwAuthzError(await mlAuthz.validateRuleType(ruleType)); +}; + +export class ClientError extends Error { + public readonly statusCode: number; + constructor(message: string, statusCode: number) { + super(message); + this.statusCode = statusCode; + } +} diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts index 8c8f32181c2306..5c64a2a6f9a33e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/import/import_rules_utils.ts @@ -16,7 +16,7 @@ import type { RuleToImport } from '../../../../../../common/api/detection_engine import type { ImportRuleResponse } from '../../../routes/utils'; import { createBulkErrorObject } from '../../../routes/utils'; import { checkRuleExceptionReferences } from './check_rule_exception_references'; -import type { IDetectionRulesClient } from '../rule_management/detection_rules_client'; +import type { IDetectionRulesClient } from '../detection_rules_client/detection_rules_client_interface'; export type PromiseFromStreams = RuleToImport | Error; export interface RuleExceptionsPromiseFromStreams { @@ -94,9 +94,7 @@ export const importRules = async ({ exceptions_list: [...exceptions], }, overwriteRules, - options: { - allowMissingConnectorSecrets, - }, + allowMissingConnectorSecrets, }); resolve({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/__mocks__/detection_rules_client.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/__mocks__/detection_rules_client.ts deleted file mode 100644 index d320cfbe5315a5..00000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/__mocks__/detection_rules_client.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { - IDetectionRulesClient, - CreateRuleOptions, - _UpdateRuleProps, - _PatchRuleProps, -} from '../detection_rules_client'; -import type { RulesClient } from '@kbn/alerting-plugin/server'; -import type { - RuleCreateProps, - RuleObjectId, -} from '../../../../../../../common/api/detection_engine'; -import type { PrebuiltRuleAsset } from '../../../../prebuilt_rules'; -import type { RuleAlertType } from '../../../../rule_schema'; - -export type DetectionRulesClientMock = jest.Mocked; - -const createDetectionRulesClientMock = () => { - const mocked: DetectionRulesClientMock = { - createCustomRule: jest.fn(), - createPrebuiltRule: jest.fn(), - updateRule: jest.fn(), - patchRule: jest.fn(), - deleteRule: jest.fn(), - upgradePrebuiltRule: jest.fn(), - importRule: jest.fn(), - }; - return mocked; -}; - -export const detectionRulesClientMock: { - create: () => DetectionRulesClientMock; -} = { - create: createDetectionRulesClientMock, -}; - -/* Mocks for internal methods */ -export const _createRule: jest.Mock< - ( - rulesClient: RulesClient, - params: RuleCreateProps, - options: CreateRuleOptions - ) => Promise -> = jest.fn(); - -export const _updateRule: jest.Mock< - (rulesClient: RulesClient, updateRulePayload: _UpdateRuleProps) => Promise -> = jest.fn(); - -export const patchRuleMock: jest.Mock< - (rulesClient: RulesClient, patchRulePayload: _PatchRuleProps) => Promise -> = jest.fn(); - -export const _upgradePrebuiltRuleWithTypeChange: jest.Mock< - ( - rulesClient: RulesClient, - ruleAsset: PrebuiltRuleAsset, - existingRule: RuleAlertType - ) => Promise -> = jest.fn(); - -export const _toggleRuleEnabledOnUpdate: jest.Mock< - (rulesClient: RulesClient, existingRule: RuleAlertType, enabled: boolean) => Promise -> = jest.fn(); - -export const _deleteRule: jest.Mock< - (rulesClient: RulesClient, deleteRulePayload: { ruleId: RuleObjectId }) => Promise -> = jest.fn(); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/detection_rules_client.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/detection_rules_client.ts deleted file mode 100644 index b756943b7de84b..00000000000000 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/rule_management/detection_rules_client.ts +++ /dev/null @@ -1,430 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { RulesClient } from '@kbn/alerting-plugin/server'; - -import type { KibanaRequest } from '@kbn/core-http-server'; -import type { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; -import type { LicensingApiRequestHandlerContext } from '@kbn/licensing-plugin/server'; -import type { SharedServices } from '@kbn/ml-plugin/server/shared_services'; -import type { Type } from '@kbn/securitysolution-io-ts-alerting-types'; -import type { MlAuthz } from '../../../../machine_learning/authz'; -import { buildMlAuthz } from '../../../../machine_learning/authz'; -import type { - RuleCreateProps, - RuleObjectId, - RuleToImport, - PatchRuleRequestBody, - RuleUpdateProps, -} from '../../../../../../common/api/detection_engine'; - -import type { PrebuiltRuleAsset } from '../../../prebuilt_rules'; - -import { readRules } from './read_rules'; - -import { - convertPatchAPIToInternalSchema, - convertUpdateAPIToInternalSchema, - convertCreateAPIToInternalSchema, -} from '../../normalization/rule_converters'; -import { transformAlertToRuleAction } from '../../../../../../common/detection_engine/transform_actions'; -import type { RuleAlertType, RuleParams } from '../../../rule_schema'; -import { createBulkErrorObject } from '../../../routes/utils'; -import { getIdError } from '../../utils/utils'; -import { throwAuthzError } from '../../../../machine_learning/validation'; - -class ClientError extends Error { - public readonly statusCode: number; - constructor(message: string, statusCode: number) { - super(message); - this.statusCode = statusCode; - } -} - -export interface CreateRuleOptions { - /* Optionally pass an ID to use for the rule document. If not provided, an ID will be generated. */ - /* This is the ES document ID, NOT the rule_id */ - id?: string; - immutable?: boolean; - defaultEnabled?: boolean; - allowMissingConnectorSecrets?: boolean; -} - -export interface _UpdateRuleProps { - existingRule: RuleAlertType; - ruleUpdate: RuleUpdateProps; -} - -export interface _PatchRuleProps { - existingRule: RuleAlertType; - nextParams: PatchRuleRequestBody; -} - -interface CreateCustomRuleProps { - params: RuleCreateProps; -} - -interface CreatePrebuiltRuleProps { - ruleAsset: PrebuiltRuleAsset; -} - -interface UpdateRuleProps { - ruleUpdate: RuleUpdateProps; -} - -interface PatchRuleProps { - nextParams: PatchRuleRequestBody; -} - -interface DeleteRuleProps { - ruleId: RuleObjectId; -} - -interface UpgradePrebuiltRuleProps { - ruleAsset: PrebuiltRuleAsset; -} - -interface ImportRuleOptions { - allowMissingConnectorSecrets?: boolean; -} - -interface ImportRuleProps { - ruleToImport: RuleToImport; - overwriteRules?: boolean; - options: ImportRuleOptions; -} - -export interface IDetectionRulesClient { - createCustomRule: (createCustomRulePayload: CreateCustomRuleProps) => Promise; - createPrebuiltRule: ( - createPrebuiltRulePayload: CreatePrebuiltRuleProps - ) => Promise; - updateRule: (updateRulePayload: UpdateRuleProps) => Promise; - patchRule: (patchRulePayload: PatchRuleProps) => Promise; - deleteRule: (deleteRulePayload: DeleteRuleProps) => Promise; - upgradePrebuiltRule: ( - upgradePrebuiltRulePayload: UpgradePrebuiltRuleProps - ) => Promise; - importRule: (importRulePayload: ImportRuleProps) => Promise; -} - -export const createDetectionRulesClient = ( - rulesClient: RulesClient, - request: KibanaRequest, - savedObjectsClient: SavedObjectsClientContract, - licensing: LicensingApiRequestHandlerContext, - ml?: SharedServices -): IDetectionRulesClient => { - const mlAuthz = buildMlAuthz({ - license: licensing.license, - ml, - request, - savedObjectsClient, - }); - - const client = { - createCustomRule: async ( - createCustomRulePayload: CreateCustomRuleProps - ): Promise => { - return createCustomRule(rulesClient, createCustomRulePayload, mlAuthz); - }, - - createPrebuiltRule: async ( - createPrebuiltRulePayload: CreatePrebuiltRuleProps - ): Promise => { - return createPrebuiltRule(rulesClient, createPrebuiltRulePayload, mlAuthz); - }, - - updateRule: async (updateRulePayload: UpdateRuleProps): Promise => { - return updateRule(rulesClient, updateRulePayload, mlAuthz); - }, - - patchRule: async (patchRulePayload: PatchRuleProps): Promise => { - return patchRule(rulesClient, patchRulePayload, mlAuthz); - }, - - deleteRule: async (deleteRulePayload: DeleteRuleProps): Promise => { - return deleteRule(rulesClient, deleteRulePayload); - }, - - upgradePrebuiltRule: async ( - upgradePrebuiltRulePayload: UpgradePrebuiltRuleProps - ): Promise => { - return upgradePrebuiltRule(rulesClient, upgradePrebuiltRulePayload, mlAuthz); - }, - - importRule: async (importRulePayload: ImportRuleProps): Promise => { - return importRule(rulesClient, importRulePayload, mlAuthz); - }, - }; - - return client; -}; - -export const createCustomRule = async ( - rulesClient: RulesClient, - createCustomRulePayload: CreateCustomRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { params } = createCustomRulePayload; - await _validateMlAuth(mlAuthz, params.type); - - const rule = await _createRule(rulesClient, params, { immutable: false }); - return rule; -}; - -export const createPrebuiltRule = async ( - rulesClient: RulesClient, - createPrebuiltRulePayload: CreatePrebuiltRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { ruleAsset } = createPrebuiltRulePayload; - - await _validateMlAuth(mlAuthz, ruleAsset.type); - - const rule = await _createRule(rulesClient, ruleAsset, { - immutable: true, - defaultEnabled: false, - }); - - return rule; -}; - -export const updateRule = async ( - rulesClient: RulesClient, - updateRulePayload: UpdateRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { ruleUpdate } = updateRulePayload; - const { rule_id: ruleId, id } = ruleUpdate; - - await _validateMlAuth(mlAuthz, ruleUpdate.type); - - const existingRule = await readRules({ - rulesClient, - ruleId, - id, - }); - - if (existingRule == null) { - const error = getIdError({ id, ruleId }); - throw new ClientError(error.message, error.statusCode); - } - - const update = await _updateRule(rulesClient, { ruleUpdate, existingRule }); - - await _toggleRuleEnabledOnUpdate(rulesClient, existingRule, ruleUpdate.enabled); - - return { ...update, enabled: ruleUpdate.enabled ?? existingRule.enabled }; -}; - -export const patchRule = async ( - rulesClient: RulesClient, - patchRulePayload: PatchRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { nextParams } = patchRulePayload; - const { rule_id: ruleId, id } = nextParams; - - const existingRule = await readRules({ - rulesClient, - ruleId, - id, - }); - - if (existingRule == null) { - const error = getIdError({ id, ruleId }); - throw new ClientError(error.message, error.statusCode); - } - - await _validateMlAuth(mlAuthz, nextParams.type ?? existingRule.params.type); - - const update = await _patchRule(rulesClient, { existingRule, nextParams }); - - await _toggleRuleEnabledOnUpdate(rulesClient, existingRule, nextParams.enabled); - - if (nextParams.enabled != null) { - return { ...update, enabled: nextParams.enabled }; - } else { - return update; - } -}; - -export const deleteRule = async ( - rulesClient: RulesClient, - deleteRulePayload: DeleteRuleProps -): Promise => { - const { ruleId } = deleteRulePayload; - await rulesClient.delete({ id: ruleId }); -}; - -export const upgradePrebuiltRule = async ( - rulesClient: RulesClient, - upgradePrebuiltRulePayload: UpgradePrebuiltRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { ruleAsset } = upgradePrebuiltRulePayload; - - await _validateMlAuth(mlAuthz, ruleAsset.type); - - const existingRule = await readRules({ - rulesClient, - ruleId: ruleAsset.rule_id, - id: undefined, - }); - - if (!existingRule) { - throw new ClientError(`Failed to find rule ${ruleAsset.rule_id}`, 500); - } - - // If rule has change its type during upgrade, delete and recreate it - if (ruleAsset.type !== existingRule.params.type) { - return _upgradePrebuiltRuleWithTypeChange(rulesClient, ruleAsset, existingRule); - } - - // Else, simply patch it. - await _patchRule(rulesClient, { existingRule, nextParams: ruleAsset }); - - const updatedRule = await readRules({ - rulesClient, - ruleId: ruleAsset.rule_id, - id: undefined, - }); - - if (!updatedRule) { - throw new ClientError(`Rule ${ruleAsset.rule_id} not found after upgrade`, 500); - } - - return updatedRule; -}; - -export const importRule = async ( - rulesClient: RulesClient, - importRulePayload: ImportRuleProps, - mlAuthz: MlAuthz -): Promise => { - const { ruleToImport, overwriteRules, options } = importRulePayload; - - await _validateMlAuth(mlAuthz, ruleToImport.type); - - const existingRule = await readRules({ - rulesClient, - ruleId: ruleToImport.rule_id, - id: undefined, - }); - - if (!existingRule) { - return _createRule(rulesClient, ruleToImport, { - immutable: false, - allowMissingConnectorSecrets: options?.allowMissingConnectorSecrets, - }); - } else if (existingRule && overwriteRules) { - return _updateRule(rulesClient, { - existingRule, - ruleUpdate: ruleToImport, - }); - } else { - throw createBulkErrorObject({ - ruleId: existingRule.params.ruleId, - statusCode: 409, - message: `rule_id: "${existingRule.params.ruleId}" already exists`, - }); - } -}; - -/* -------- Internal Methods -------- */ -const _createRule = async ( - rulesClient: RulesClient, - params: RuleCreateProps, - options: CreateRuleOptions -) => { - const rulesClientCreateRuleOptions = options.id ? { id: options.id } : {}; - - const internalRule = convertCreateAPIToInternalSchema(params, options); - const rule = await rulesClient.create({ - data: internalRule, - options: rulesClientCreateRuleOptions, - allowMissingConnectorSecrets: options.allowMissingConnectorSecrets, - }); - - return rule; -}; - -const _updateRule = async ( - rulesClient: RulesClient, - updateRulePayload: _UpdateRuleProps -): Promise => { - const { ruleUpdate, existingRule } = updateRulePayload; - - const newInternalRule = convertUpdateAPIToInternalSchema({ - existingRule, - ruleUpdate, - }); - - const update = await rulesClient.update({ - id: existingRule.id, - data: newInternalRule, - }); - - return update; -}; - -const _patchRule = async ( - rulesClient: RulesClient, - patchRulePayload: _PatchRuleProps -): Promise => { - const { nextParams, existingRule } = patchRulePayload; - - const patchedRule = convertPatchAPIToInternalSchema(nextParams, existingRule); - - const update = await rulesClient.update({ - id: existingRule.id, - data: patchedRule, - }); - - return update; -}; - -const _upgradePrebuiltRuleWithTypeChange = async ( - rulesClient: RulesClient, - ruleAsset: PrebuiltRuleAsset, - existingRule: RuleAlertType -) => { - // If we're trying to change the type of a prepackaged rule, we need to delete the old one - // and replace it with the new rule, keeping the enabled setting, actions, throttle, id, - // and exception lists from the old rule - await rulesClient.delete({ id: existingRule.id }); - - return _createRule( - rulesClient, - { - ...ruleAsset, - enabled: existingRule.enabled, - exceptions_list: existingRule.params.exceptionsList, - actions: existingRule.actions.map(transformAlertToRuleAction), - timeline_id: existingRule.params.timelineId, - timeline_title: existingRule.params.timelineTitle, - }, - { immutable: true, defaultEnabled: existingRule.enabled, id: existingRule.id } - ); -}; - -const _toggleRuleEnabledOnUpdate = async ( - rulesClient: RulesClient, - existingRule: RuleAlertType, - updatedRuleEnabled?: boolean -) => { - if (existingRule.enabled && updatedRuleEnabled === false) { - await rulesClient.disable({ id: existingRule.id }); - } else if (!existingRule.enabled && updatedRuleEnabled === true) { - await rulesClient.enable({ id: existingRule.id }); - } -}; - -const _validateMlAuth = async (mlAuthz: MlAuthz, ruleType: Type) => { - throwAuthzError(await mlAuthz.validateRuleType(ruleType)); -}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/fetch_rule_by_id.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/fetch_rule_by_id.ts index 520363eb67e5cd..4272af8ee9f94c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/fetch_rule_by_id.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/fetch_rule_by_id.ts @@ -11,7 +11,7 @@ import type { RuleObjectId, RuleResponse, } from '../../../../../../../common/api/detection_engine/model/rule_schema'; -import { readRules } from '../../../../rule_management/logic/rule_management/read_rules'; +import { readRules } from '../../../../rule_management/logic/detection_rules_client/read_rules'; import { transform } from '../../../../rule_management/utils/utils'; // TODO: https://github.com/elastic/kibana/issues/125642 Move to rule_management into a DetectionRulesClient diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts index 6a863728cd7463..6cf237ca583e2d 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/__mocks__/rule_type.ts @@ -104,6 +104,14 @@ export const createRuleTypeMocks = ( alertWithPersistence: jest.fn(), logger: loggerMock, shouldWriteAlerts: () => true, + dataViews: { + createDataViewLazy: jest.fn().mockResolvedValue({ + getFields: jest.fn().mockResolvedValue({ + getFieldMapSorted: jest.fn().mockReturnValue({}), + }), + getSourceFiltering: jest.fn().mockReturnValue({ excludes: [] }), + }), + }, }; return { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts index 72caa1d61ff638..471087fa77a4a3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/create_security_rule_type_wrapper.ts @@ -26,6 +26,8 @@ import { hasTimestampFields, isMachineLearningParams, isEsqlParams, + isQueryParams, + isEqlParams, getDisabledActionsWarningText, } from './utils/utils'; import { DEFAULT_MAX_SIGNALS, DEFAULT_SEARCH_AFTER_PAGE_SIZE } from '../../../../common/constants'; @@ -341,7 +343,12 @@ export const createSecurityRuleTypeWrapper: CreateSecurityRuleTypeWrapper = }); } - if (!isMachineLearningParams(params) && !isEsqlParams(params)) { + if ( + !isMachineLearningParams(params) && + !isEsqlParams(params) && + !isQueryParams(params) && + !isEqlParams(params) + ) { inputIndexFields = await getFieldsForWildcard({ index: inputIndex, dataViews: services.dataViews, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.test.ts index b3bc78e6b9478c..d16e1fa4058822 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.test.ts @@ -142,15 +142,5 @@ describe('generateAlertId', () => { modifiedIdParams.completeRule.ruleParams.query = 'from packetbeat*'; expect(id).toBe(generateAlertId(modifiedIdParams)); }); - - it('creates id dependant on suppression terms', () => { - modifiedIdParams.suppressionTerms = [{ field: 'agent.name', value: ['test-1'] }]; - const id1 = generateAlertId(modifiedIdParams); - modifiedIdParams.suppressionTerms = [{ field: 'agent.name', value: ['test-2'] }]; - const id2 = generateAlertId(modifiedIdParams); - - expect(id).not.toBe(id1); - expect(id1).not.toBe(id2); - }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.ts index 0f549783f922e5..b064079c743fdb 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/utils/generate_alert_id.ts @@ -11,7 +11,6 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/types'; import type { CompleteRule, EsqlRuleParams } from '../../../rule_schema'; import type { SignalSource } from '../../types'; -import type { SuppressionTerm } from '../../utils/suppression_utils'; /** * Generates id for ES|QL alert. * Id is generated as hash of event properties and rule/space config identifiers. @@ -24,7 +23,6 @@ export const generateAlertId = ({ tuple, isRuleAggregating, index, - suppressionTerms, }: { isRuleAggregating: boolean; event: estypes.SearchHit; @@ -36,18 +34,11 @@ export const generateAlertId = ({ maxSignals: number; }; index: number; - suppressionTerms?: SuppressionTerm[]; }) => { const ruleRunId = tuple.from.toISOString() + tuple.to.toISOString(); return !isRuleAggregating && event._id - ? objectHash([ - event._id, - event._version, - event._index, - `${spaceId}:${completeRule.alertId}`, - ...(suppressionTerms ? [suppressionTerms] : []), - ]) + ? objectHash([event._id, event._version, event._index, `${spaceId}:${completeRule.alertId}`]) : objectHash([ ruleRunId, completeRule.ruleParams.query, diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.test.ts index 0c3c910efa0566..c52dd25689e1b3 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.test.ts @@ -55,10 +55,10 @@ describe('wrapSuppressedEsqlAlerts', () => { }, }); - expect(alerts[0]._id).toEqual('d94fb11e6062d7dce881ea07d952a1280398663a'); - expect(alerts[0]._source[ALERT_UUID]).toEqual('d94fb11e6062d7dce881ea07d952a1280398663a'); + expect(alerts[0]._id).toEqual('ed7fbf575371c898e0f0aea48cdf0bf1865939a9'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('ed7fbf575371c898e0f0aea48cdf0bf1865939a9'); expect(alerts[0]._source[ALERT_URL]).toContain( - 'http://somekibanabaseurl.com/app/security/alerts/redirect/d94fb11e6062d7dce881ea07d952a1280398663a?index=.alerts-security.alerts-default' + 'http://somekibanabaseurl.com/app/security/alerts/redirect/ed7fbf575371c898e0f0aea48cdf0bf1865939a9?index=.alerts-security.alerts-default' ); expect(alerts[0]._source[ALERT_SUPPRESSION_DOCS_COUNT]).toEqual(0); expect(alerts[0]._source[ALERT_INSTANCE_ID]).toEqual( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.ts index 057cd5c9061679..7b180d1adfa62a 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/esql/wrap_suppressed_esql_alerts.ts @@ -69,7 +69,6 @@ export const wrapSuppressedEsqlAlerts = ({ tuple, isRuleAggregating, index: i, - suppressionTerms, }); const instanceId = objectHash([suppressionTerms, completeRule.alertId, spaceId]); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.test.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.test.ts index e92bbad5989418..d5cf50fbefcdd0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.test.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.test.ts @@ -48,11 +48,11 @@ describe('wrapSuppressedNewTermsAlerts', () => { primaryTimestamp: '@timestamp', }); - expect(alerts[0]._id).toEqual('3b67aa2ebdc628afc98febc65082d2d83a116d79'); - expect(alerts[0]._source[ALERT_UUID]).toEqual('3b67aa2ebdc628afc98febc65082d2d83a116d79'); + expect(alerts[0]._id).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.1']); expect(alerts[0]._source[ALERT_URL]).toContain( - 'http://somekibanabaseurl.com/app/security/alerts/redirect/3b67aa2ebdc628afc98febc65082d2d83a116d79?index=.alerts-security.alerts-default' + 'http://somekibanabaseurl.com/app/security/alerts/redirect/a36d9fe6fe4b2f65058fb1a487733275f811af58?index=.alerts-security.alerts-default' ); expect(alerts[0]._source[ALERT_SUPPRESSION_DOCS_COUNT]).toEqual(0); expect(alerts[0]._source[ALERT_INSTANCE_ID]).toEqual( @@ -83,10 +83,10 @@ describe('wrapSuppressedNewTermsAlerts', () => { primaryTimestamp: '@timestamp', }); - expect(alerts[0]._id).toEqual('3e0436a03b735af12d6e5358cb36d2c3b39425a8'); - expect(alerts[0]._source[ALERT_UUID]).toEqual('3e0436a03b735af12d6e5358cb36d2c3b39425a8'); + expect(alerts[0]._id).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('a36d9fe6fe4b2f65058fb1a487733275f811af58'); expect(alerts[0]._source[ALERT_URL]).toContain( - 'http://somekibanabaseurl.com/app/security/alerts/redirect/3e0436a03b735af12d6e5358cb36d2c3b39425a8?index=.alerts-security.alerts-default' + 'http://somekibanabaseurl.com/app/security/alerts/redirect/a36d9fe6fe4b2f65058fb1a487733275f811af58?index=.alerts-security.alerts-default' ); expect(alerts[0]._source[ALERT_SUPPRESSION_DOCS_COUNT]).toEqual(0); expect(alerts[0]._source[ALERT_INSTANCE_ID]).toEqual( @@ -111,10 +111,10 @@ describe('wrapSuppressedNewTermsAlerts', () => { primaryTimestamp: '@timestamp', }); - expect(alerts[0]._id).toEqual('f8a029df9c99e245dc83977153a0612178f3d2e8'); - expect(alerts[0]._source[ALERT_UUID]).toEqual('f8a029df9c99e245dc83977153a0612178f3d2e8'); + expect(alerts[0]._id).toEqual('f7877a31b1cc83373dbc9ba5939ebfab1db66545'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('f7877a31b1cc83373dbc9ba5939ebfab1db66545'); expect(alerts[0]._source[ALERT_URL]).toContain( - 'http://somekibanabaseurl.com/s/otherSpace/app/security/alerts/redirect/f8a029df9c99e245dc83977153a0612178f3d2e8?index=.alerts-security.alerts-otherSpace' + 'http://somekibanabaseurl.com/s/otherSpace/app/security/alerts/redirect/f7877a31b1cc83373dbc9ba5939ebfab1db66545?index=.alerts-security.alerts-otherSpace' ); }); @@ -132,11 +132,11 @@ describe('wrapSuppressedNewTermsAlerts', () => { primaryTimestamp: '@timestamp', }); - expect(alerts[0]._id).toEqual('cb8684ec72592346d32839b1838e4f4080dc052e'); - expect(alerts[0]._source[ALERT_UUID]).toEqual('cb8684ec72592346d32839b1838e4f4080dc052e'); + expect(alerts[0]._id).toEqual('75e5a507a4bc48bcd983820c7fd2d9621ff4e2ea'); + expect(alerts[0]._source[ALERT_UUID]).toEqual('75e5a507a4bc48bcd983820c7fd2d9621ff4e2ea'); expect(alerts[0]._source[ALERT_NEW_TERMS]).toEqual(['127.0.0.2']); expect(alerts[0]._source[ALERT_URL]).toContain( - 'http://somekibanabaseurl.com/s/otherSpace/app/security/alerts/redirect/cb8684ec72592346d32839b1838e4f4080dc052e?index=.alerts-security.alerts-otherSpace' + 'http://somekibanabaseurl.com/s/otherSpace/app/security/alerts/redirect/75e5a507a4bc48bcd983820c7fd2d9621ff4e2ea?index=.alerts-security.alerts-otherSpace' ); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.ts index 6aeb48e30fd99b..274a11fc4ffcc8 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/new_terms/wrap_suppressed_new_terms_alerts.ts @@ -67,7 +67,6 @@ export const wrapSuppressedNewTermsAlerts = ({ String(eventAndTerms.event._version), `${spaceId}:${completeRule.alertId}`, eventAndTerms.newTerms, - suppressionTerms, ]); const baseAlert: BaseFieldsLatest = buildBulkBody( diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts index b3de5a39d829fb..272184dbf1e58c 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/query/query.ts @@ -59,6 +59,7 @@ export const queryExecutor = async ({ index: runOpts.inputIndex, exceptionFilter: runOpts.exceptionFilter, fields: runOpts.inputIndexFields, + loadFields: true, }); const license = await firstValueFrom(licensing.license$); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts index f19c4c7ddfe57c..492d27fba091f0 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/threshold/wrap_suppressed_threshold_alerts.ts @@ -82,12 +82,7 @@ export const wrapSuppressedThresholdALerts = ({ const suppressedValues = sortBy(Object.entries(bucket.key).map(([_, value]) => value)); - const id = objectHash([ - hit._index, - hit._id, - `${spaceId}:${completeRule.alertId}`, - suppressedValues, - ]); + const id = objectHash([hit._index, hit._id, `${spaceId}:${completeRule.alertId}`]); const instanceId = objectHash([suppressedValues, completeRule.alertId, spaceId]); diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_filter.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_filter.ts index 7d7492bd17e2b5..920e2c2df9c5e5 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_filter.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_filter.ts @@ -26,7 +26,8 @@ import type { SavedIdOrUndefined } from '../../../../../common/api/detection_eng import type { PartialFilter } from '../../types'; import { withSecuritySpan } from '../../../../utils/with_security_span'; import type { ESBoolQuery } from '../../../../../common/typed_json'; -import { getQueryFilter } from './get_query_filter'; +import { getQueryFilter as getQueryFilterNoLoadFields } from './get_query_filter'; +import { getQueryFilterLoadFields } from './get_query_filter_load_fields'; export interface GetFilterArgs { type: Type; @@ -38,6 +39,7 @@ export interface GetFilterArgs { index: IndexPatternArray | undefined; exceptionFilter: Filter | undefined; fields?: DataViewFieldBase[]; + loadFields?: boolean; } interface QueryAttributes { @@ -59,7 +61,11 @@ export const getFilter = async ({ query, exceptionFilter, fields = [], + loadFields = false, }: GetFilterArgs): Promise => { + const getQueryFilter = loadFields + ? getQueryFilterLoadFields(services.dataViews) + : getQueryFilterNoLoadFields; const queryFilter = () => { if (query != null && language != null && index != null) { return getQueryFilter({ diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_filter_load_fields.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_filter_load_fields.ts new file mode 100644 index 00000000000000..d1c8eab7ac2c29 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/get_query_filter_load_fields.ts @@ -0,0 +1,67 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Language } from '@kbn/securitysolution-io-ts-alerting-types'; +import type { Filter, EsQueryConfig, DataViewFieldBase } from '@kbn/es-query'; +import { DataView } from '@kbn/data-views-plugin/server'; +import { queryToFields } from '@kbn/data-plugin/common'; +import type { DataViewsContract } from '@kbn/data-views-plugin/common'; +import type { FieldFormatsStartCommon } from '@kbn/field-formats-plugin/common'; +import { buildEsQuery } from '@kbn/es-query'; +import type { ESBoolQuery } from '../../../../../common/typed_json'; +import { getAllFilters } from './get_query_filter'; +import type { + IndexPatternArray, + RuleQuery, +} from '../../../../../common/api/detection_engine/model/rule_schema'; + +export const getQueryFilterLoadFields = + (dataViewsService: DataViewsContract) => + async ({ + query, + language, + filters, + index, + exceptionFilter, + }: { + query: RuleQuery; + language: Language; + filters: unknown; + index: IndexPatternArray; + exceptionFilter: Filter | undefined; + fields?: DataViewFieldBase[]; + }): Promise => { + const config: EsQueryConfig = { + allowLeadingWildcards: true, + queryStringOptions: { analyze_wildcard: true }, + ignoreFilterIfFieldNotInIndex: false, + dateFormatTZ: 'Zulu', + }; + + const initialQuery = { query, language }; + const allFilters = getAllFilters(filters as Filter[], exceptionFilter); + + const title = (index ?? []).join(); + + const dataViewLazy = await dataViewsService.createDataViewLazy({ title }); + + const flds = await queryToFields({ + dataView: dataViewLazy, + request: { query: [initialQuery], filters: allFilters }, + }); + + const dataViewLimitedFields = new DataView({ + spec: { title }, + fieldFormats: {} as unknown as FieldFormatsStartCommon, + shortDotsEnable: false, + metaFields: [], + }); + + dataViewLimitedFields.fields.replaceAll(Object.values(flds).map((fld) => fld.toSpec())); + + return buildEsQuery(dataViewLimitedFields, initialQuery, allFilters, config); + }; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts index d08a1f47dc07b6..3268c78dd8ab37 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/utils/wrap_suppressed_alerts.ts @@ -20,6 +20,7 @@ import type { CompleteRule } from '../../rule_schema'; import type { IRuleExecutionLogForExecutors } from '../../rule_monitoring'; import { buildBulkBody } from '../factories/utils/build_bulk_body'; import { getSuppressionAlertFields, getSuppressionTerms } from './suppression_utils'; +import { generateId } from './utils'; import type { BuildReasonMessage } from './reason_formatters'; @@ -59,12 +60,12 @@ export const wrapSuppressedAlerts = ({ fields: event.fields, }); - const id = objectHash([ + const id = generateId( event._index, event._id, - `${spaceId}:${completeRule.alertId}`, - suppressionTerms, - ]); + String(event._version), + `${spaceId}:${completeRule.alertId}` + ); const instanceId = objectHash([suppressionTerms, completeRule.alertId, spaceId]); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.test.ts index 9ec395223c9371..4c818c4d067e4b 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { applyCriticalityToScore, normalize } from './helpers'; +import { applyCriticalityToScore } from './helpers'; describe('applyCriticalityToScore', () => { describe('integer scores', () => { @@ -61,42 +61,3 @@ describe('applyCriticalityToScore', () => { }); }); }); - -describe('normalize', () => { - it('returns 0 if the number is equal to the min', () => { - const result = normalize({ number: 0, min: 0, max: 100 }); - expect(result).toEqual(0); - }); - - it('returns 100 if the number is equal to the max', () => { - const result = normalize({ number: 100, min: 0, max: 100 }); - expect(result).toEqual(100); - }); - - it('returns 50 if the number is halfway between the min and max', () => { - const result = normalize({ number: 50, min: 0, max: 100 }); - expect(result).toEqual(50); - }); - - it('defaults to a min of 0', () => { - const result = normalize({ number: 50, max: 100 }); - expect(result).toEqual(50); - }); - - describe('when the domain is diffrent than the range', () => { - it('returns 0 if the number is equal to the min', () => { - const result = normalize({ number: 20, min: 20, max: 200 }); - expect(result).toEqual(0); - }); - - it('returns 100 if the number is equal to the max', () => { - const result = normalize({ number: 40, min: 30, max: 40 }); - expect(result).toEqual(100); - }); - - it('returns 50 if the number is halfway between the min and max', () => { - const result = normalize({ number: 20, min: 0, max: 40 }); - expect(result).toEqual(50); - }); - }); -}); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.ts index 137f4763c4c383..3b3330d0d65369 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/asset_criticality/helpers.ts @@ -65,22 +65,3 @@ export const bayesianUpdate = ({ const newProbability = priorProbability * modifier; return (max * newProbability) / (1 + newProbability); }; - -/** - * Normalizes a number to the range [0, 100] - * - * @param number - The number to be normalized - * @param min - The minimum possible value of the number. Defaults to 0. - * @param max - The maximum possible value of the number - * - * @returns The updated score with modifiers applied - */ -export const normalize = ({ - number, - min = 0, - max, -}: { - number: number; - min?: number; - max: number; -}) => ((number - min) / (max - min)) * 100; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts index b13a9cda993523..5eb9b436c59b43 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_engine/risk_engine_data_client.test.ts @@ -57,7 +57,7 @@ jest.mock('../utils/create_or_update_index', () => ({ })); jest.spyOn(transforms, 'createTransform').mockResolvedValue(Promise.resolve()); -jest.spyOn(transforms, 'startTransform').mockResolvedValue(Promise.resolve()); +jest.spyOn(transforms, 'scheduleTransformNow').mockResolvedValue(Promise.resolve()); describe('RiskEngineDataClient', () => { for (const useDataStreamForAlerts of [false, true]) { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_risk_scores.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_risk_scores.ts index 9f99a9ae4a5619..27ef27b80070b9 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_risk_scores.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/calculate_risk_scores.ts @@ -30,18 +30,14 @@ import { import { withSecuritySpan } from '../../../utils/with_security_span'; import type { AssetCriticalityRecord } from '../../../../common/api/entity_analytics'; import type { AssetCriticalityService } from '../asset_criticality/asset_criticality_service'; -import { - applyCriticalityToScore, - getCriticalityModifier, - normalize, -} from '../asset_criticality/helpers'; +import { applyCriticalityToScore, getCriticalityModifier } from '../asset_criticality/helpers'; import { getAfterKeyForIdentifierType, getFieldForIdentifier } from './helpers'; import type { CalculateRiskScoreAggregations, CalculateScoresParams, RiskScoreBucket, } from '../types'; -import { RISK_SCORING_SUM_MAX, RISK_SCORING_SUM_VALUE } from './constants'; +import { RIEMANN_ZETA_VALUE, RIEMANN_ZETA_S_VALUE } from './constants'; import { getPainlessScripts, type PainlessScripts } from './painless'; const formatForResponse = ({ @@ -82,10 +78,7 @@ const formatForResponse = ({ calculated_level: calculatedLevel, calculated_score: riskDetails.value.score, calculated_score_norm: normalizedScoreWithCriticality, - category_1_score: normalize({ - number: riskDetails.value.category_1_score, - max: RISK_SCORING_SUM_MAX, - }), + category_1_score: riskDetails.value.category_1_score / RIEMANN_ZETA_VALUE, // normalize value to be between 0-100 category_1_count: riskDetails.value.category_1_count, notes: riskDetails.value.notes, inputs: riskDetails.value.risk_inputs.map((riskInput) => ({ @@ -150,8 +143,8 @@ const buildIdentifierTypeAggregation = ({ map_script: scriptedMetricPainless.map, combine_script: scriptedMetricPainless.combine, params: { - p: RISK_SCORING_SUM_VALUE, - risk_cap: RISK_SCORING_SUM_MAX, + p: RIEMANN_ZETA_S_VALUE, + risk_cap: RIEMANN_ZETA_VALUE, global_identifier_type_weight: globalIdentifierTypeWeight || 1, }, reduce_script: scriptedMetricPainless.reduce, diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.test.ts new file mode 100644 index 00000000000000..b0fab13b109bf7 --- /dev/null +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.test.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { getTransformOptions } from './configurations'; + +describe('getTransformOptions', () => { + it('transform content has changed, please update the transform version and regenerate the snapshot', () => { + const options = getTransformOptions({ + dest: 'dest', + source: ['source'], + }); + + expect(options).toMatchInlineSnapshot(` + Object { + "_meta": Object { + "managed": true, + "managed_by": "security-entity-analytics", + "version": 2, + }, + "dest": Object { + "index": "dest", + }, + "frequency": "1h", + "latest": Object { + "sort": "@timestamp", + "unique_key": Array [ + "host.name", + "user.name", + ], + }, + "settings": Object { + "unattended": true, + }, + "source": Object { + "index": Array [ + "source", + ], + }, + "sync": Object { + "time": Object { + "delay": "0s", + "field": "@timestamp", + }, + }, + } + `); + }); +}); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts index 2077a152e07b4d..6dbf68c699fd5e 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/configurations.ts @@ -4,6 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import type { TransformPutTransformRequest } from '@elastic/elasticsearch/lib/api/types'; import type { FieldMap } from '@kbn/alerts-as-data-utils'; import type { IdentifierType } from '../../../../common/entity_analytics/risk_engine'; import { @@ -135,11 +136,24 @@ export const getIndexPatternDataStream = (namespace: string): IIndexPatternStrin alias: `${riskScoreBaseIndexName}.${riskScoreBaseIndexName}-${namespace}`, }); -export const getTransformOptions = ({ dest, source }: { dest: string; source: string[] }) => ({ +export type TransformOptions = Omit; + +/** + * WARNING: We must increase the version when changing any configuration + * + * The risk engine starts the transforms executions after writing the documents to the risk score index. + * So the transform don't need to run on a schedule. + */ +export const getTransformOptions = ({ + dest, + source, +}: { + dest: string; + source: string[]; +}): Omit => ({ dest: { index: dest, }, - frequency: '1h', latest: { sort: '@timestamp', unique_key: [`host.name`, `user.name`], @@ -147,10 +161,20 @@ export const getTransformOptions = ({ dest, source }: { dest: string; source: st source: { index: source, }, + frequency: '1h', // 1h is the maximum value sync: { time: { - delay: '2s', + delay: '0s', // It doesn't have any delay because the risk engine writes the documents to the index and schedules the transform synchronously. field: '@timestamp', }, }, + settings: { + unattended: true, // In unattended mode, the transform retries indefinitely in case of an error + }, + _meta: { + version: 2, // When this field is updated we automatically update the transform + + managed: true, // Metadata that identifies the transform. It has no functionality + managed_by: 'security-entity-analytics', // Metadata that identifies the transform. It has no functionality + }, }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/constants.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/constants.ts index 6a691eac427346..5f008ebf3d7967 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/constants.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/constants.ts @@ -6,15 +6,36 @@ */ /** - * The risk scoring algorithm uses a Riemann zeta function to sum an entity's risk inputs to a known, finite value (@see RISK_SCORING_SUM_MAX). It does so by assigning each input a weight based on its position in the list (ordered by score) of inputs. This value represents the complex variable s of Re(s) in traditional Riemann zeta function notation. + * The risk scoring algorithm uses a Riemann zeta function to sum an entity's risk inputs to a known, finite value (@see RIEMANN_ZETA_VALUE). + * It does so by assigning each input a weight based on its position in the list (ordered by score) of inputs. + * This value represents the complex variable s of Re(s) in traditional Riemann zeta function notation. + * + * Read more: https://en.wikipedia.org/wiki/Riemann_zeta_function */ -export const RISK_SCORING_SUM_VALUE = 1.5; +export const RIEMANN_ZETA_S_VALUE = 1.5; /** - * Represents the maximum possible risk score sum. This value is derived from RISK_SCORING_SUM_VALUE, but we store the precomputed value here to be used more conveniently in normalization. - * @see RISK_SCORING_SUM_VALUE + * Represents the value calculated by Riemann Zeta function for RIEMANN_ZETA_S_VALUE with 10.000 iterations (inputs) which is the default alertSampleSizePerShard. + * The maximum unnormalized risk score value is calculated by multiplying RIEMANN_ZETA_S_VALUE by the maximum alert risk_score (100). + * + * This value is derived from RIEMANN_ZETA_S_VALUE, but we store the precomputed value here to be used more conveniently in normalization. @see RIEMANN_ZETA_S_VALUE + * + * The Riemann Zeta value for different number of inputs is: + * | 𝑍(s,inputs) | + * | :---------------------------------------| + * | 𝑍(1.5,10)≈1.9953364933456017 | + * | 𝑍(1.5,100)≈2.412874098703719 | + * | 𝑍(1.5,1000)≈2.5491456029175756 | + * | 𝑍(1.5,10_000)≈2.5923758486729866 | + * | 𝑍(1.5,100_000)≈2.6060508091764736 | + * | 𝑍(1.5,1_000_000)≈2.6103753491852295 | + * | 𝑍(1.5,10_000_000)≈2.611742893169012 | + * | 𝑍(1.5,100_000_000)≈2.6121753486854478 | + * | 𝑍(1.5,1_000_000_000)≈2.6123121030481857 | + * + * Read more: https://en.wikipedia.org/wiki/Riemann_zeta_function */ -export const RISK_SCORING_SUM_MAX = 261.2; +export const RIEMANN_ZETA_VALUE = 2.5924; /** * This value represents the maximum possible risk score after normalization. diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/index.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/index.test.ts index e21a6afeff326c..5d25cf38761fe4 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/index.test.ts @@ -17,7 +17,7 @@ describe('getPainlessScripts', () => { "combine": "return state;", "init": "state.inputs = []", "map": "Map fields = new HashMap();fields.put('id', doc['kibana.alert.uuid'].value);fields.put('index', doc['_index'].value);fields.put('time', doc['@timestamp'].value);fields.put('rule_name', doc['kibana.alert.rule.name'].value);fields.put('category', doc['event.kind'].value);fields.put('score', doc['kibana.alert.risk_score'].value);state.inputs.add(fields); ", - "reduce": "Map results = new HashMap();results['notes'] = [];results['category_1_score'] = 0.0;results['category_1_count'] = 0;results['risk_inputs'] = [];results['score'] = 0.0;def inputs = states[0].inputs;Collections.sort(inputs, (a, b) -> b.get('score').compareTo(a.get('score')));for (int i = 0; i < inputs.length; i++) { double current_score = inputs[i].score / Math.pow(i + 1, params.p); if (i < 10) { inputs[i][\\"contribution\\"] = 100 * current_score / params.risk_cap; results['risk_inputs'].add(inputs[i]); } results['category_1_score'] += current_score; results['category_1_count'] += 1; results['score'] += current_score;}results['score'] *= params.global_identifier_type_weight;results['normalized_score'] = 100 * results['score'] / params.risk_cap;return results;", + "reduce": "Map results = new HashMap();results['notes'] = [];results['category_1_score'] = 0.0;results['category_1_count'] = 0;results['risk_inputs'] = [];results['score'] = 0.0;def inputs = states[0].inputs;Collections.sort(inputs, (a, b) -> b.get('score').compareTo(a.get('score')));for (int i = 0; i < inputs.length; i++) { double current_score = inputs[i].score / Math.pow(i + 1, params.p); if (i < 10) { inputs[i]['contribution'] = current_score / params.risk_cap; results['risk_inputs'].add(inputs[i]); } results['category_1_score'] += current_score; results['category_1_count'] += 1; results['score'] += current_score;}results['score'] *= params.global_identifier_type_weight;results['normalized_score'] = results['score'] / params.risk_cap;return results;", } `); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/risk_scoring_reduce.painless b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/risk_scoring_reduce.painless index 629a9255225909..69295bf07330c3 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/risk_scoring_reduce.painless +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/painless/risk_scoring_reduce.painless @@ -22,7 +22,7 @@ for (int i = 0; i < inputs.length; i++) { double current_score = inputs[i].score / Math.pow(i + 1, params.p); if (i < 10) { - inputs[i]["contribution"] = 100 * current_score / params.risk_cap; + inputs[i]['contribution'] = current_score / params.risk_cap; results['risk_inputs'].add(inputs[i]); } @@ -36,6 +36,6 @@ for (int i = 0; i < inputs.length; i++) { } results['score'] *= params.global_identifier_type_weight; -results['normalized_score'] = 100 * results['score'] / params.risk_cap; +results['normalized_score'] = results['score'] / params.risk_cap; return results; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts index 493f419cf6cc2c..2ddd04a7669442 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.test.ts @@ -36,7 +36,7 @@ jest.mock('../utils/create_or_update_index', () => ({ })); jest.spyOn(transforms, 'createTransform').mockResolvedValue(Promise.resolve()); -jest.spyOn(transforms, 'startTransform').mockResolvedValue(Promise.resolve()); +jest.spyOn(transforms, 'scheduleTransformNow').mockResolvedValue(Promise.resolve()); describe('RiskScoreDataClient', () => { let riskScoreDataClient: RiskScoreDataClient; @@ -428,11 +428,19 @@ describe('RiskScoreDataClient', () => { }, sync: { time: { - delay: '2s', + delay: '0s', field: '@timestamp', }, }, transform_id: 'risk_score_latest_transform_default', + settings: { + unattended: true, + }, + _meta: { + version: 2, + managed: true, + managed_by: 'security-entity-analytics', + }, }, }); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts index c0920188acd31a..a95b29e5cc6ee9 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_data_client.ts @@ -28,7 +28,10 @@ import { import { createDataStream } from '../utils/create_datastream'; import type { RiskEngineDataWriter as Writer } from './risk_engine_data_writer'; import { RiskEngineDataWriter } from './risk_engine_data_writer'; -import { getRiskScoreLatestIndex } from '../../../../common/entity_analytics/risk_engine'; +import { + getRiskScoreLatestIndex, + getRiskScoreTimeSeriesIndex, +} from '../../../../common/entity_analytics/risk_engine'; import { createTransform, getLatestTransformId } from '../utils/transforms'; import { getRiskInputsIndex } from './get_risk_inputs_index'; @@ -71,6 +74,12 @@ export class RiskScoreDataClient { return writer; } + public refreshRiskScoreIndex = async () => { + await this.options.esClient.indices.refresh({ + index: getRiskScoreTimeSeriesIndex(this.options.namespace), + }); + }; + public getRiskInputsIndex = ({ dataViewId }: { dataViewId: string }) => getRiskInputsIndex({ dataViewId, diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.mock.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.mock.ts index 2423a87559b17f..d1b74637725db1 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.mock.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.mock.ts @@ -35,6 +35,7 @@ const createRiskScoreServiceMock = (): jest.Mocked => ({ getConfigurationWithDefaults: jest.fn(), getRiskInputsIndex: jest.fn(), scheduleLatestTransformNow: jest.fn(), + refreshRiskScoreIndex: jest.fn(), }); export const riskScoreServiceMock = { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts index cb89d61d8720d5..4d39eb9a068a57 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/risk_score_service.ts @@ -35,6 +35,7 @@ export interface RiskScoreService { ) => Promise; getRiskInputsIndex: ({ dataViewId }: { dataViewId: string }) => Promise; scheduleLatestTransformNow: () => Promise; + refreshRiskScoreIndex: () => Promise; } export interface RiskScoreServiceFactoryParams { @@ -83,5 +84,7 @@ export const riskScoreServiceFactory = ({ }; }, getRiskInputsIndex: async (params) => riskScoreDataClient.getRiskInputsIndex(params), - scheduleLatestTransformNow: () => scheduleLatestTransformNow({ namespace: spaceId, esClient }), + scheduleLatestTransformNow: () => + scheduleLatestTransformNow({ namespace: spaceId, esClient, logger }), + refreshRiskScoreIndex: () => riskScoreDataClient.refreshRiskScoreIndex(), }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts index dbb8459d0ae42a..54b42d02c54951 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.test.ts @@ -85,6 +85,16 @@ describe('entity risk score calculation route', () => { expect(response.status).toEqual(200); }); + it('should schedule transform when risk scores are persisted ', async () => { + const request = buildRequest(); + + const response = await server.inject(request, requestContextMock.convertContext(context)); + + expect(mockRiskScoreService.scheduleLatestTransformNow).toHaveBeenCalled(); + + expect(response.status).toEqual(200); + }); + it('should call "calculateAndPersistScores" with entity filter', async () => { const request = buildRequest(); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts index 502e296db36449..fe6e404e9e96db 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/routes/entity_calculation.ts @@ -146,6 +146,10 @@ export const riskScoreEntityCalculationRoute = ( }); } + if (result.scores_written > 0) { + await riskScoreService.scheduleLatestTransformNow(); + } + const score = result.scores_written === 1 ? result.scores?.[identifierType]?.[0] : undefined; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts index 7e1519e3745c40..2b7f77b407d310 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.test.ts @@ -474,19 +474,6 @@ describe('Risk Scoring Task', () => { expect.stringContaining('task was cancelled') ); }); - - it('schedules the transform to run now', async () => { - await runTask({ - getRiskScoreService, - isCancelled: mockIsCancelled, - logger: mockLogger, - taskInstance: riskScoringTaskInstanceMock, - telemetry: mockTelemetry, - entityAnalyticsConfig, - }); - - expect(mockRiskScoreService.scheduleLatestTransformNow).toHaveBeenCalledTimes(1); - }); }); describe('when execution was successful', () => { @@ -520,6 +507,19 @@ describe('Risk Scoring Task', () => { expect(mockRiskScoreService.scheduleLatestTransformNow).toHaveBeenCalledTimes(1); }); + + it('refreshes the risk score index', async () => { + await runTask({ + getRiskScoreService, + isCancelled: mockIsCancelled, + logger: mockLogger, + taskInstance: riskScoringTaskInstanceMock, + telemetry: mockTelemetry, + entityAnalyticsConfig, + }); + + expect(mockRiskScoreService.refreshRiskScoreIndex).toHaveBeenCalledTimes(1); + }); }); describe('when execution was unsuccessful', () => { diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts index 1b2b44dae6a95f..da4a48dfd02d2e 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/risk_score/tasks/risk_scoring_task.ts @@ -310,15 +310,20 @@ export const runTask = async ({ }; telemetry.reportEvent(RISK_SCORE_EXECUTION_SUCCESS_EVENT.eventType, telemetryEvent); - await riskScoreService.scheduleLatestTransformNow(); - if (isCancelled()) { log('task was cancelled'); telemetry.reportEvent(RISK_SCORE_EXECUTION_CANCELLATION_EVENT.eventType, telemetryEvent); } + if (scoresWritten > 0) { + log('refreshing risk score index and scheduling transform'); + await riskScoreService.refreshRiskScoreIndex(); + await riskScoreService.scheduleLatestTransformNow(); + } + log('task run completed'); log(JSON.stringify({ ...telemetryEvent, runs })); + return { state: updatedState, }; diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.test.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.test.ts index 25aeaa4ad566d6..ff1aa5e041c603 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.test.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.test.ts @@ -5,9 +5,17 @@ * 2.0. */ -import type { TransformGetTransformStatsResponse } from '@elastic/elasticsearch/lib/api/types'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; -import { scheduleTransformNow } from './transforms'; +import type { + TransformGetTransformResponse, + TransformGetTransformStatsResponse, +} from '@elastic/elasticsearch/lib/api/types'; +import { elasticsearchServiceMock, loggingSystemMock } from '@kbn/core/server/mocks'; +import { + getRiskScoreLatestIndex, + getRiskScoreTimeSeriesIndex, +} from '../../../../common/entity_analytics/risk_engine'; +import { getTransformOptions } from '../risk_score/configurations'; +import { scheduleLatestTransformNow, scheduleTransformNow } from './transforms'; const transformId = 'test_transform_id'; @@ -31,6 +39,44 @@ const stoppedTransformsMock = { ], } as TransformGetTransformStatsResponse; +const latestIndex = getRiskScoreLatestIndex('tests'); +const timeSeriesIndex = getRiskScoreTimeSeriesIndex('tests'); +const transformConfig = getTransformOptions({ + dest: latestIndex, + source: [timeSeriesIndex], +}); + +const updatedTransformsMock = { + count: 1, + transforms: [ + { + id: 'test_transform_id_3', + ...transformConfig, + }, + ], +} as TransformGetTransformResponse; + +const outdatedTransformsMock = { + count: 1, + transforms: [ + { + ...transformConfig, + id: 'test_transform_id_3', + sync: { + time: { + field: '@timestamp', + delay: '2s', + }, + }, + _meta: { + version: '1', + }, + }, + ], +} as TransformGetTransformResponse; + +const logger = loggingSystemMock.createLogger(); + describe('transforms utils', () => { beforeEach(() => { jest.resetAllMocks(); @@ -55,4 +101,39 @@ describe('transforms utils', () => { expect(esClient.transform.scheduleNowTransform).toHaveBeenCalled(); }); }); + + describe('scheduleLatestTransformNow', () => { + it('update the latest transform when scheduleTransformNow is called and the transform is outdated', async () => { + const esClient = elasticsearchServiceMock.createScopedClusterClient().asCurrentUser; + esClient.transform.getTransformStats.mockResolvedValueOnce(stoppedTransformsMock); + esClient.transform.getTransform.mockResolvedValueOnce(outdatedTransformsMock); + + await scheduleLatestTransformNow({ esClient, namespace: 'tests', logger }); + + expect(esClient.transform.updateTransform).toHaveBeenCalled(); + }); + + it('does not update the latest transform when scheduleTransformNow is called if the transform is updated', async () => { + const esClient = elasticsearchServiceMock.createScopedClusterClient().asCurrentUser; + esClient.transform.getTransformStats.mockResolvedValueOnce(stoppedTransformsMock); + esClient.transform.getTransform.mockResolvedValueOnce(updatedTransformsMock); + + await scheduleLatestTransformNow({ esClient, namespace: 'tests', logger }); + + expect(esClient.transform.updateTransform).not.toHaveBeenCalled(); + }); + + it('it logs the error if update transform fails', async () => { + const esClient = elasticsearchServiceMock.createScopedClusterClient().asCurrentUser; + esClient.transform.getTransformStats.mockResolvedValueOnce(stoppedTransformsMock); + esClient.transform.getTransform.mockResolvedValueOnce(outdatedTransformsMock); + esClient.transform.updateTransform.mockRejectedValueOnce(new Error('Test error')); + + await scheduleLatestTransformNow({ esClient, namespace: 'tests', logger }); + + expect(logger.error).toHaveBeenCalledWith( + 'There was an error upgrading the transform risk_score_latest_transform_tests. Continuing with transform scheduling. Test error' + ); + }); + }); }); diff --git a/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.ts b/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.ts index d1a544233339e3..35a7f7113bfa59 100644 --- a/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.ts +++ b/x-pack/plugins/security_solution/server/lib/entity_analytics/utils/transforms.ts @@ -14,11 +14,17 @@ import type { TransformPutTransformRequest, TransformGetTransformStatsTransformStats, } from '@elastic/elasticsearch/lib/api/types'; +import { + getRiskScoreLatestIndex, + getRiskScoreTimeSeriesIndex, +} from '../../../../common/entity_analytics/risk_engine'; import { RiskScoreEntity } from '../../../../common/search_strategy'; import { getRiskScorePivotTransformId, getRiskScoreLatestTransformId, } from '../../../../common/utils/risk_score_modules'; +import type { TransformOptions } from '../risk_score/configurations'; +import { getTransformOptions } from '../risk_score/configurations'; export const getLegacyTransforms = async ({ namespace, @@ -107,51 +113,66 @@ const hasTransformStarted = (transformStats: TransformGetTransformStatsTransform return transformStats.state === 'indexing' || transformStats.state === 'started'; }; -export const startTransform = async ({ +export const scheduleTransformNow = async ({ esClient, transformId, }: { esClient: ElasticsearchClient; transformId: string; -}): Promise => { +}): Promise => { const transformStats = await esClient.transform.getTransformStats({ transform_id: transformId, }); if (transformStats.count <= 0) { throw new Error( - `Unable to find transform status for [${transformId}] while attempting to start` + `Unable to find transform status for [${transformId}] while attempting to schedule` ); } - if (hasTransformStarted(transformStats.transforms[0])) { - return; - } - return esClient.transform.startTransform({ transform_id: transformId }); + if (!hasTransformStarted(transformStats.transforms[0])) { + await esClient.transform.startTransform({ + transform_id: transformId, + }); + } else { + await esClient.transform.scheduleNowTransform({ + transform_id: transformId, + }); + } }; -export const scheduleTransformNow = async ({ +/** + * Whenever we change the latest transform configuration, we must ensure we update the transform in environments where it has already been installed. + */ +const upgradeLatestTransformIfNeeded = async ({ esClient, - transformId, + namespace, + logger, }: { esClient: ElasticsearchClient; - transformId: string; + namespace: string; + logger: Logger; }): Promise => { - const transformStats = await esClient.transform.getTransformStats({ + const transformId = getLatestTransformId(namespace); + const latestIndex = getRiskScoreLatestIndex(namespace); + const timeSeriesIndex = getRiskScoreTimeSeriesIndex(namespace); + + const response = await esClient.transform.getTransform({ transform_id: transformId, }); - if (transformStats.count <= 0) { - throw new Error( - `Unable to find transform status for [${transformId}] while attempting to schedule now` - ); - } - if (hasTransformStarted(transformStats.transforms[0])) { - await esClient.transform.scheduleNowTransform({ - transform_id: transformId, - }); - } else { - await esClient.transform.startTransform({ + const newConfig = getTransformOptions({ + dest: latestIndex, + source: [timeSeriesIndex], + }); + + if (isTransformOutdated(response.transforms[0], newConfig)) { + logger.info(`Upgrading transform ${transformId}`); + + const { latest: _unused, ...changes } = newConfig; + + await esClient.transform.updateTransform({ transform_id: transformId, + ...changes, }); } }; @@ -159,10 +180,30 @@ export const scheduleTransformNow = async ({ export const scheduleLatestTransformNow = async ({ namespace, esClient, + logger, }: { namespace: string; esClient: ElasticsearchClient; + logger: Logger; }): Promise => { const transformId = getLatestTransformId(namespace); + + try { + await upgradeLatestTransformIfNeeded({ esClient, namespace, logger }); + } catch (err) { + logger.error( + `There was an error upgrading the transform ${transformId}. Continuing with transform scheduling. ${err.message}` + ); + } + await scheduleTransformNow({ esClient, transformId }); }; + +/** + * Whitelist the transform fields that we can update. + */ + +const isTransformOutdated = ( + transform: TransformGetTransformTransformSummary, + newConfig: TransformOptions +): boolean => transform._meta?.version !== newConfig._meta?.version; diff --git a/x-pack/plugins/security_solution/server/lib/machine_learning/authz.ts b/x-pack/plugins/security_solution/server/lib/machine_learning/authz.ts index f96866d968e4bc..aa880c79393d3a 100644 --- a/x-pack/plugins/security_solution/server/lib/machine_learning/authz.ts +++ b/x-pack/plugins/security_solution/server/lib/machine_learning/authz.ts @@ -28,7 +28,7 @@ export interface MlAuthz { * @param ml {@link MlPluginSetup} ML services to fetch ML capabilities * @param request A {@link KibanaRequest} representing the authenticated user * - * @returns A {@link MLAuthz} service object + * @returns A {@link MlAuthz} service object */ export const buildMlAuthz = ({ license, diff --git a/x-pack/plugins/security_solution/server/request_context_factory.ts b/x-pack/plugins/security_solution/server/request_context_factory.ts index f2e090b389ff6a..1f36f7ecff234e 100644 --- a/x-pack/plugins/security_solution/server/request_context_factory.ts +++ b/x-pack/plugins/security_solution/server/request_context_factory.ts @@ -28,7 +28,8 @@ import type { EndpointAppContextService } from './endpoint/endpoint_app_context_ import { RiskEngineDataClient } from './lib/entity_analytics/risk_engine/risk_engine_data_client'; import { RiskScoreDataClient } from './lib/entity_analytics/risk_score/risk_score_data_client'; import { AssetCriticalityDataClient } from './lib/entity_analytics/asset_criticality'; -import { createDetectionRulesClient } from './lib/detection_engine/rule_management/logic/rule_management/detection_rules_client'; +import { createDetectionRulesClient } from './lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client'; +import { buildMlAuthz } from './lib/machine_learning/authz'; export interface IRequestContextFactory { create( @@ -113,14 +114,19 @@ export class RequestContextFactory implements IRequestContextFactory { getAuditLogger, - getDetectionRulesClient: () => - createDetectionRulesClient( - startPlugins.alerting.getRulesClientWithRequest(request), + getDetectionRulesClient: memoize(() => { + const mlAuthz = buildMlAuthz({ + license: licensing.license, + ml: plugins.ml, request, - coreContext.savedObjects.client, - licensing, - plugins.ml - ), + savedObjectsClient: coreContext.savedObjects.client, + }); + + return createDetectionRulesClient( + startPlugins.alerting.getRulesClientWithRequest(request), + mlAuthz + ); + }), getDetectionEngineHealthClient: memoize(() => ruleMonitoringService.createDetectionEngineHealthClient({ diff --git a/x-pack/plugins/security_solution/server/types.ts b/x-pack/plugins/security_solution/server/types.ts index 563d61bfae3070..121eb7b1758f48 100644 --- a/x-pack/plugins/security_solution/server/types.ts +++ b/x-pack/plugins/security_solution/server/types.ts @@ -33,7 +33,7 @@ import type { EndpointInternalFleetServicesInterface } from './endpoint/services import type { RiskEngineDataClient } from './lib/entity_analytics/risk_engine/risk_engine_data_client'; import type { RiskScoreDataClient } from './lib/entity_analytics/risk_score/risk_score_data_client'; import type { AssetCriticalityDataClient } from './lib/entity_analytics/asset_criticality'; -import type { IDetectionRulesClient } from './lib/detection_engine/rule_management/logic/rule_management/detection_rules_client'; +import type { IDetectionRulesClient } from './lib/detection_engine/rule_management/logic/detection_rules_client/detection_rules_client_interface'; export { AppClient }; export interface SecuritySolutionApiRequestHandlerContext { diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts b/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts index 32c874ef32eb71..e5f7cfeaec65cd 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/curl.ts @@ -32,7 +32,7 @@ export API_KEY="${apiKey}"`, }, iconType: 'curl.svg', id: Languages.CURL, - ingestData: ({ ingestPipeline }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty"${ + ingestData: ({ ingestPipeline }) => `curl -X POST "\$\{ES_URL\}/_bulk?pretty${ ingestPipeline ? `&pipeline=${ingestPipeline}` : '' }" \\ -H "Authorization: ApiKey "\$\{API_KEY\}"" \\ diff --git a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts index af54d4ccb6d566..36d9a48bedffb0 100644 --- a/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts +++ b/x-pack/plugins/serverless_search/server/routes/connectors_routes.ts @@ -73,7 +73,6 @@ export const registerConnectorsRoutes = ({ http, router }: RouteDependencies) => const { client } = (await context.core).elasticsearch; const connector = await createConnector(client.asCurrentUser, { indexName: null, - instant_response: true, isNative: false, language: null, }); diff --git a/x-pack/plugins/spaces/kibana.jsonc b/x-pack/plugins/spaces/kibana.jsonc index efa3f85cd5b77f..e46747a401ea40 100644 --- a/x-pack/plugins/spaces/kibana.jsonc +++ b/x-pack/plugins/spaces/kibana.jsonc @@ -26,6 +26,7 @@ ], "extraPublicDirs": [ "common" - ] + ], + "runtimePluginDependencies": ["security"] } -} \ No newline at end of file +} diff --git a/x-pack/plugins/spaces/public/management/management_service.test.ts b/x-pack/plugins/spaces/public/management/management_service.test.ts index 88b88b0e9e7dd1..23c669ded0f4bf 100644 --- a/x-pack/plugins/spaces/public/management/management_service.test.ts +++ b/x-pack/plugins/spaces/public/management/management_service.test.ts @@ -11,6 +11,7 @@ import type { ManagementSection } from '@kbn/management-plugin/public'; import { managementPluginMock } from '@kbn/management-plugin/public/mocks'; import { ManagementService } from './management_service'; +import { getRolesAPIClientMock } from './roles_api_client.mock'; import type { ConfigType } from '../config'; import type { PluginsStart } from '../plugin'; import { spacesManagerMock } from '../spaces_manager/mocks'; @@ -36,6 +37,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: getRolesAPIClientMock, }); expect(mockKibanaSection.registerApp).toHaveBeenCalledTimes(1); @@ -55,6 +57,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: getRolesAPIClientMock, }); }); }); @@ -75,6 +78,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + getRolesAPIClient: jest.fn(), }); service.stop(); diff --git a/x-pack/plugins/spaces/public/management/management_service.tsx b/x-pack/plugins/spaces/public/management/management_service.tsx index de9e7dfdeb717b..e4836da797182c 100644 --- a/x-pack/plugins/spaces/public/management/management_service.tsx +++ b/x-pack/plugins/spaces/public/management/management_service.tsx @@ -7,6 +7,7 @@ import type { StartServicesAccessor } from '@kbn/core/public'; import type { ManagementApp, ManagementSetup } from '@kbn/management-plugin/public'; +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; import { spacesManagementApp } from './spaces_management_app'; import type { ConfigType } from '../config'; @@ -18,14 +19,21 @@ interface SetupDeps { getStartServices: StartServicesAccessor; spacesManager: SpacesManager; config: ConfigType; + getRolesAPIClient: () => Promise; } export class ManagementService { private registeredSpacesManagementApp?: ManagementApp; - public setup({ getStartServices, management, spacesManager, config }: SetupDeps) { + public setup({ + getStartServices, + management, + spacesManager, + config, + getRolesAPIClient, + }: SetupDeps) { this.registeredSpacesManagementApp = management.sections.section.kibana.registerApp( - spacesManagementApp.create({ getStartServices, spacesManager, config }) + spacesManagementApp.create({ getStartServices, spacesManager, config, getRolesAPIClient }) ); } diff --git a/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts b/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts new file mode 100644 index 00000000000000..dd996814f9e512 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; + +export const createRolesAPIClientMock = (): RolesAPIClient => { + return { + getRoles: jest.fn(), + getRole: jest.fn(), + saveRole: jest.fn(), + deleteRole: jest.fn(), + }; +}; + +export const getRolesAPIClientMock = jest.fn().mockResolvedValue(createRolesAPIClientMock()); diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx index 649b74cb14ee1a..89e1fc01d493e4 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx @@ -52,6 +52,7 @@ async function mountApp(basePath: string, pathname: string, spaceId?: string) { spacesManager, getStartServices: async () => [coreStart, pluginsStart as PluginsStart, {}], config, + getRolesAPIClient: jest.fn(), }) .mount({ basePath, @@ -72,6 +73,7 @@ describe('spacesManagementApp', () => { spacesManager: spacesManagerMock.create(), getStartServices: coreMock.createSetup().getStartServices as any, config, + getRolesAPIClient: jest.fn(), }) ).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx index 1819b22cb7f3b7..fe6776b33f9202 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx @@ -14,6 +14,7 @@ import { i18n } from '@kbn/i18n'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import type { RegisterManagementAppArgs } from '@kbn/management-plugin/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; +import type { RolesAPIClient } from '@kbn/security-plugin-types-public'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { Route, Router, Routes } from '@kbn/shared-ux-router'; @@ -26,6 +27,7 @@ interface CreateParams { getStartServices: StartServicesAccessor; spacesManager: SpacesManager; config: ConfigType; + getRolesAPIClient: () => Promise; } export const spacesManagementApp = Object.freeze({ diff --git a/x-pack/plugins/spaces/public/plugin.tsx b/x-pack/plugins/spaces/public/plugin.tsx index 02aad20bee27bd..14d816739b4c98 100644 --- a/x-pack/plugins/spaces/public/plugin.tsx +++ b/x-pack/plugins/spaces/public/plugin.tsx @@ -9,6 +9,7 @@ import type { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from '@kb import type { FeaturesPluginStart } from '@kbn/features-plugin/public'; import type { HomePublicPluginSetup } from '@kbn/home-plugin/public'; import type { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public'; +import type { SecurityPluginStart } from '@kbn/security-plugin-types-public'; import type { ConfigType } from './config'; import { createSpacesFeatureCatalogueEntry } from './create_feature_catalogue_entry'; @@ -54,7 +55,6 @@ export class SpacesPlugin implements Plugin, plugins: PluginsSetup) { const hasOnlyDefaultSpace = this.config.maxSpaces === 1; - this.spacesManager = new SpacesManager(core.http); this.spacesApi = { ui: getUiApi({ @@ -67,6 +67,18 @@ export class SpacesPlugin implements Plugin { + const { security } = await core.plugins.onSetup<{ security: SecurityPluginStart }>( + 'security' + ); + + if (!security.found) { + throw new Error('Security plugin is not available as runtime dependency.'); + } + + return security.contract.authz.roles; + }; + if (plugins.home) { plugins.home.featureCatalogue.register(createSpacesFeatureCatalogueEntry()); } @@ -78,6 +90,7 @@ export class SpacesPlugin implements Plugin { }, expectedLocation: '/mock-server-basepath/app/management/kibana/home', }, + { + query: { + next: '/app/management/kibana/objects?initialQuery=type:(visualization)', + }, + expectedLocation: + '/mock-server-basepath/app/management/kibana/objects?initialQuery=type:(visualization)', + }, ]) { const request = httpServerMock.createKibanaRequest({ query, diff --git a/x-pack/plugins/spaces/server/routes/views/index.ts b/x-pack/plugins/spaces/server/routes/views/index.ts index 73fa47338dd76c..495e0132059be7 100644 --- a/x-pack/plugins/spaces/server/routes/views/index.ts +++ b/x-pack/plugins/spaces/server/routes/views/index.ts @@ -42,11 +42,11 @@ export function initSpacesViewsRoutes(deps: ViewRouteDeps) { const route = nextCandidateRoute === '/' ? defaultRoute : nextCandidateRoute; // need to get reed of ../../ to make sure we will not be out of space basePath - const normalizedRoute = new URL(route, 'https://localhost').pathname; + const normalizedRoute = new URL(route, 'https://localhost'); return response.redirected({ headers: { - location: `${basePath}${normalizedRoute}`, + location: `${basePath}${normalizedRoute.pathname}${normalizedRoute.search}`, }, }); } catch (e) { diff --git a/x-pack/plugins/spaces/tsconfig.json b/x-pack/plugins/spaces/tsconfig.json index f912a1231e6082..048004ff11334b 100644 --- a/x-pack/plugins/spaces/tsconfig.json +++ b/x-pack/plugins/spaces/tsconfig.json @@ -35,6 +35,7 @@ "@kbn/core-http-server", "@kbn/react-kibana-context-render", "@kbn/utility-types-jest", + "@kbn/security-plugin-types-public", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx index f31dc2fab4383e..a6af4a2ae48a44 100644 --- a/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx +++ b/x-pack/plugins/stack_alerts/public/rule_types/threshold/visualization.tsx @@ -223,7 +223,6 @@ export const ThresholdVisualization: React.FunctionComponent = ({ } color="danger" diff --git a/x-pack/plugins/stack_connectors/common/gemini/constants.ts b/x-pack/plugins/stack_connectors/common/gemini/constants.ts new file mode 100644 index 00000000000000..2df2e4f635e330 --- /dev/null +++ b/x-pack/plugins/stack_connectors/common/gemini/constants.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. + */ + +import { i18n } from '@kbn/i18n'; + +export const GEMINI_TITLE = i18n.translate( + 'xpack.stackConnectors.components.gemini.connectorTypeTitle', + { + defaultMessage: 'Google Gemini', + } +); +export const GEMINI_CONNECTOR_ID = '.gemini'; +export enum SUB_ACTION { + RUN = 'run', + DASHBOARD = 'getDashboard', + TEST = 'test', +} + +export const DEFAULT_TOKEN_LIMIT = 8192; +export const DEFAULT_TIMEOUT_MS = 60000; +export const DEFAULT_GCP_REGION = 'us-central1'; +export const DEFAULT_GEMINI_MODEL = 'gemini-1.5-pro-preview-0409'; +export const DEFAULT_GEMINI_URL = `https://us-central1-aiplatform.googleapis.com` as const; diff --git a/x-pack/plugins/stack_connectors/common/gemini/schema.ts b/x-pack/plugins/stack_connectors/common/gemini/schema.ts new file mode 100644 index 00000000000000..aa29f92916db91 --- /dev/null +++ b/x-pack/plugins/stack_connectors/common/gemini/schema.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import { DEFAULT_GEMINI_MODEL } from './constants'; + +export const ConfigSchema = schema.object({ + apiUrl: schema.string(), + defaultModel: schema.string({ defaultValue: DEFAULT_GEMINI_MODEL }), + gcpRegion: schema.string(), + gcpProjectID: schema.string(), +}); + +export const SecretsSchema = schema.object({ + credentialsJson: schema.string(), +}); + +export const RunActionParamsSchema = schema.object({ + body: schema.string(), + model: schema.maybe(schema.string()), + signal: schema.maybe(schema.any()), + timeout: schema.maybe(schema.number()), +}); + +export const RunApiResponseSchema = schema.object({ + candidates: schema.any(), + usageMetadata: schema.object({ + promptTokenCount: schema.number(), + candidatesTokenCount: schema.number(), + totalTokenCount: schema.number(), + }), +}); + +export const RunActionResponseSchema = schema.object( + { + completion: schema.string(), + stop_reason: schema.maybe(schema.string()), + usageMetadata: schema.maybe( + schema.object({ + promptTokenCount: schema.number(), + candidatesTokenCount: schema.number(), + totalTokenCount: schema.number(), + }) + ), + }, + { unknowns: 'ignore' } +); + +export const DashboardActionParamsSchema = schema.object({ + dashboardId: schema.string(), +}); + +export const DashboardActionResponseSchema = schema.object({ + available: schema.boolean(), +}); diff --git a/x-pack/plugins/stack_connectors/common/gemini/types.ts b/x-pack/plugins/stack_connectors/common/gemini/types.ts new file mode 100644 index 00000000000000..12d3ed4a6b1c44 --- /dev/null +++ b/x-pack/plugins/stack_connectors/common/gemini/types.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypeOf } from '@kbn/config-schema'; +import { + ConfigSchema, + DashboardActionParamsSchema, + DashboardActionResponseSchema, + SecretsSchema, + RunActionParamsSchema, + RunActionResponseSchema, + RunApiResponseSchema, +} from './schema'; + +export type Config = TypeOf; +export type Secrets = TypeOf; +export type RunActionParams = TypeOf; +export type RunApiResponse = TypeOf; +export type RunActionResponse = TypeOf; +export type DashboardActionParams = TypeOf; +export type DashboardActionResponse = TypeOf; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.test.tsx new file mode 100644 index 00000000000000..55e7385926ad19 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.test.tsx @@ -0,0 +1,203 @@ +/* + * Copyright 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 GeminiConnectorFields from './connector'; +import { ConnectorFormTestProvider } from '../lib/test_utils'; +import { act, fireEvent, render, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { useKibana } from '@kbn/triggers-actions-ui-plugin/public'; +import { DEFAULT_GEMINI_MODEL } from '../../../common/gemini/constants'; +import { useGetDashboard } from '../lib/gen_ai/use_get_dashboard'; +import { createStartServicesMock } from '@kbn/triggers-actions-ui-plugin/public/common/lib/kibana/kibana_react.mock'; + +const mockUseKibanaReturnValue = createStartServicesMock(); +jest.mock('@kbn/triggers-actions-ui-plugin/public/common/lib/kibana', () => ({ + __esModule: true, + useKibana: jest.fn(() => ({ + services: mockUseKibanaReturnValue, + })), +})); +jest.mock('../lib/gen_ai/use_get_dashboard'); + +const useKibanaMock = useKibana as jest.Mocked; +const mockDashboard = useGetDashboard as jest.Mock; +const geminiConnector = { + actionTypeId: '.gemini', + name: 'gemini', + id: '123', + config: { + apiUrl: 'https://geminiurl.com', + defaultModel: DEFAULT_GEMINI_MODEL, + gcpRegion: 'us-central-1', + gcpProjectID: 'test-project', + }, + secrets: { + credentialsJSON: JSON.stringify({ + type: 'service_account', + project_id: '', + private_key_id: '', + private_key: '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n', + client_email: '', + client_id: '', + auth_uri: 'https://accounts.google.com/o/oauth2/auth', + token_uri: 'https://oauth2.googleapis.com/token', + auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: '', + }), + }, + isDeprecated: false, +}; + +const navigateToUrl = jest.fn(); + +describe('GeminiConnectorFields renders', () => { + beforeEach(() => { + jest.clearAllMocks(); + useKibanaMock().services.application.navigateToUrl = navigateToUrl; + mockDashboard.mockImplementation(({ connectorId }) => ({ + dashboardUrl: `https://dashboardurl.com/${connectorId}`, + })); + }); + + test('Gemini connector fields are rendered', async () => { + const { getAllByTestId } = render( + + {}} + /> + + ); + + expect(getAllByTestId('config.apiUrl-input')[0]).toBeInTheDocument(); + expect(getAllByTestId('config.apiUrl-input')[0]).toHaveValue(geminiConnector.config.apiUrl); + expect(getAllByTestId('config.defaultModel-input')[0]).toBeInTheDocument(); + expect(getAllByTestId('config.defaultModel-input')[0]).toHaveValue( + geminiConnector.config.defaultModel + ); + expect(getAllByTestId('gemini-api-doc')[0]).toBeInTheDocument(); + expect(getAllByTestId('gemini-api-model-doc')[0]).toBeInTheDocument(); + }); + + describe('Dashboard link', () => { + it('Does not render if isEdit is false and dashboardUrl is defined', async () => { + const { queryByTestId } = render( + + {}} + /> + + ); + expect(queryByTestId('link-gen-ai-token-dashboard')).not.toBeInTheDocument(); + }); + it('Does not render if isEdit is true and dashboardUrl is null', async () => { + mockDashboard.mockImplementation((id: string) => ({ + dashboardUrl: null, + })); + const { queryByTestId } = render( + + {}} /> + + ); + expect(queryByTestId('link-gen-ai-token-dashboard')).not.toBeInTheDocument(); + }); + it('Renders if isEdit is true and dashboardUrl is defined', async () => { + const { getByTestId } = render( + + {}} /> + + ); + expect(getByTestId('link-gen-ai-token-dashboard')).toBeInTheDocument(); + }); + it('On click triggers redirect with correct saved object id', async () => { + const { getByTestId } = render( + + {}} /> + + ); + fireEvent.click(getByTestId('link-gen-ai-token-dashboard')); + expect(navigateToUrl).toHaveBeenCalledWith(`https://dashboardurl.com/123`); + }); + }); + + describe('Validation', () => { + const onSubmit = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('validates correctly if the apiUrl is empty', async () => { + const connector = { + ...geminiConnector, + config: { + ...geminiConnector.config, + apiUrl: '', + }, + }; + + const res = render( + + {}} + /> + + ); + + await act(async () => { + userEvent.click(res.getByTestId('form-test-provide-submit')); + }); + await waitFor(async () => { + expect(onSubmit).toHaveBeenCalled(); + }); + + expect(onSubmit).toHaveBeenCalledWith({ data: {}, isValid: false }); + }); + + const tests: Array<[string, string]> = [['config.apiUrl-input', 'not-valid']]; + it.each(tests)('validates correctly %p', async (field, value) => { + const connector = { + ...geminiConnector, + config: { + ...geminiConnector.config, + headers: [], + }, + }; + + const res = render( + + {}} + /> + + ); + + await act(async () => { + await userEvent.type(res.getByTestId(field), `{selectall}{backspace}${value}`, { + delay: 10, + }); + }); + + await act(async () => { + userEvent.click(res.getByTestId('form-test-provide-submit')); + }); + await waitFor(async () => { + expect(onSubmit).toHaveBeenCalled(); + }); + + expect(onSubmit).toHaveBeenCalledWith({ data: {}, isValid: false }); + }); + }); +}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.tsx new file mode 100644 index 00000000000000..72124b2b9857cb --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/connector.tsx @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { + ActionConnectorFieldsProps, + SimpleConnectorForm, +} from '@kbn/triggers-actions-ui-plugin/public'; +import { useFormData } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import DashboardLink from './dashboard_link'; +import { gemini } from './translations'; +import { geminiConfig, geminiSecrets } from './constants'; + +const GeminiConnectorFields: React.FC = ({ readOnly, isEdit }) => { + const [{ id, name }] = useFormData(); + return ( + <> + + {isEdit && } + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { GeminiConnectorFields as default }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/constants.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/constants.tsx new file mode 100644 index 00000000000000..162f78efabc485 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/constants.tsx @@ -0,0 +1,157 @@ +/* + * Copyright 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 { ConfigFieldSchema, SecretsFieldSchema } from '@kbn/triggers-actions-ui-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiLink } from '@elastic/eui'; +import { + DEFAULT_GEMINI_MODEL, + DEFAULT_GEMINI_URL, + DEFAULT_TOKEN_LIMIT, + DEFAULT_GCP_REGION, +} from '../../../common/gemini/constants'; +import * as i18n from './translations'; + +const generationConfig = { + temperature: 0, + maxOutputTokens: DEFAULT_TOKEN_LIMIT, +}; + +const contents = [ + { + role: 'user', + parts: [ + { + text: 'Write the first line of a story about a magic backpack.', + }, + ], + }, +]; + +export const DEFAULT_BODY = JSON.stringify({ + contents, + generation_config: generationConfig, +}); + +export const geminiConfig: ConfigFieldSchema[] = [ + { + id: 'apiUrl', + label: i18n.API_URL_LABEL, + isUrlField: true, + defaultValue: DEFAULT_GEMINI_URL, + helpText: ( + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + ), + }, + { + id: 'gcpRegion', + label: i18n.GCP_REGION, + isUrlField: false, + defaultValue: DEFAULT_GCP_REGION, + helpText: ( + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + ), + }, + { + id: 'gcpProjectID', + label: i18n.GCP_PROJECT_ID, + isUrlField: false, + helpText: ( + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + ), + }, + { + id: 'defaultModel', + label: i18n.DEFAULT_MODEL_LABEL, + helpText: ( + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + ), + defaultValue: DEFAULT_GEMINI_MODEL, + }, +]; + +export const geminiSecrets: SecretsFieldSchema[] = [ + { + id: 'credentialsJson', + label: i18n.CREDENTIALS_JSON, + isPasswordField: true, + helpText: ( + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + ), + }, +]; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/dashboard_link.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/dashboard_link.tsx new file mode 100644 index 00000000000000..68128663966129 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/dashboard_link.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback } from 'react'; +import { EuiLink } from '@elastic/eui'; +import { useKibana } from '@kbn/triggers-actions-ui-plugin/public'; +import * as i18n from './translations'; +import { useGetDashboard } from '../lib/gen_ai/use_get_dashboard'; + +interface Props { + connectorId: string; + connectorName: string; + selectedProvider?: string; +} +// tested from ./connector.test.tsx +export const DashboardLink: React.FC = ({ + connectorId, + connectorName, + selectedProvider = 'Gemini', +}) => { + const { dashboardUrl } = useGetDashboard({ connectorId, selectedProvider }); + const { + services: { + application: { navigateToUrl }, + }, + } = useKibana(); + const onClick = useCallback( + (e) => { + e.preventDefault(); + if (dashboardUrl) { + navigateToUrl(dashboardUrl); + } + }, + [dashboardUrl, navigateToUrl] + ); + return dashboardUrl != null ? ( + // href gives us right click -> open in new tab + // onclick prevents page reload + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {i18n.USAGE_DASHBOARD_LINK(selectedProvider, connectorName)} + + ) : null; +}; + +// eslint-disable-next-line import/no-default-export +export { DashboardLink as default }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.test.tsx new file mode 100644 index 00000000000000..3b384314fd1211 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.test.tsx @@ -0,0 +1,85 @@ +/* + * Copyright 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 { TypeRegistry } from '@kbn/triggers-actions-ui-plugin/public/application/type_registry'; +import { registerConnectorTypes } from '..'; +import type { ActionTypeModel } from '@kbn/triggers-actions-ui-plugin/public/types'; +import { experimentalFeaturesMock, registrationServicesMock } from '../../mocks'; +import { SUB_ACTION } from '../../../common/gemini/constants'; +import { ExperimentalFeaturesService } from '../../common/experimental_features_service'; + +const ACTION_TYPE_ID = '.gemini'; +let actionTypeModel: ActionTypeModel; + +beforeAll(() => { + const connectorTypeRegistry = new TypeRegistry(); + ExperimentalFeaturesService.init({ experimentalFeatures: experimentalFeaturesMock }); + registerConnectorTypes({ connectorTypeRegistry, services: registrationServicesMock }); + const getResult = connectorTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('connector type static data is as expected', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.selectMessage).toBe('Send a request to Google Gemini.'); + expect(actionTypeModel.actionTypeTitle).toBe('Google Gemini'); + }); +}); + +describe('gemini action params validation', () => { + test('action params validation succeeds when action params is valid', async () => { + const actionParams = { + subAction: SUB_ACTION.RUN, + subActionParams: { body: '{"message": "test"}' }, + }; + + expect(await actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { body: [], subAction: [] }, + }); + }); + + test('params validation fails when body is not an object', async () => { + const actionParams = { + subAction: SUB_ACTION.RUN, + subActionParams: { body: 'message {test}' }, + }; + + expect(await actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { body: ['Body does not have a valid JSON format.'], subAction: [] }, + }); + }); + + test('params validation fails when subAction is missing', async () => { + const actionParams = { + subActionParams: { body: '{"message": "test"}' }, + }; + + expect(await actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + body: [], + subAction: ['Action is required.'], + }, + }); + }); + + test('params validation fails when subActionParams is missing', async () => { + const actionParams = { + subAction: SUB_ACTION.RUN, + subActionParams: {}, + }; + + expect(await actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + body: ['Body is required.'], + subAction: [], + }, + }); + }); +}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.tsx new file mode 100644 index 00000000000000..f40120053f446a --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/gemini.tsx @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import type { GenericValidationResult } from '@kbn/triggers-actions-ui-plugin/public/types'; +import { SUB_ACTION } from '../../../common/gemini/constants'; +import { GEMINI_CONNECTOR_ID, GEMINI_TITLE } from '../../../common/gemini/constants'; +import { GeminiActionParams, GeminiConnector } from './types'; + +interface ValidationErrors { + subAction: string[]; + body: string[]; +} +export function getConnectorType(): GeminiConnector { + return { + id: GEMINI_CONNECTOR_ID, + iconClass: lazy(() => import('./logo')), + selectMessage: i18n.translate('xpack.stackConnectors.components.gemini.selectMessageText', { + defaultMessage: 'Send a request to Google Gemini.', + }), + actionTypeTitle: GEMINI_TITLE, + validateParams: async ( + actionParams: GeminiActionParams + ): Promise> => { + const { subAction, subActionParams } = actionParams; + const translations = await import('./translations'); + const errors: ValidationErrors = { + body: [], + subAction: [], + }; + + if (subAction === SUB_ACTION.TEST || subAction === SUB_ACTION.RUN) { + if (!subActionParams.body?.length) { + errors.body.push(translations.BODY_REQUIRED); + } else { + try { + JSON.parse(subActionParams.body); + } catch { + errors.body.push(translations.BODY_INVALID); + } + } + } + if (errors.body.length) return { errors }; + + // The internal "subAction" param should always be valid, ensure it is only if "subActionParams" are valid + if (!subAction) { + errors.subAction.push(translations.ACTION_REQUIRED); + } else if (subAction !== SUB_ACTION.RUN && subAction !== SUB_ACTION.TEST) { + errors.subAction.push(translations.INVALID_ACTION); + } + return { errors }; + }, + actionConnectorFields: lazy(() => import('./connector')), + actionParamsFields: lazy(() => import('./params')), + actionReadOnlyExtraComponent: lazy(() => import('./dashboard_link')), + }; +} diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/index.ts b/x-pack/plugins/stack_connectors/public/connector_types/gemini/index.ts new file mode 100644 index 00000000000000..c826ff12f6424d --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { getConnectorType as getGeminiConnectorType } from './gemini'; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/logo.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/logo.tsx new file mode 100644 index 00000000000000..dd09c31fb7079a --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/logo.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 React from 'react'; +import { LogoProps } from '../types'; + +const Logo = (props: LogoProps) => ( + + + + + + + + + + +); + +// eslint-disable-next-line import/no-default-export +export { Logo as default }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.test.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.test.tsx new file mode 100644 index 00000000000000..b8e3b3029b284f --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.test.tsx @@ -0,0 +1,206 @@ +/* + * Copyright 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 { fireEvent, render } from '@testing-library/react'; +import GeminiParamsFields from './params'; +import { DEFAULT_GEMINI_URL, SUB_ACTION } from '../../../common/gemini/constants'; +import { I18nProvider } from '@kbn/i18n-react'; + +const messageVariables = [ + { + name: 'myVar', + description: 'My variable description', + useWithTripleBracesInTemplates: true, + }, +]; + +describe('Gemini Params Fields renders', () => { + test('all params fields are rendered', () => { + const { getByTestId } = render( + {}} + index={0} + messageVariables={messageVariables} + />, + { + wrapper: ({ children }) => {children}, + } + ); + expect(getByTestId('bodyJsonEditor')).toBeInTheDocument(); + expect(getByTestId('bodyJsonEditor')).toHaveProperty('value', '{"message": "test"}'); + expect(getByTestId('bodyAddVariableButton')).toBeInTheDocument(); + expect(getByTestId('gemini-model')).toBeInTheDocument(); + }); + test('useEffect handles the case when subAction and subActionParams are undefined', () => { + const actionParams = { + subAction: undefined, + subActionParams: undefined, + }; + const editAction = jest.fn(); + const errors = {}; + const actionConnector = { + secrets: { + credentialsJSON: JSON.stringify({ + type: 'service_account', + project_id: '', + private_key_id: '', + private_key: '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n', + client_email: '', + client_id: '', + auth_uri: 'https://accounts.google.com/o/oauth2/auth', + token_uri: 'https://oauth2.googleapis.com/token', + auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: '', + }), + }, + id: 'test', + actionTypeId: '.gemini', + isPreconfigured: false, + isSystemAction: false as const, + isDeprecated: false, + name: 'My Gemini Connector', + config: { + apiUrl: DEFAULT_GEMINI_URL, + gcpRegion: 'us-central-1', + gcpProjectID: 'test-project', + }, + }; + render( + , + { + wrapper: ({ children }) => {children}, + } + ); + expect(editAction).toHaveBeenCalledTimes(2); + expect(editAction).toHaveBeenCalledWith('subAction', SUB_ACTION.RUN, 0); + }); + + it('handles the case when subAction only is undefined', () => { + const actionParams = { + subAction: undefined, + subActionParams: { + body: '{"key": "value"}', + }, + }; + const editAction = jest.fn(); + const errors = {}; + render( + , + { + wrapper: ({ children }) => {children}, + } + ); + expect(editAction).toHaveBeenCalledTimes(1); + expect(editAction).toHaveBeenCalledWith('subAction', SUB_ACTION.RUN, 0); + }); + + it('calls editAction function with the body argument', () => { + const editAction = jest.fn(); + const errors = {}; + const { getByTestId } = render( + , + { + wrapper: ({ children }) => {children}, + } + ); + const jsonEditor = getByTestId('bodyJsonEditor'); + fireEvent.change(jsonEditor, { target: { value: '{"new_key": "new_value"}' } }); + expect(editAction).toHaveBeenCalledWith( + 'subActionParams', + { body: '{"new_key": "new_value"}' }, + 0 + ); + }); + + it('removes trailing spaces from the body argument', () => { + const editAction = jest.fn(); + const errors = {}; + const { getByTestId } = render( + , + { + wrapper: ({ children }) => {children}, + } + ); + const jsonEditor = getByTestId('bodyJsonEditor'); + fireEvent.change(jsonEditor, { target: { value: '{"new_key": "new_value"} ' } }); + expect(editAction).toHaveBeenCalledWith( + 'subActionParams', + { body: '{"new_key": "new_value"}' }, + 0 + ); + }); + + it('calls editAction function with the model argument', () => { + const editAction = jest.fn(); + const errors = {}; + const { getByTestId } = render( + , + { + wrapper: ({ children }) => {children}, + } + ); + const model = getByTestId('gemini-model'); + fireEvent.change(model, { target: { value: 'not-the-default' } }); + expect(editAction).toHaveBeenCalledWith( + 'subActionParams', + { body: '{"key": "value"}', model: 'not-the-default' }, + 0 + ); + }); +}); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.tsx b/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.tsx new file mode 100644 index 00000000000000..3de9998adba132 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/params.tsx @@ -0,0 +1,124 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useCallback, useEffect, useMemo } from 'react'; +import type { ActionParamsProps } from '@kbn/triggers-actions-ui-plugin/public'; +import { + ActionConnectorMode, + JsonEditorWithMessageVariables, +} from '@kbn/triggers-actions-ui-plugin/public'; +import { EuiFieldText, EuiFormRow, EuiLink } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { DEFAULT_BODY } from './constants'; +import * as i18n from './translations'; +import { DEFAULT_GEMINI_MODEL, SUB_ACTION } from '../../../common/gemini/constants'; +import { GeminiActionParams } from './types'; + +const GeminiParamsFields: React.FunctionComponent> = ({ + actionParams, + editAction, + index, + messageVariables, + executionMode, + errors, +}) => { + const { subAction, subActionParams } = actionParams; + + const { body, model } = subActionParams ?? {}; + + const isTest = useMemo(() => executionMode === ActionConnectorMode.Test, [executionMode]); + + useEffect(() => { + if (!subAction) { + editAction('subAction', isTest ? SUB_ACTION.TEST : SUB_ACTION.RUN, index); + } + }, [editAction, index, isTest, subAction]); + + useEffect(() => { + if (!subActionParams) { + editAction( + 'subActionParams', + { + body: DEFAULT_BODY, + }, + index + ); + } + }, [editAction, index, subActionParams]); + + useEffect(() => { + return () => { + // some gemini specific formatting gets messed up if we do not reset + // subActionParams on dismount (switching tabs between test and config) + editAction('subActionParams', undefined, index); + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const editSubActionParams = useCallback( + (params: Partial) => { + editAction('subActionParams', { ...subActionParams, ...params }, index); + }, + [editAction, index, subActionParams] + ); + + return ( + <> + { + editSubActionParams({ body: json.trim() }); + }} + onBlur={() => { + if (!body) { + editSubActionParams({ body: '' }); + } + }} + dataTestSubj="gemini-bodyJsonEditor" + /> + + {`${i18n.gemini} ${i18n.DOCUMENTATION}`} + + ), + }} + /> + } + > + { + editSubActionParams({ model: ev.target.value }); + }} + fullWidth + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { GeminiParamsFields as default }; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/translations.ts b/x-pack/plugins/stack_connectors/public/connector_types/gemini/translations.ts new file mode 100644 index 00000000000000..7d9d0e00d0a373 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/translations.ts @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; + +export const API_URL_LABEL = i18n.translate( + 'xpack.stackConnectors.components.gemini.apiUrlTextFieldLabel', + { + defaultMessage: 'URL', + } +); + +export const GCP_REGION = i18n.translate('xpack.stackConnectors.components.gemini.gcpRegion', { + defaultMessage: 'GCP Region', +}); + +export const GCP_PROJECT_ID = i18n.translate( + 'xpack.stackConnectors.components.gemini.gcpProjectID', + { + defaultMessage: 'GCP Project ID', + } +); + +export const DEFAULT_MODEL_LABEL = i18n.translate( + 'xpack.stackConnectors.components.gemini.defaultModelTextFieldLabel', + { + defaultMessage: 'Default model', + } +); + +export const SECRET = i18n.translate('xpack.stackConnectors.components.gemini.secret', { + defaultMessage: 'Secret', +}); + +export const CREDENTIALS_JSON = i18n.translate( + 'xpack.stackConnectors.components.gemini.credentialsJSON', + { + defaultMessage: 'Credentials JSON', + } +); + +export const gemini = i18n.translate('xpack.stackConnectors.components.gemini.title', { + defaultMessage: 'Google Gemini', +}); + +export const DOCUMENTATION = i18n.translate( + 'xpack.stackConnectors.components.gemini.documentation', + { + defaultMessage: 'documentation', + } +); + +export const URL_LABEL = i18n.translate( + 'xpack.stackConnectors.components.gemini.urlTextFieldLabel', + { + defaultMessage: 'URL', + } +); + +export const BODY_REQUIRED = i18n.translate( + 'xpack.stackConnectors.components.gemini.error.requiredgeminiBodyText', + { + defaultMessage: 'Body is required.', + } +); +export const BODY_INVALID = i18n.translate( + 'xpack.stackConnectors.security.gemini.params.error.invalidBodyText', + { + defaultMessage: 'Body does not have a valid JSON format.', + } +); + +export const ACTION_REQUIRED = i18n.translate( + 'xpack.stackConnectors.security.gemini.params.error.requiredActionText', + { + defaultMessage: 'Action is required.', + } +); + +export const INVALID_ACTION = i18n.translate( + 'xpack.stackConnectors.security.gemini.params.error.invalidActionText', + { + defaultMessage: 'Invalid action name.', + } +); + +export const BODY = i18n.translate('xpack.stackConnectors.components.gemini.bodyFieldLabel', { + defaultMessage: 'Body', +}); +export const BODY_DESCRIPTION = i18n.translate( + 'xpack.stackConnectors.components.gemini.bodyCodeEditorAriaLabel', + { + defaultMessage: 'Code editor', + } +); + +export const MODEL = i18n.translate('xpack.stackConnectors.components.gemini.model', { + defaultMessage: 'Model', +}); + +export const USAGE_DASHBOARD_LINK = (apiProvider: string, connectorName: string) => + i18n.translate('xpack.stackConnectors.components.gemini.dashboardLink', { + values: { apiProvider, connectorName }, + defaultMessage: 'View {apiProvider} Usage Dashboard for "{ connectorName }" Connector', + }); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/gemini/types.ts b/x-pack/plugins/stack_connectors/public/connector_types/gemini/types.ts new file mode 100644 index 00000000000000..4ee1eb4f45df00 --- /dev/null +++ b/x-pack/plugins/stack_connectors/public/connector_types/gemini/types.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 { ActionTypeModel as ConnectorTypeModel } from '@kbn/triggers-actions-ui-plugin/public'; +import { SUB_ACTION } from '../../../common/gemini/constants'; +import { RunActionParams } from '../../../common/gemini/types'; + +export interface GeminiActionParams { + subAction: SUB_ACTION.RUN | SUB_ACTION.TEST | SUB_ACTION.DASHBOARD; + subActionParams: RunActionParams; +} + +export interface Config { + apiUrl: string; + defaultModel: string; + gcpRegion: string; + gcpProjectID: string; +} + +export interface Secrets { + credentialsJson: string; +} + +export type GeminiConnector = ConnectorTypeModel; diff --git a/x-pack/plugins/stack_connectors/public/connector_types/index.ts b/x-pack/plugins/stack_connectors/public/connector_types/index.ts index 4cc52b39b43c94..893b756338dcb6 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/index.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/index.ts @@ -13,6 +13,7 @@ import { getIndexConnectorType } from './es_index'; import { getJiraConnectorType } from './jira'; import { getOpenAIConnectorType } from './openai'; import { getBedrockConnectorType } from './bedrock'; +import { getGeminiConnectorType } from './gemini'; import { getOpsgenieConnectorType } from './opsgenie'; import { getPagerDutyConnectorType } from './pagerduty'; import { getResilientConnectorType } from './resilient'; @@ -65,6 +66,7 @@ export function registerConnectorTypes({ connectorTypeRegistry.register(getOpsgenieConnectorType()); connectorTypeRegistry.register(getOpenAIConnectorType()); connectorTypeRegistry.register(getBedrockConnectorType()); + connectorTypeRegistry.register(getGeminiConnectorType()); connectorTypeRegistry.register(getTeamsConnectorType()); connectorTypeRegistry.register(getTorqConnectorType()); connectorTypeRegistry.register(getTinesConnectorType()); diff --git a/x-pack/plugins/stack_connectors/public/connector_types/lib/gen_ai/use_get_dashboard.ts b/x-pack/plugins/stack_connectors/public/connector_types/lib/gen_ai/use_get_dashboard.ts index dd1f6596d92017..0c22c395838506 100644 --- a/x-pack/plugins/stack_connectors/public/connector_types/lib/gen_ai/use_get_dashboard.ts +++ b/x-pack/plugins/stack_connectors/public/connector_types/lib/gen_ai/use_get_dashboard.ts @@ -128,7 +128,12 @@ export const useGetDashboard = ({ connectorId, selectedProvider }: Props): UseGe }; }; -const getDashboardId = (selectedProvider: string, spaceId: string): string => - `generative-ai-token-usage-${ - selectedProvider.toLowerCase().includes('openai') ? 'openai' : 'bedrock' - }-${spaceId}`; +const getDashboardId = (selectedProvider: string, spaceId: string): string => { + let ai = 'openai'; + if (selectedProvider.toLowerCase().includes('bedrock')) { + ai = 'bedrock'; + } else if (selectedProvider.toLowerCase().includes('gemini')) { + ai = 'gemini'; + } + return `generative-ai-token-usage-${ai}-${spaceId}`; +}; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.test.ts new file mode 100644 index 00000000000000..af5fdc8cb781f8 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.test.ts @@ -0,0 +1,192 @@ +/* + * Copyright 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 { GeminiConnector } from './gemini'; +import { RunActionParams } from '../../../common/gemini/types'; +import { actionsConfigMock } from '@kbn/actions-plugin/server/actions_config.mock'; +import { actionsMock } from '@kbn/actions-plugin/server/mocks'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { initDashboard } from '../lib/gen_ai/create_gen_ai_dashboard'; +import { RunApiResponseSchema } from '../../../common/gemini/schema'; + +jest.mock('../lib/gen_ai/create_gen_ai_dashboard'); +jest.mock('@kbn/actions-plugin/server/sub_action_framework/helpers/validators', () => ({ + assertURL: jest.fn(), +})); + +// Mock the imported function +jest.mock('@kbn/actions-plugin/server/lib/get_gcp_oauth_access_token', () => ({ + getGoogleOAuthJwtAccessToken: jest.fn().mockResolvedValue('mock_access_token'), +})); + +let mockRequest: jest.Mock; + +describe('GeminiConnector', () => { + const defaultResponse = { + data: { + candidates: [{ content: { parts: [{ text: 'Paris' }] } }], + usageMetadata: { totalTokens: 0, promptTokens: 0, completionTokens: 0 }, + }, + }; + + const connectorResponse = { + completion: 'Paris', + usageMetadata: { totalTokens: 0, promptTokens: 0, completionTokens: 0 }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + + // @ts-expect-error + mockRequest = connector.request = jest.fn().mockResolvedValue(defaultResponse); + }); + + const connector = new GeminiConnector({ + connector: { id: '1', type: '.gemini' }, + configurationUtilities: actionsConfigMock.create(), + config: { + apiUrl: 'https://api.gemini.com', + defaultModel: 'gemini-1.5-pro-preview-0409', + gcpRegion: 'us-central1', + gcpProjectID: 'my-project-12345', + }, + secrets: { + credentialsJson: JSON.stringify({ + type: 'service_account', + project_id: '', + private_key_id: '', + private_key: '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n', + client_email: '', + client_id: '', + auth_uri: 'https://accounts.google.com/o/oauth2/auth', + token_uri: 'https://oauth2.googleapis.com/token', + auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: '', + }), + }, + logger: loggingSystemMock.createLogger(), + services: actionsMock.createServices(), + }); + + describe('runApi', () => { + it('should send a formatted request to the API and return the response', async () => { + const runActionParams: RunActionParams = { + body: JSON.stringify({ + messages: [ + { + contents: [ + { + role: 'user', + parts: [{ text: 'What is the capital of France?' }], + }, + ], + }, + ], + }), + model: 'test-model', + }; + + const response = await connector.runApi(runActionParams); + + // Assertions + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + url: 'https://api.gemini.com/v1/projects/my-project-12345/locations/us-central1/publishers/google/models/test-model:generateContent', + method: 'post', + data: JSON.stringify({ + messages: [ + { + contents: [ + { + role: 'user', + parts: [{ text: 'What is the capital of France?' }], + }, + ], + }, + ], + }), + headers: { + Authorization: 'Bearer mock_access_token', + 'Content-Type': 'application/json', + }, + timeout: 60000, + responseSchema: RunApiResponseSchema, + signal: undefined, + }); + + expect(response).toEqual(connectorResponse); + }); + }); + + describe('Token dashboard', () => { + const mockGenAi = initDashboard as jest.Mock; + beforeEach(() => { + // @ts-ignore + connector.esClient.transport.request = mockRequest; + mockRequest.mockResolvedValue({ has_all_requested: true }); + mockGenAi.mockResolvedValue({ success: true }); + jest.clearAllMocks(); + }); + it('the create dashboard API call returns available: true when user has correct permissions', async () => { + const response = await connector.getDashboard({ dashboardId: '123' }); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + path: '/_security/user/_has_privileges', + method: 'POST', + body: { + index: [ + { + names: ['.kibana-event-log-*'], + allow_restricted_indices: true, + privileges: ['read'], + }, + ], + }, + }); + expect(response).toEqual({ available: true }); + }); + it('the create dashboard API call returns available: false when user has correct permissions', async () => { + mockRequest.mockResolvedValue({ has_all_requested: false }); + const response = await connector.getDashboard({ dashboardId: '123' }); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + path: '/_security/user/_has_privileges', + method: 'POST', + body: { + index: [ + { + names: ['.kibana-event-log-*'], + allow_restricted_indices: true, + privileges: ['read'], + }, + ], + }, + }); + expect(response).toEqual({ available: false }); + }); + + it('the create dashboard API call returns available: false when init dashboard fails', async () => { + mockGenAi.mockResolvedValue({ success: false }); + const response = await connector.getDashboard({ dashboardId: '123' }); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + path: '/_security/user/_has_privileges', + method: 'POST', + body: { + index: [ + { + names: ['.kibana-event-log-*'], + allow_restricted_indices: true, + privileges: ['read'], + }, + ], + }, + }); + expect(response).toEqual({ available: false }); + }); + }); +}); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.ts new file mode 100644 index 00000000000000..61b8834927a482 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/gemini.ts @@ -0,0 +1,188 @@ +/* + * Copyright 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 { ServiceParams, SubActionConnector } from '@kbn/actions-plugin/server'; +import { AxiosError, Method } from 'axios'; +import { SubActionRequestParams } from '@kbn/actions-plugin/server/sub_action_framework/types'; +import { getGoogleOAuthJwtAccessToken } from '@kbn/actions-plugin/server/lib/get_gcp_oauth_access_token'; +import { Logger } from '@kbn/core/server'; +import { ConnectorTokenClientContract } from '@kbn/actions-plugin/server/types'; +import { ActionsConfigurationUtilities } from '@kbn/actions-plugin/server/actions_config'; +import { RunActionParamsSchema, RunApiResponseSchema } from '../../../common/gemini/schema'; +import { initDashboard } from '../lib/gen_ai/create_gen_ai_dashboard'; + +import { + Config, + Secrets, + RunActionParams, + RunActionResponse, + RunApiResponse, +} from '../../../common/gemini/types'; +import { SUB_ACTION, DEFAULT_TIMEOUT_MS } from '../../../common/gemini/constants'; +import { DashboardActionParams, DashboardActionResponse } from '../../../common/gemini/types'; +import { DashboardActionParamsSchema } from '../../../common/gemini/schema'; + +export interface GetAxiosInstanceOpts { + connectorId: string; + logger: Logger; + credentials: string; + snServiceUrl: string; + connectorTokenClient: ConnectorTokenClientContract; + configurationUtilities: ActionsConfigurationUtilities; +} + +export class GeminiConnector extends SubActionConnector { + private url; + private model; + private gcpRegion; + private gcpProjectID; + private connectorTokenClient: ConnectorTokenClientContract; + + constructor(params: ServiceParams) { + super(params); + + this.url = this.config.apiUrl; + this.model = this.config.defaultModel; + this.gcpRegion = this.config.gcpRegion; + this.gcpProjectID = this.config.gcpProjectID; + this.logger = this.logger; + this.connectorID = this.connector.id; + this.connectorTokenClient = params.services.connectorTokenClient; + + this.registerSubActions(); + } + + private registerSubActions() { + this.registerSubAction({ + name: SUB_ACTION.RUN, + method: 'runApi', + schema: RunActionParamsSchema, + }); + + this.registerSubAction({ + name: SUB_ACTION.DASHBOARD, + method: 'getDashboard', + schema: DashboardActionParamsSchema, + }); + + this.registerSubAction({ + name: SUB_ACTION.TEST, + method: 'runApi', + schema: RunActionParamsSchema, + }); + } + + protected getResponseErrorMessage(error: AxiosError<{ message?: string }>): string { + if (!error.response?.status) { + return `Unexpected API Error: ${error.code ?? ''} - ${error.message ?? 'Unknown error'}`; + } + if ( + error.response.status === 400 && + error.response?.data?.message === 'The requested operation is not recognized by the service.' + ) { + return `API Error: ${error.response.data.message}`; + } + if (error.response.status === 401) { + return `Unauthorized API Error${ + error.response?.data?.message ? `: ${error.response.data.message}` : '' + }`; + } + return `API Error: ${error.response?.statusText}${ + error.response?.data?.message ? ` - ${error.response.data.message}` : '' + }`; + } + + /** + * retrieves a dashboard from the Kibana server and checks if the + * user has the necessary privileges to access it. + * @param dashboardId The ID of the dashboard to retrieve. + */ + public async getDashboard({ + dashboardId, + }: DashboardActionParams): Promise { + const privilege = (await this.esClient.transport.request({ + path: '/_security/user/_has_privileges', + method: 'POST', + body: { + index: [ + { + names: ['.kibana-event-log-*'], + allow_restricted_indices: true, + privileges: ['read'], + }, + ], + }, + })) as { has_all_requested: boolean }; + + if (!privilege?.has_all_requested) { + return { available: false }; + } + + const response = await initDashboard({ + logger: this.logger, + savedObjectsClient: this.savedObjectsClient, + dashboardId, + genAIProvider: 'Gemini', + }); + + return { available: response.success }; + } + + /** Retrieve access token based on the GCP service account credential json file */ + private async getAccessToken(): Promise { + // Validate the service account credentials JSON file input + let credentialsJSON; + try { + credentialsJSON = JSON.parse(this.secrets.credentialsJson); + } catch (error) { + throw new Error(`Failed to parse credentials JSON file: Invalid JSON format`); + } + const accessToken = await getGoogleOAuthJwtAccessToken({ + connectorId: this.connector.id, + logger: this.logger, + credentials: credentialsJSON, + connectorTokenClient: this.connectorTokenClient, + }); + return accessToken; + } + /** + * responsible for making a POST request to the Vertex AI API endpoint and returning the response data + * @param body The stringified request body to be sent in the POST request. + * @param model Optional model to be used for the API request. If not provided, the default model from the connector will be used. + */ + public async runApi({ + body, + model: reqModel, + signal, + timeout, + }: RunActionParams): Promise { + // set model on per request basis + const currentModel = reqModel ?? this.model; + const path = `/v1/projects/${this.gcpProjectID}/locations/${this.gcpRegion}/publishers/google/models/${currentModel}:generateContent`; + const token = await this.getAccessToken(); + + const requestArgs = { + url: `${this.url}${path}`, + method: 'post' as Method, + data: body, + headers: { + Authorization: `Bearer ${token}`, + 'Content-Type': 'application/json', + }, + signal, + timeout: timeout ?? DEFAULT_TIMEOUT_MS, + responseSchema: RunApiResponseSchema, + } as SubActionRequestParams; + + const response = await this.request(requestArgs); + const candidate = response.data.candidates[0]; + const usageMetadata = response.data.usageMetadata; + const completionText = candidate.content.parts[0].text; + + return { completion: completionText, usageMetadata }; + } +} diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.test.ts new file mode 100644 index 00000000000000..f53518f702ce8d --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.test.ts @@ -0,0 +1,89 @@ +/* + * Copyright 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 { actionsConfigMock } from '@kbn/actions-plugin/server/actions_config.mock'; +import { ActionsConfigurationUtilities } from '@kbn/actions-plugin/server/actions_config'; +import axios from 'axios'; +import { configValidator, getConnectorType } from '.'; +import { Config, Secrets } from '../../../common/gemini/types'; +import { SubActionConnectorType } from '@kbn/actions-plugin/server/sub_action_framework/types'; +import { DEFAULT_GEMINI_MODEL } from '../../../common/gemini/constants'; + +jest.mock('axios'); +jest.mock('@kbn/actions-plugin/server/lib/axios_utils', () => { + const originalUtils = jest.requireActual('@kbn/actions-plugin/server/lib/axios_utils'); + return { + ...originalUtils, + request: jest.fn(), + patch: jest.fn(), + }; +}); + +axios.create = jest.fn(() => axios); + +let connectorType: SubActionConnectorType; +let configurationUtilities: jest.Mocked; + +describe('Gemini Connector', () => { + beforeEach(() => { + configurationUtilities = actionsConfigMock.create(); + connectorType = getConnectorType(); + }); + test('exposes the connector as `Google Gemini` with id `.gemini`', () => { + expect(connectorType.id).toEqual('.gemini'); + expect(connectorType.name).toEqual('Google Gemini'); + }); + + describe('config validation', () => { + test('config validation passes when only required fields are provided', () => { + const config: Config = { + apiUrl: `https://us-central1-aiplatform.googleapis.com/v1/projects/test-gcpProject/locations/us-central-1/publishers/google/models/${DEFAULT_GEMINI_MODEL}:generateContent`, + defaultModel: DEFAULT_GEMINI_MODEL, + gcpRegion: 'us-central-1', + gcpProjectID: 'test-gcpProject', + }; + + expect(configValidator(config, { configurationUtilities })).toEqual(config); + }); + + test('config validation failed when a url is invalid', () => { + const config: Config = { + apiUrl: 'example.com/do-something', + defaultModel: DEFAULT_GEMINI_MODEL, + gcpRegion: 'us-central-1', + gcpProjectID: 'test-gcpProject', + }; + expect(() => { + configValidator(config, { configurationUtilities }); + }).toThrowErrorMatchingInlineSnapshot( + `"Error configuring Google Gemini action: Error: URL Error: Invalid URL: example.com/do-something"` + ); + }); + + test('config validation returns an error if the specified URL is not added to allowedHosts', () => { + const configUtils = { + ...actionsConfigMock.create(), + ensureUriAllowed: (_: string) => { + throw new Error(`target url is not present in allowedHosts`); + }, + }; + + const config: Config = { + apiUrl: 'http://mylisteningserver.com:9200/endpoint', + defaultModel: DEFAULT_GEMINI_MODEL, + gcpRegion: 'us-central-1', + gcpProjectID: 'test-gcpProject', + }; + + expect(() => { + configValidator(config, { configurationUtilities: configUtils }); + }).toThrowErrorMatchingInlineSnapshot( + `"Error configuring Google Gemini action: Error: error validating url: target url is not present in allowedHosts"` + ); + }); + }); +}); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.ts new file mode 100644 index 00000000000000..6859cb82e672c1 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/index.ts @@ -0,0 +1,53 @@ +/* + * Copyright 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 { + SubActionConnectorType, + ValidatorType, +} from '@kbn/actions-plugin/server/sub_action_framework/types'; +import { GenerativeAIForSecurityConnectorFeatureId } from '@kbn/actions-plugin/common'; +import { urlAllowListValidator } from '@kbn/actions-plugin/server'; +import { ValidatorServices } from '@kbn/actions-plugin/server/types'; +import { assertURL } from '@kbn/actions-plugin/server/sub_action_framework/helpers/validators'; +import { GEMINI_CONNECTOR_ID, GEMINI_TITLE } from '../../../common/gemini/constants'; +import { ConfigSchema, SecretsSchema } from '../../../common/gemini/schema'; +import { Config, Secrets } from '../../../common/gemini/types'; +import { GeminiConnector } from './gemini'; +import { renderParameterTemplates } from './render'; + +export const getConnectorType = (): SubActionConnectorType => ({ + id: GEMINI_CONNECTOR_ID, + name: GEMINI_TITLE, + getService: (params) => new GeminiConnector(params), + schema: { + config: ConfigSchema, + secrets: SecretsSchema, + }, + validators: [{ type: ValidatorType.CONFIG, validator: configValidator }], + supportedFeatureIds: [GenerativeAIForSecurityConnectorFeatureId], + minimumLicenseRequired: 'enterprise' as const, + renderParameterTemplates, +}); + +export const configValidator = (configObject: Config, validatorServices: ValidatorServices) => { + try { + assertURL(configObject.apiUrl); + urlAllowListValidator('apiUrl')(configObject, validatorServices); + + return configObject; + } catch (err) { + throw new Error( + i18n.translate('xpack.stackConnectors.gemini.configurationErrorApiProvider', { + defaultMessage: 'Error configuring Google Gemini action: {err}', + values: { + err: err.toString(), + }, + }) + ); + } +}; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.test.ts new file mode 100644 index 00000000000000..9486e385f78058 --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.test.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { loggingSystemMock } from '@kbn/core/server/mocks'; +import { renderParameterTemplates } from './render'; +import Mustache from 'mustache'; + +const params = { + subAction: 'run', + subActionParams: { + body: '{"domain":"{{domain}}"}', + }, +}; + +const variables = { domain: 'm0zepcuuu2' }; +const logger = loggingSystemMock.createLogger(); + +describe('Gemini - renderParameterTemplates', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + it('should not render body on test action', () => { + const testParams = { subAction: 'test', subActionParams: { body: 'test_json' } }; + const result = renderParameterTemplates(logger, testParams, variables); + expect(result).toEqual(testParams); + }); + + it('should rendered body with variables', () => { + const result = renderParameterTemplates(logger, params, variables); + + expect(result.subActionParams.body).toEqual( + JSON.stringify({ + ...variables, + }) + ); + }); + + it('should render error body', () => { + const errorMessage = 'test error'; + jest.spyOn(Mustache, 'render').mockImplementation(() => { + throw new Error(errorMessage); + }); + const result = renderParameterTemplates(logger, params, variables); + expect(result.subActionParams.body).toEqual( + 'error rendering mustache template "{"domain":"{{domain}}"}": test error' + ); + }); +}); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.ts b/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.ts new file mode 100644 index 00000000000000..28559a0457c42c --- /dev/null +++ b/x-pack/plugins/stack_connectors/server/connector_types/gemini/render.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. + */ + +import { ExecutorParams } from '@kbn/actions-plugin/server/sub_action_framework/types'; +import { renderMustacheString } from '@kbn/actions-plugin/server/lib/mustache_renderer'; +import { RenderParameterTemplates } from '@kbn/actions-plugin/server/types'; +import { SUB_ACTION } from '../../../common/gemini/constants'; + +export const renderParameterTemplates: RenderParameterTemplates = ( + logger, + params, + variables +) => { + if (params?.subAction !== SUB_ACTION.RUN && params?.subAction !== SUB_ACTION.TEST) return params; + + return { + ...params, + subActionParams: { + ...params.subActionParams, + body: renderMustacheString(logger, params.subActionParams.body as string, variables, 'json'), + }, + }; +}; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/index.ts b/x-pack/plugins/stack_connectors/server/connector_types/index.ts index 992a76556272b2..04c7004f7325b0 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/index.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/index.ts @@ -19,6 +19,7 @@ import { getConnectorType as getEmailConnectorType } from './email'; import { getConnectorType as getIndexConnectorType } from './es_index'; import { getConnectorType as getOpenAIConnectorType } from './openai'; import { getConnectorType as getBedrockConnectorType } from './bedrock'; +import { getConnectorType as getGeminiConnectorType } from './gemini'; import { getConnectorType as getPagerDutyConnectorType } from './pagerduty'; import { getConnectorType as getSwimlaneConnectorType } from './swimlane'; import { getConnectorType as getServerLogConnectorType } from './server_log'; @@ -105,6 +106,7 @@ export function registerConnectorTypes({ actions.registerSubActionConnectorType(getTinesConnectorType()); actions.registerSubActionConnectorType(getOpenAIConnectorType()); actions.registerSubActionConnectorType(getBedrockConnectorType()); + actions.registerSubActionConnectorType(getGeminiConnectorType()); actions.registerSubActionConnectorType(getD3SecurityConnectorType()); actions.registerSubActionConnectorType(getResilientConnectorType()); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/create_gen_ai_dashboard.ts b/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/create_gen_ai_dashboard.ts index 665d4258d54d1a..ed15c31dc29c7b 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/create_gen_ai_dashboard.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/create_gen_ai_dashboard.ts @@ -24,7 +24,7 @@ export const initDashboard = async ({ logger: Logger; savedObjectsClient: SavedObjectsClientContract; dashboardId: string; - genAIProvider: 'OpenAI' | 'Bedrock'; + genAIProvider: 'OpenAI' | 'Bedrock' | 'Gemini'; }): Promise<{ success: boolean; error?: OutputError; diff --git a/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/gen_ai_dashboard.ts b/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/gen_ai_dashboard.ts index 9fd492e1559c9f..144704b8af6777 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/gen_ai_dashboard.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/lib/gen_ai/gen_ai_dashboard.ts @@ -10,25 +10,39 @@ import { v4 as uuidv4 } from 'uuid'; import { SavedObject } from '@kbn/core-saved-objects-common/src/server_types'; import { OPENAI_TITLE, OPENAI_CONNECTOR_ID } from '../../../../common/openai/constants'; import { BEDROCK_TITLE, BEDROCK_CONNECTOR_ID } from '../../../../common/bedrock/constants'; +import { GEMINI_TITLE, GEMINI_CONNECTOR_ID } from '../../../../common/gemini/constants'; -const getDashboardTitle = (title: string) => `${title} Token Usage`; +export const getDashboardTitle = (title: string) => `${title} Token Usage`; export const getDashboard = ( - genAIProvider: 'OpenAI' | 'Bedrock', + genAIProvider: 'OpenAI' | 'Bedrock' | 'Gemini', dashboardId: string ): SavedObject => { - const attributes = - genAIProvider === 'OpenAI' - ? { - provider: OPENAI_TITLE, - dashboardTitle: getDashboardTitle(OPENAI_TITLE), - actionTypeId: OPENAI_CONNECTOR_ID, - } - : { - provider: BEDROCK_TITLE, - dashboardTitle: getDashboardTitle(BEDROCK_TITLE), - actionTypeId: BEDROCK_CONNECTOR_ID, - }; + let attributes = { + provider: OPENAI_TITLE, + dashboardTitle: getDashboardTitle(OPENAI_TITLE), + actionTypeId: OPENAI_CONNECTOR_ID, + }; + + if (genAIProvider === 'OpenAI') { + attributes = { + provider: OPENAI_TITLE, + dashboardTitle: getDashboardTitle(OPENAI_TITLE), + actionTypeId: OPENAI_CONNECTOR_ID, + }; + } else if (genAIProvider === 'Bedrock') { + attributes = { + provider: BEDROCK_TITLE, + dashboardTitle: getDashboardTitle(BEDROCK_TITLE), + actionTypeId: BEDROCK_CONNECTOR_ID, + }; + } else if (genAIProvider === 'Gemini') { + attributes = { + provider: GEMINI_TITLE, + dashboardTitle: getDashboardTitle(GEMINI_TITLE), + actionTypeId: GEMINI_CONNECTOR_ID, + }; + } const ids: Record = { genAiSavedObjectId: dashboardId, diff --git a/x-pack/plugins/stack_connectors/server/plugin.test.ts b/x-pack/plugins/stack_connectors/server/plugin.test.ts index 826e60ac14af8f..cd8d59f3a9f600 100644 --- a/x-pack/plugins/stack_connectors/server/plugin.test.ts +++ b/x-pack/plugins/stack_connectors/server/plugin.test.ts @@ -131,7 +131,7 @@ describe('Stack Connectors Plugin', () => { name: 'Torq', }) ); - expect(actionsSetup.registerSubActionConnectorType).toHaveBeenCalledTimes(7); + expect(actionsSetup.registerSubActionConnectorType).toHaveBeenCalledTimes(8); expect(actionsSetup.registerSubActionConnectorType).toHaveBeenNthCalledWith( 1, expect.objectContaining({ @@ -162,13 +162,20 @@ describe('Stack Connectors Plugin', () => { ); expect(actionsSetup.registerSubActionConnectorType).toHaveBeenNthCalledWith( 5, + expect.objectContaining({ + id: '.gemini', + name: 'Google Gemini', + }) + ); + expect(actionsSetup.registerSubActionConnectorType).toHaveBeenNthCalledWith( + 6, expect.objectContaining({ id: '.d3security', name: 'D3 Security', }) ); expect(actionsSetup.registerSubActionConnectorType).toHaveBeenNthCalledWith( - 6, + 7, expect.objectContaining({ id: '.resilient', name: 'IBM Resilient', diff --git a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts index 1db164e38d9924..309617a8e4cc3b 100644 --- a/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts +++ b/x-pack/plugins/task_manager/server/metrics/create_aggregator.test.ts @@ -7,7 +7,7 @@ import sinon from 'sinon'; import { Subject } from 'rxjs'; -import { take, bufferCount } from 'rxjs'; +import { take, bufferCount, skip } from 'rxjs'; import { loggingSystemMock } from '@kbn/core/server/mocks'; import { isTaskManagerMetricEvent, @@ -109,7 +109,13 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskClaimAggregator - .pipe(take(events.length), bufferCount(events.length)) + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events.length), + bufferCount(events.length) + ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ key: 'task_claim', @@ -262,8 +268,11 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskClaimAggregator .pipe( - take(events1.length + events2.length + 1), - bufferCount(events1.length + events2.length + 1) + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events1.length + events2.length), + bufferCount(events1.length + events2.length) ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ @@ -328,16 +337,6 @@ describe('createAggregator', () => { }); // reset event should have been received here expect(metrics[6]).toEqual({ - key: 'task_claim', - value: { - success: 0, - total: 0, - total_errors: 0, - duration: { counts: [], values: [] }, - duration_values: [], - }, - }); - expect(metrics[7]).toEqual({ key: 'task_claim', value: { success: 1, @@ -347,7 +346,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[8]).toEqual({ + expect(metrics[7]).toEqual({ key: 'task_claim', value: { success: 1, @@ -357,7 +356,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[9]).toEqual({ + expect(metrics[8]).toEqual({ key: 'task_claim', value: { success: 1, @@ -367,7 +366,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[10]).toEqual({ + expect(metrics[9]).toEqual({ key: 'task_claim', value: { success: 2, @@ -377,7 +376,7 @@ describe('createAggregator', () => { duration_values: [10, 10], }, }); - expect(metrics[11]).toEqual({ + expect(metrics[10]).toEqual({ key: 'task_claim', value: { success: 3, @@ -436,8 +435,11 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskClaimAggregator .pipe( - take(events1.length + events2.length + 1), - bufferCount(events1.length + events2.length + 1) + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events1.length + events2.length), + bufferCount(events1.length + events2.length) ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ @@ -502,16 +504,6 @@ describe('createAggregator', () => { }); // reset interval should have fired here expect(metrics[6]).toEqual({ - key: 'task_claim', - value: { - success: 0, - total: 0, - total_errors: 0, - duration: { counts: [], values: [] }, - duration_values: [], - }, - }); - expect(metrics[7]).toEqual({ key: 'task_claim', value: { success: 1, @@ -521,7 +513,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[8]).toEqual({ + expect(metrics[7]).toEqual({ key: 'task_claim', value: { success: 1, @@ -531,7 +523,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[9]).toEqual({ + expect(metrics[8]).toEqual({ key: 'task_claim', value: { success: 1, @@ -541,7 +533,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[10]).toEqual({ + expect(metrics[9]).toEqual({ key: 'task_claim', value: { success: 2, @@ -551,7 +543,7 @@ describe('createAggregator', () => { duration_values: [10, 10], }, }); - expect(metrics[11]).toEqual({ + expect(metrics[10]).toEqual({ key: 'task_claim', value: { success: 3, @@ -613,22 +605,14 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskClaimAggregator .pipe( - take(events1.length + events2.length + 3), - bufferCount(events1.length + events2.length + 3) + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events1.length + events2.length + 1), + bufferCount(events1.length + events2.length + 1) ) .subscribe((metrics: Array>) => { - // reset event expect(metrics[0]).toEqual({ - key: 'task_claim', - value: { - success: 0, - total: 0, - total_errors: 0, - duration: { counts: [], values: [] }, - duration_values: [], - }, - }); - expect(metrics[1]).toEqual({ key: 'task_claim', value: { success: 1, @@ -638,7 +622,7 @@ describe('createAggregator', () => { duration_values: [10], }, }); - expect(metrics[2]).toEqual({ + expect(metrics[1]).toEqual({ key: 'task_claim', value: { success: 2, @@ -648,7 +632,7 @@ describe('createAggregator', () => { duration_values: [10, 10], }, }); - expect(metrics[3]).toEqual({ + expect(metrics[2]).toEqual({ key: 'task_claim', value: { success: 3, @@ -658,7 +642,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10], }, }); - expect(metrics[4]).toEqual({ + expect(metrics[3]).toEqual({ key: 'task_claim', value: { success: 4, @@ -668,7 +652,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10], }, }); - expect(metrics[5]).toEqual({ + expect(metrics[4]).toEqual({ key: 'task_claim', value: { success: 4, @@ -678,7 +662,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10], }, }); - expect(metrics[6]).toEqual({ + expect(metrics[5]).toEqual({ key: 'task_claim', value: { success: 5, @@ -689,7 +673,7 @@ describe('createAggregator', () => { }, }); // reset interval fired here but stats should not clear - expect(metrics[7]).toEqual({ + expect(metrics[6]).toEqual({ key: 'task_claim', value: { success: 6, @@ -699,7 +683,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10, 10, 10], }, }); - expect(metrics[8]).toEqual({ + expect(metrics[7]).toEqual({ key: 'task_claim', value: { success: 6, @@ -709,7 +693,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10, 10, 10], }, }); - expect(metrics[9]).toEqual({ + expect(metrics[8]).toEqual({ key: 'task_claim', value: { success: 6, @@ -719,7 +703,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10, 10, 10], }, }); - expect(metrics[10]).toEqual({ + expect(metrics[9]).toEqual({ key: 'task_claim', value: { success: 7, @@ -729,7 +713,7 @@ describe('createAggregator', () => { duration_values: [10, 10, 10, 10, 10, 10, 10], }, }); - expect(metrics[11]).toEqual({ + expect(metrics[10]).toEqual({ key: 'task_claim', value: { success: 8, @@ -740,17 +724,7 @@ describe('createAggregator', () => { }, }); // reset interval fired here and stats should have cleared - expect(metrics[12]).toEqual({ - key: 'task_claim', - value: { - success: 0, - total: 0, - total_errors: 0, - duration: { counts: [], values: [] }, - duration_values: [], - }, - }); - expect(metrics[13]).toEqual({ + expect(metrics[11]).toEqual({ key: 'task_claim', value: { success: 1, @@ -821,7 +795,13 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskRunAggregator - .pipe(take(taskRunEvents.length), bufferCount(taskRunEvents.length)) + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(taskRunEvents.length), + bufferCount(taskRunEvents.length) + ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ key: 'task_run', @@ -1844,8 +1824,11 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskRunAggregator .pipe( - take(taskRunEvents1.length + taskRunEvents2.length + 1), - bufferCount(taskRunEvents1.length + taskRunEvents2.length + 1) + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(taskRunEvents1.length + taskRunEvents2.length), + bufferCount(taskRunEvents1.length + taskRunEvents2.length) ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ @@ -2242,55 +2225,6 @@ describe('createAggregator', () => { }); // reset event should have been received here expect(metrics[10]).toEqual({ - key: 'task_run', - value: { - overall: { - success: 0, - not_timed_out: 0, - total: 0, - delay: { counts: [], values: [] }, - delay_values: [], - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - by_type: { - alerting: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - 'alerting:example': { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - report: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - telemetry: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - }, - }, - }); - expect(metrics[11]).toEqual({ key: 'task_run', value: { overall: { @@ -2339,7 +2273,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[12]).toEqual({ + expect(metrics[11]).toEqual({ key: 'task_run', value: { overall: { @@ -2388,7 +2322,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[13]).toEqual({ + expect(metrics[12]).toEqual({ key: 'task_run', value: { overall: { @@ -2437,7 +2371,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[14]).toEqual({ + expect(metrics[13]).toEqual({ key: 'task_run', value: { overall: { @@ -2486,7 +2420,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[15]).toEqual({ + expect(metrics[14]).toEqual({ key: 'task_run', value: { overall: { @@ -2535,7 +2469,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[16]).toEqual({ + expect(metrics[15]).toEqual({ key: 'task_run', value: { overall: { @@ -2584,7 +2518,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[17]).toEqual({ + expect(metrics[16]).toEqual({ key: 'task_run', value: { overall: { @@ -2633,7 +2567,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[18]).toEqual({ + expect(metrics[17]).toEqual({ key: 'task_run', value: { overall: { @@ -2682,7 +2616,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[19]).toEqual({ + expect(metrics[18]).toEqual({ key: 'task_run', value: { overall: { @@ -2731,7 +2665,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[20]).toEqual({ + expect(metrics[19]).toEqual({ key: 'task_run', value: { overall: { @@ -2855,8 +2789,11 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskRunAggregator .pipe( - take(taskRunEvents1.length + taskRunEvents2.length + 1), - bufferCount(taskRunEvents1.length + taskRunEvents2.length + 1) + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(taskRunEvents1.length + taskRunEvents2.length), + bufferCount(taskRunEvents1.length + taskRunEvents2.length) ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ @@ -3253,55 +3190,6 @@ describe('createAggregator', () => { }); // reset event should have been received here expect(metrics[10]).toEqual({ - key: 'task_run', - value: { - overall: { - success: 0, - not_timed_out: 0, - total: 0, - delay: { counts: [], values: [] }, - delay_values: [], - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - by_type: { - alerting: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - 'alerting:example': { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - report: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - telemetry: { - success: 0, - not_timed_out: 0, - total: 0, - framework_errors: 0, - user_errors: 0, - total_errors: 0, - }, - }, - }, - }); - expect(metrics[11]).toEqual({ key: 'task_run', value: { overall: { @@ -3350,7 +3238,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[12]).toEqual({ + expect(metrics[11]).toEqual({ key: 'task_run', value: { overall: { @@ -3399,7 +3287,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[13]).toEqual({ + expect(metrics[12]).toEqual({ key: 'task_run', value: { overall: { @@ -3448,7 +3336,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[14]).toEqual({ + expect(metrics[13]).toEqual({ key: 'task_run', value: { overall: { @@ -3497,7 +3385,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[15]).toEqual({ + expect(metrics[14]).toEqual({ key: 'task_run', value: { overall: { @@ -3546,7 +3434,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[16]).toEqual({ + expect(metrics[15]).toEqual({ key: 'task_run', value: { overall: { @@ -3595,7 +3483,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[17]).toEqual({ + expect(metrics[16]).toEqual({ key: 'task_run', value: { overall: { @@ -3644,7 +3532,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[18]).toEqual({ + expect(metrics[17]).toEqual({ key: 'task_run', value: { overall: { @@ -3693,7 +3581,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[19]).toEqual({ + expect(metrics[18]).toEqual({ key: 'task_run', value: { overall: { @@ -3742,7 +3630,7 @@ describe('createAggregator', () => { }, }, }); - expect(metrics[20]).toEqual({ + expect(metrics[19]).toEqual({ key: 'task_run', value: { overall: { @@ -3883,7 +3771,13 @@ describe('createAggregator', () => { return new Promise((resolve) => { taskOverdueAggregator - .pipe(take(events.length), bufferCount(events.length)) + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events.length), + bufferCount(events.length) + ) .subscribe((metrics: Array>) => { expect(metrics[0]).toEqual({ key: 'task_overdue', @@ -4039,9 +3933,17 @@ describe('createAggregator', () => { }); return new Promise((resolve) => { - aggregator.pipe(take(events.length), bufferCount(events.length)).subscribe(() => { - resolve(); - }); + aggregator + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events.length), + bufferCount(events.length) + ) + .subscribe(() => { + resolve(); + }); for (const event of events) { events$.next(event); @@ -4082,9 +3984,17 @@ describe('createAggregator', () => { }); return new Promise((resolve) => { - aggregator.pipe(take(events.length), bufferCount(events.length)).subscribe(() => { - resolve(); - }); + aggregator + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events.length), + bufferCount(events.length) + ) + .subscribe(() => { + resolve(); + }); for (const event of events) { events$.next(event); @@ -4130,9 +4040,17 @@ describe('createAggregator', () => { }); return new Promise((resolve) => { - aggregator.pipe(take(events.length + 1), bufferCount(events.length + 1)).subscribe(() => { - resolve(); - }); + aggregator + .pipe( + // skip initial metric which is just initialized data which + // ensures we don't stall on combineLatest + skip(1), + take(events.length), + bufferCount(events.length) + ) + .subscribe(() => { + resolve(); + }); for (const event of events) { events$.next(event); diff --git a/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts b/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts index 3b2bb8726a5ec4..a06278dd12ef79 100644 --- a/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts +++ b/x-pack/plugins/task_manager/server/metrics/create_aggregator.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { filter, interval, map, merge, Observable } from 'rxjs'; +import { combineLatest, filter, interval, map, merge, Observable, startWith } from 'rxjs'; import { JsonValue } from '@kbn/utility-types'; import { Logger } from '@kbn/core/server'; import { AggregatedStat, AggregatedStatProvider } from '../lib/runtime_statistics_aggregator'; @@ -32,12 +32,11 @@ export function createAggregator({ eventFilter, metricsAggregator, }: CreateMetricsAggregatorOpts): AggregatedStatProvider { - let taskResetEvent$: Observable | undefined; if (reset$) { let lastResetTime: Date = new Date(); // Resets the aggregators either when the reset interval has passed or // a reset$ event is received - taskResetEvent$ = merge( + merge( interval(config.metrics_reset_interval).pipe( map(() => { if (intervalHasPassedSince(lastResetTime, config.metrics_reset_interval)) { @@ -63,13 +62,11 @@ export function createAggregator({ return true; }) ) - ).pipe( - filter((shouldReset: boolean) => shouldReset), - map(() => { + ).subscribe((shouldReset: boolean) => { + if (shouldReset) { metricsAggregator.reset(); - return metricsAggregator.collect(); - }) - ); + } + }); } const taskEvents$: Observable = events$.pipe( @@ -80,13 +77,8 @@ export function createAggregator({ }) ); - const observablesToMerge: Array> = [taskEvents$]; - if (taskResetEvent$) { - observablesToMerge.push(taskResetEvent$); - } - - return merge(...observablesToMerge).pipe( - map((value: T) => { + return combineLatest([taskEvents$.pipe(startWith(metricsAggregator.initialMetric()))]).pipe( + map(([value]: [T]) => { return { key, value, diff --git a/x-pack/plugins/task_manager/server/routes/health.ts b/x-pack/plugins/task_manager/server/routes/health.ts index 23539da937f936..38fd2e3b675ca2 100644 --- a/x-pack/plugins/task_manager/server/routes/health.ts +++ b/x-pack/plugins/task_manager/server/routes/health.ts @@ -131,7 +131,7 @@ export function healthRoute(params: HealthRouteParams): { validate: false, options: { access: 'public', - description: `Get task manager health`, + summary: `Get task manager health`, }, }, async function ( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index ba51e7b2032eab..cda07fb9935192 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -324,7 +324,6 @@ "console.requestOptions.openDocumentationButtonLabel": "Ouvrir la documentation", "console.requestOptionsButtonAriaLabel": "Options de requête", "console.requestTimeElapasedBadgeTooltipContent": "Temps écoulé", - "console.sendRequestButtonTooltip": "Cliquer pour envoyer la requête", "console.settingsPage.accessibilityOverlayLabel": "Superposition d’accessibilité", "console.settingsPage.autocompleteLabel": "Saisie semi-automatique", "console.settingsPage.cancelButtonLabel": "Annuler", @@ -18694,7 +18693,6 @@ "xpack.fleet.settings.editDownloadSourcesFlyout.hostsInputPlaceholder": "Indiquer l’hôte", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputLabel": "Nom", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputPlaceholder": "Indiquer le nom", - "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdBetaBadge": "Bêta", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdPlaceholder": "Sélectionner un proxy", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyInputDescription": "Proxy utilisé pour accéder à la source de téléchargement. Actuellement, seule l’URL du proxy est utilisée, les en-têtes et les certificats ne sont pas compatibles.", "xpack.fleet.settings.editDownloadSourcesFlyout.saveButton": "Enregistrer et appliquer les paramètres", @@ -22174,8 +22172,6 @@ "xpack.ingestPipelines.form.metaAriaLabel": "Éditeur de données du champ _meta", "xpack.ingestPipelines.form.metaDescription": "Informations supplémentaires sur le pipeline d'ingestion. Ces informations sont stockées dans l'état de cluster. Elles doivent donc être aussi brèves que possible.", "xpack.ingestPipelines.form.metaFieldLabel": "Données du champ _meta (facultatif)", - "xpack.ingestPipelines.form.metaSwitchCaption": "Ajouter des métadonnées", - "xpack.ingestPipelines.form.metaTitle": "Métadonnées", "xpack.ingestPipelines.form.nameDescription": "Identificateur unique pour ce pipeline.", "xpack.ingestPipelines.form.nameFieldLabel": "Nom", "xpack.ingestPipelines.form.nameTitle": "Nom", @@ -22187,7 +22183,6 @@ "xpack.ingestPipelines.form.unknownError": "Une erreur inconnue s'est produite.", "xpack.ingestPipelines.form.validation.metaJsonError": "L'entrée n'est pas valide.", "xpack.ingestPipelines.form.versionFieldLabel": "Version (facultatif)", - "xpack.ingestPipelines.form.versionToggleDescription": "Ajouter un numéro de version", "xpack.ingestPipelines.list.listTitle": "Pipelines d'ingestion", "xpack.ingestPipelines.list.loadErrorTitle": "Impossible de charger les pipelines", "xpack.ingestPipelines.list.loadingMessage": "Chargement des pipelines...", @@ -44141,7 +44136,6 @@ "advancedSettings.advancedSettingsLabel": "Paramètres avancés", "advancedSettings.featureCatalogueTitle": "Personnalisez votre expérience Kibana : modifiez le format de date, activez le mode sombre, et bien plus encore.", "aiAssistantManagementSelection.aiAssistantSelectionPage.observabilityLabel": "Assistant d'IA Elastic pour Observability", - "aiAssistantManagementSelection.aiAssistantSelectionPage.thisFeatureIsDisabledCallOutLabel": "Cette fonctionnalité est désactivée. Elle peut être activée dans Espaces > Fonctionnalités.", "aiAssistantManagementSelection.aiAssistantSettingsPage.descriptionTextLabel": "L'Assistant d'IA utilise l'IA générative pour aider votre équipe en expliquant les erreurs, en suggérant une résolution et en vous aidant à demander, analyser et visualiser vos données.", "aiAssistantManagementSelection.aiAssistantSettingsPage.h2.aIAssistantLabel": "Assistant d'intelligence artificielle", "aiAssistantManagementSelection.aiAssistantSettingsPage.obsAssistant.documentationLinkLabel": "Documentation", @@ -44746,8 +44740,6 @@ "xpack.metricsData.assetDetails.metricsCharts.metric.label.read": "Lire", "xpack.metricsData.assetDetails.metricsCharts.metric.label.used": "Utilisé", "xpack.metricsData.assetDetails.metricsCharts.metric.label.write": "Écrire", - "xpack.metricsData.assetDetails.metricsCharts.network.label.rx": "Entrant (RX)", - "xpack.metricsData.assetDetails.metricsCharts.network.label.tx": "Sortant (TX)", "xpack.metricsData.hostsPage.goToMetricsSettings": "Vérifier les paramètres", "xpack.metricsData.inventoryModel.container.displayName": "Conteneurs Docker", "xpack.metricsData.inventoryModel.container.singularDisplayName": "Conteneur Docker", @@ -44861,4 +44853,4 @@ "xpack.serverlessObservability.nav.projectSettings": "Paramètres de projet", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} \ No newline at end of file +} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 2e617fa82c0a6f..1695925ab11e07 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -324,7 +324,6 @@ "console.requestOptions.openDocumentationButtonLabel": "ドキュメントを開く", "console.requestOptionsButtonAriaLabel": "リクエストオプション", "console.requestTimeElapasedBadgeTooltipContent": "経過時間", - "console.sendRequestButtonTooltip": "クリックしてリクエストを送信", "console.settingsPage.accessibilityOverlayLabel": "アクセシビリティオーバーレイ", "console.settingsPage.autocompleteLabel": "自動入力", "console.settingsPage.cancelButtonLabel": "キャンセル", @@ -18673,7 +18672,6 @@ "xpack.fleet.settings.editDownloadSourcesFlyout.hostsInputPlaceholder": "ホストを指定", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputLabel": "名前", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputPlaceholder": "名前を指定", - "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdBetaBadge": "ベータ", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdPlaceholder": "プロキシを選択", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyInputDescription": "ダウンロードソースへのアクセスに使用されるプロキシ。現在はプロキシURLのみが使用され、ヘッダーや証明書はサポートされていません。", "xpack.fleet.settings.editDownloadSourcesFlyout.saveButton": "設定を保存して適用", @@ -22150,8 +22148,6 @@ "xpack.ingestPipelines.form.metaAriaLabel": "_meta fieldデータエディター", "xpack.ingestPipelines.form.metaDescription": "インジェストパイプラインに関する詳細情報。この情報はクラスター状態に格納されるため、簡潔にすることをお勧めします。", "xpack.ingestPipelines.form.metaFieldLabel": "_metaフィールドデータ(任意)", - "xpack.ingestPipelines.form.metaSwitchCaption": "メタデータを追加", - "xpack.ingestPipelines.form.metaTitle": "メタデータ", "xpack.ingestPipelines.form.nameDescription": "このパイプラインの固有の識別子です。", "xpack.ingestPipelines.form.nameFieldLabel": "名前", "xpack.ingestPipelines.form.nameTitle": "名前", @@ -22163,7 +22159,6 @@ "xpack.ingestPipelines.form.unknownError": "不明なエラーが発生しました。", "xpack.ingestPipelines.form.validation.metaJsonError": "入力が無効です。", "xpack.ingestPipelines.form.versionFieldLabel": "バージョン(任意)", - "xpack.ingestPipelines.form.versionToggleDescription": "バージョン番号を追加", "xpack.ingestPipelines.list.listTitle": "インジェストパイプライン", "xpack.ingestPipelines.list.loadErrorTitle": "パイプラインを読み込めません", "xpack.ingestPipelines.list.loadingMessage": "パイプラインを読み込み中...", @@ -44113,7 +44108,6 @@ "advancedSettings.advancedSettingsLabel": "高度な設定", "advancedSettings.featureCatalogueTitle": "日付形式の変更、ダークモードの有効化など、Kibanaエクスペリエンスをカスタマイズします。", "aiAssistantManagementSelection.aiAssistantSelectionPage.observabilityLabel": "Elastic AI Assistant for Observability", - "aiAssistantManagementSelection.aiAssistantSelectionPage.thisFeatureIsDisabledCallOutLabel": "この機能は無効です。[スペース]>[機能]から有効化できます。", "aiAssistantManagementSelection.aiAssistantSettingsPage.descriptionTextLabel": "AI Assistantは、生成AIを使用して、エラーを説明したり、改善策を提案したり、データのリクエスト、分析、可視化を支援したりすることで、チームを支援します。", "aiAssistantManagementSelection.aiAssistantSettingsPage.h2.aIAssistantLabel": "AI Assistant", "aiAssistantManagementSelection.aiAssistantSettingsPage.obsAssistant.documentationLinkLabel": "ドキュメント", @@ -44718,8 +44712,6 @@ "xpack.metricsData.assetDetails.metricsCharts.metric.label.read": "読み取り", "xpack.metricsData.assetDetails.metricsCharts.metric.label.used": "使用中", "xpack.metricsData.assetDetails.metricsCharts.metric.label.write": "書き込み", - "xpack.metricsData.assetDetails.metricsCharts.network.label.rx": "受信(RX)", - "xpack.metricsData.assetDetails.metricsCharts.network.label.tx": "送信(TX)", "xpack.metricsData.hostsPage.goToMetricsSettings": "設定を確認", "xpack.metricsData.inventoryModel.container.displayName": "Dockerコンテナー", "xpack.metricsData.inventoryModel.container.singularDisplayName": "Docker コンテナー", @@ -44833,4 +44825,4 @@ "xpack.serverlessObservability.nav.projectSettings": "プロジェクト設定", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} \ No newline at end of file +} diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 287df055e40a59..3c847830422617 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -324,7 +324,6 @@ "console.requestOptions.openDocumentationButtonLabel": "打开文档", "console.requestOptionsButtonAriaLabel": "请求选项", "console.requestTimeElapasedBadgeTooltipContent": "已用时间", - "console.sendRequestButtonTooltip": "单击以发送请求", "console.settingsPage.accessibilityOverlayLabel": "辅助功能覆盖", "console.settingsPage.autocompleteLabel": "自动完成", "console.settingsPage.cancelButtonLabel": "取消", @@ -18702,7 +18701,6 @@ "xpack.fleet.settings.editDownloadSourcesFlyout.hostsInputPlaceholder": "指定主机", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputLabel": "名称", "xpack.fleet.settings.editDownloadSourcesFlyout.nameInputPlaceholder": "指定名称", - "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdBetaBadge": "公测版", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyIdPlaceholder": "选择代理", "xpack.fleet.settings.editDownloadSourcesFlyout.proxyInputDescription": "用于访问下载源的代理。当前仅使用代理 URL,不支持标题和证书。", "xpack.fleet.settings.editDownloadSourcesFlyout.saveButton": "保存并应用设置", @@ -22182,8 +22180,6 @@ "xpack.ingestPipelines.form.metaAriaLabel": "_meta 字段数据编辑器", "xpack.ingestPipelines.form.metaDescription": "有关采集管道的任何其他信息。此信息以集群状态存储,因此最好使其保持简短。", "xpack.ingestPipelines.form.metaFieldLabel": "_meta 字段数据(可选)", - "xpack.ingestPipelines.form.metaSwitchCaption": "添加元数据", - "xpack.ingestPipelines.form.metaTitle": "元数据", "xpack.ingestPipelines.form.nameDescription": "此管道的唯一标识符。", "xpack.ingestPipelines.form.nameFieldLabel": "名称", "xpack.ingestPipelines.form.nameTitle": "名称", @@ -22195,7 +22191,6 @@ "xpack.ingestPipelines.form.unknownError": "发生了未知错误。", "xpack.ingestPipelines.form.validation.metaJsonError": "输入无效。", "xpack.ingestPipelines.form.versionFieldLabel": "版本(可选)", - "xpack.ingestPipelines.form.versionToggleDescription": "添加版本号", "xpack.ingestPipelines.list.listTitle": "采集管道", "xpack.ingestPipelines.list.loadErrorTitle": "无法加载管道", "xpack.ingestPipelines.list.loadingMessage": "正在加载管道……", @@ -44161,7 +44156,6 @@ "advancedSettings.advancedSettingsLabel": "高级设置", "advancedSettings.featureCatalogueTitle": "定制您的 Kibana 体验 — 更改日期格式、打开深色模式,等等。", "aiAssistantManagementSelection.aiAssistantSelectionPage.observabilityLabel": "适用于 Observability 的 Elastic AI 助手", - "aiAssistantManagementSelection.aiAssistantSelectionPage.thisFeatureIsDisabledCallOutLabel": "此功能处于禁用状态。可以从“工作区 > 功能”中启用该功能。", "aiAssistantManagementSelection.aiAssistantSettingsPage.descriptionTextLabel": "通过解释错误,建议补救措施并帮助您请求、分析和可视化数据,AI 助手使用生成式 AI 来为您的团队提供帮助。", "aiAssistantManagementSelection.aiAssistantSettingsPage.h2.aIAssistantLabel": "AI 助手", "aiAssistantManagementSelection.aiAssistantSettingsPage.obsAssistant.documentationLinkLabel": "文档", @@ -44766,8 +44760,6 @@ "xpack.metricsData.assetDetails.metricsCharts.metric.label.read": "读取", "xpack.metricsData.assetDetails.metricsCharts.metric.label.used": "已使用", "xpack.metricsData.assetDetails.metricsCharts.metric.label.write": "写入", - "xpack.metricsData.assetDetails.metricsCharts.network.label.rx": "入站 (RX)", - "xpack.metricsData.assetDetails.metricsCharts.network.label.tx": "出站 (TX)", "xpack.metricsData.hostsPage.goToMetricsSettings": "检查设置", "xpack.metricsData.inventoryModel.container.displayName": "Docker 容器", "xpack.metricsData.inventoryModel.container.singularDisplayName": "Docker 容器", @@ -44881,4 +44873,4 @@ "xpack.serverlessObservability.nav.projectSettings": "项目设置", "xpack.serverlessObservability.nav.synthetics": "Synthetics" } -} \ No newline at end of file +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/test_connector_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/test_connector_form.tsx index 15e61c7b149407..e04a0d6e42a1f3 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/test_connector_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/test_connector_form.tsx @@ -187,7 +187,6 @@ const SuccessfulExecution = () => ( 'xpack.triggersActionsUI.sections.testConnectorForm.executionSuccessfulTitle', { defaultMessage: 'Test was successful', - values: {}, } )} color="success" diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx index b87633ad22b549..c707b8dba875f7 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx @@ -343,6 +343,7 @@ const AlertsTable: React.FunctionComponent = memo((props: Aler useBulkActionsConfig: alertsTableConfiguration.useBulkActions, refresh: alertsRefresh, featureIds, + hideBulkActions: Boolean(alertsTableConfiguration.hideBulkActions), }; }, [alerts, alertsTableConfiguration, query, alertsRefresh, featureIds]); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx index 70aaf7a3044530..65353acf5c9a66 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx @@ -92,6 +92,7 @@ export type AlertsTableStateProps = { dynamicRowHeight?: boolean; lastReloadRequestTime?: number; renderCellPopover?: AlertsTableProps['renderCellPopover']; + emptyStateHeight?: 'tall' | 'short'; } & Omit, 'renderCellPopover'>; export interface AlertsTableStorage { @@ -214,6 +215,7 @@ const AlertsTableStateWithQueryProvider = memo( shouldHighlightRow, dynamicRowHeight, lastReloadRequestTime, + emptyStateHeight, }: AlertsTableStateProps) => { const { cases: casesService, fieldFormats } = useKibana<{ cases?: CasesService; @@ -530,6 +532,7 @@ const AlertsTableStateWithQueryProvider = memo( controls={persistentControls} getInspectQuery={getInspectQuery} showInpectButton={showInspectButton} + height={emptyStateHeight} /> )} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.test.tsx index 042eeab219633c..d966dbbba8fcbb 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.test.tsx @@ -463,5 +463,42 @@ describe('bulk action hooks', () => { const newBulkActions = result.current.bulkActions[0].items; expect(initialBulkActions).toEqual(newBulkActions); }); + + it('hides bulk actions if hideBulkActions == true', () => { + // make sure by default some actions are returned for this + // config + const { result: resultWithoutHideBulkActions } = renderHook( + () => + useBulkActions({ + alerts: [], + query: {}, + casesConfig, + refresh, + featureIds: ['observability'], + }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + expect(resultWithoutHideBulkActions.current.bulkActions.length).toBeGreaterThan(0); + + const { result: resultWithHideBulkActions } = renderHook( + () => + useBulkActions({ + alerts: [], + query: {}, + casesConfig, + refresh, + featureIds: ['observability'], + hideBulkActions: true, + }), + { + wrapper: appMockRender.AppWrapper, + } + ); + + expect(resultWithHideBulkActions.current.bulkActions.length).toBe(0); + }); }); }); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.ts b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.ts index 17c1b5be3c7efa..1d275abc68d919 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/hooks/use_bulk_actions.ts @@ -42,6 +42,7 @@ interface BulkActionsProps { useBulkActionsConfig?: UseBulkActionsRegistry; refresh: () => void; featureIds?: ValidFeatureId[]; + hideBulkActions?: boolean; } export interface UseBulkActions { @@ -278,6 +279,7 @@ export function useBulkActions({ refresh, useBulkActionsConfig = () => [], featureIds, + hideBulkActions, }: BulkActionsProps): UseBulkActions { const { bulkActions: [bulkActionsState, updateBulkActionsState], @@ -302,17 +304,22 @@ export function useBulkActions({ featureIds, isAllSelected: bulkActionsState.isAllSelected, }); + const initialItems = useMemo(() => { return [...caseBulkActions, ...(featureIds?.includes('siem') ? [] : untrackBulkActions)]; }, [caseBulkActions, featureIds, untrackBulkActions]); const bulkActions = useMemo(() => { + if (hideBulkActions) { + return []; + } + return initialItems.length ? addItemsToInitialPanel({ panels: configBulkActionPanels, items: initialItems, }) : configBulkActionPanels; - }, [configBulkActionPanels, initialItems]); + }, [configBulkActionPanels, initialItems, hideBulkActions]); const isBulkActionsColumnActive = bulkActions.length !== 0; diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index 218b6365457bf7..f2a8d86eeb88a6 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -763,6 +763,7 @@ export interface AlertsTableConfigurationRegistry { }; useFieldBrowserOptions?: UseFieldBrowserOptions; showInspectButton?: boolean; + hideBulkActions?: boolean; ruleTypeIds?: string[]; useFetchPageContext?: PreFetchPageContext; actions?: { diff --git a/x-pack/plugins/upgrade_assistant/server/lib/es_deprecations_status.ts b/x-pack/plugins/upgrade_assistant/server/lib/es_deprecations_status.ts index b557e636c618a7..d343aca07f9f6d 100644 --- a/x-pack/plugins/upgrade_assistant/server/lib/es_deprecations_status.ts +++ b/x-pack/plugins/upgrade_assistant/server/lib/es_deprecations_status.ts @@ -42,6 +42,7 @@ export function getShardCapacityDeprecationInfo({ { defaultMessage: 'The number of nodes that are running low on disk and it is likely that they will run out of space. Their disk usage has tripped the <>.', + ignoreTag: true, } ) ); @@ -54,6 +55,7 @@ export function getShardCapacityDeprecationInfo({ { defaultMessage: 'The number of nodes that have run out of disk. Their disk usage has tripped the <>.', + ignoreTag: true, } ) ); diff --git a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/batch_reindex_indices.ts b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/batch_reindex_indices.ts index 391306aa187235..d2eb315aa4a66c 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/batch_reindex_indices.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/batch_reindex_indices.ts @@ -38,7 +38,7 @@ export function registerBatchReindexIndicesRoutes( path: `${BASE_PATH}/batch/queue`, options: { access: 'public', - description: `Get the batch reindex queue`, + summary: `Get the batch reindex queue`, }, validate: {}, }, @@ -77,7 +77,7 @@ export function registerBatchReindexIndicesRoutes( path: `${BASE_PATH}/batch`, options: { access: 'public', - description: `Batch start or resume reindex`, + summary: `Batch start or resume reindex`, }, validate: { body: schema.object({ diff --git a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts index 9b2b046169b775..11d34d48820e2b 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/reindex_indices/reindex_indices.ts @@ -36,7 +36,7 @@ export function registerReindexIndicesRoutes( path: `${BASE_PATH}/{indexName}`, options: { access: 'public', - description: `Start or resume reindex`, + summary: `Start or resume reindex`, }, validate: { params: schema.object({ @@ -83,7 +83,7 @@ export function registerReindexIndicesRoutes( path: `${BASE_PATH}/{indexName}`, options: { access: 'public', - description: `Get reindex status`, + summary: `Get reindex status`, }, validate: { params: schema.object({ @@ -144,7 +144,7 @@ export function registerReindexIndicesRoutes( path: `${BASE_PATH}/{indexName}/cancel`, options: { access: 'public', - description: `Cancel reindex`, + summary: `Cancel reindex`, }, validate: { params: schema.object({ diff --git a/x-pack/plugins/upgrade_assistant/server/routes/status.ts b/x-pack/plugins/upgrade_assistant/server/routes/status.ts index 7a44981776319f..de621da5a23b1e 100644 --- a/x-pack/plugins/upgrade_assistant/server/routes/status.ts +++ b/x-pack/plugins/upgrade_assistant/server/routes/status.ts @@ -26,7 +26,7 @@ export function registerUpgradeStatusRoute({ path: `${API_BASE_PATH}/status`, options: { access: 'public', - description: `Get upgrade readiness status`, + summary: `Get upgrade readiness status`, }, validate: false, }, diff --git a/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/gemini_simulation.ts b/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/gemini_simulation.ts new file mode 100644 index 00000000000000..c8428739205443 --- /dev/null +++ b/x-pack/test/alerting_api_integration/common/plugins/actions_simulators/server/gemini_simulation.ts @@ -0,0 +1,53 @@ +/* + * Copyright 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 http from 'http'; + +import { ProxyArgs, Simulator } from './simulator'; + +export class GeminiSimulator extends Simulator { + private readonly returnError: boolean; + + constructor({ returnError = false, proxy }: { returnError?: boolean; proxy?: ProxyArgs }) { + super(proxy); + + this.returnError = returnError; + } + + public async handler( + request: http.IncomingMessage, + response: http.ServerResponse, + data: Record + ) { + if (this.returnError) { + return GeminiSimulator.sendErrorResponse(response); + } + + return GeminiSimulator.sendResponse(response); + } + + private static sendResponse(response: http.ServerResponse) { + response.statusCode = 202; + response.setHeader('Content-Type', 'application/json'); + response.end(JSON.stringify(geminiSuccessResponse, null, 4)); + } + + private static sendErrorResponse(response: http.ServerResponse) { + response.statusCode = 422; + response.setHeader('Content-Type', 'application/json;charset=UTF-8'); + response.end(JSON.stringify(geminiFailedResponse, null, 4)); + } +} + +export const geminiSuccessResponse = { + refid: '80be4a0d-5f0e-4d6c-b00e-8cb918f7df1f', +}; +export const geminiFailedResponse = { + error: { + statusMessage: 'Bad job', + }, +}; diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts new file mode 100644 index 00000000000000..d483d11db96eca --- /dev/null +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group2/tests/actions/connector_types/gemini.ts @@ -0,0 +1,382 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { + GeminiSimulator, + geminiSuccessResponse, +} from '@kbn/actions-simulators-plugin/server/gemini_simulation'; +import { TaskErrorSource } from '@kbn/task-manager-plugin/common'; +import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; + +const connectorTypeId = '.gemini'; +const name = 'A Gemini action'; +const defaultConfig = { + gcpRegion: 'us-central-1', + gcpProjectID: 'test-project', +}; +const secrets = { + credentialsJSON: JSON.stringify({ + type: 'service_account', + project_id: '', + private_key_id: '', + private_key: '-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----\n', + client_email: '', + client_id: '', + auth_uri: 'https://accounts.google.com/o/oauth2/auth', + token_uri: 'https://oauth2.googleapis.com/token', + auth_provider_x509_cert_url: 'https://www.googleapis.com/oauth2/v1/certs', + client_x509_cert_url: '', + }), +}; + +// eslint-disable-next-line import/no-default-export +export default function geminiTest({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + const configService = getService('config'); + + const createConnector = async (url: string) => { + const { body } = await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + config: { ...defaultConfig, url }, + secrets, + }) + .expect(200); + + return body.id; + }; + + describe('Gemini', () => { + describe('action creation', () => { + const simulator = new GeminiSimulator({ + returnError: false, + proxy: { + config: configService.get('kbnTestServer.serverArgs'), + }, + }); + const config = { ...defaultConfig, url: '' }; + + before(async () => { + config.url = await simulator.start(); + }); + + after(() => { + simulator.close(); + }); + + it('should return 200 when creating the connector', async () => { + const { body: createdAction } = await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + config, + secrets, + }) + .expect(200); + + expect(createdAction).to.eql({ + id: createdAction.id, + is_preconfigured: false, + is_system_action: false, + is_deprecated: false, + name, + connector_type_id: connectorTypeId, + is_missing_secrets: false, + config, + }); + }); + + it('should return 400 Bad Request when creating the connector without the url, project id and region', async () => { + await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + config: {}, + secrets, + }) + .expect(400) + .then((resp: any) => { + expect(resp.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: + 'error validating action type config: [url, gcpRegion, gcpProjectID]: expected value of type [string] but got [undefined]', + }); + }); + }); + + it('should return 400 Bad Request when creating the connector without the project id', async () => { + const testConfig = { gcpRegion: 'us-central-1', url: '' }; + await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + testConfig, + secrets, + }) + .expect(400) + .then((resp: any) => { + expect(resp.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: + 'error validating action type config: [gcpProjectID]: expected value of type [string] but got [undefined]', + }); + }); + }); + + it('should return 400 Bad Request when creating the connector without the region', async () => { + const testConfig = { gcpProjectID: 'test-project', url: '' }; + await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + testConfig, + secrets, + }) + .expect(400) + .then((resp: any) => { + expect(resp.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: + 'error validating action type config: [gcpRegion]: expected value of type [string] but got [undefined]', + }); + }); + }); + + it('should return 400 Bad Request when creating the connector with a url that is not allowed', async () => { + await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + config: { + url: 'http://gemini.mynonexistent.com', + }, + secrets, + }) + .expect(400) + .then((resp: any) => { + expect(resp.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: + 'error validating action type config: error validating url: target url "http://gemini.mynonexistent.com" is not added to the Kibana config xpack.actions.allowedHosts', + }); + }); + }); + + it('should return 400 Bad Request when creating the connector without secrets', async () => { + await supertest + .post('/api/actions/connector') + .set('kbn-xsrf', 'foo') + .send({ + name, + connector_type_id: connectorTypeId, + config, + }) + .expect(400) + .then((resp: any) => { + expect(resp.body).to.eql({ + statusCode: 400, + error: 'Bad Request', + message: + 'error validating action type secrets: [token]: expected value of type [string] but got [undefined]', + }); + }); + }); + }); + + describe('executor', () => { + describe('validation', () => { + const simulator = new GeminiSimulator({ + proxy: { + config: configService.get('kbnTestServer.serverArgs'), + }, + }); + let geminiActionId: string; + + before(async () => { + const url = await simulator.start(); + geminiActionId = await createConnector(url); + }); + + after(() => { + simulator.close(); + }); + + it('should fail when the params is empty', async () => { + const { body } = await supertest + .post(`/api/actions/connector/${geminiActionId}/_execute`) + .set('kbn-xsrf', 'foo') + .send({ + params: {}, + }); + expect(200); + + expect(body).to.eql({ + status: 'error', + connector_id: geminiActionId, + message: + 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', + retry: false, + errorSource: TaskErrorSource.FRAMEWORK, + }); + }); + + it('should fail when the subAction is invalid', async () => { + const { body } = await supertest + .post(`/api/actions/connector/${geminiActionId}/_execute`) + .set('kbn-xsrf', 'foo') + .send({ + params: { subAction: 'invalidAction' }, + }) + .expect(200); + + expect(body).to.eql({ + connector_id: geminiActionId, + status: 'error', + retry: true, + message: 'an error occurred while running the action', + errorSource: TaskErrorSource.FRAMEWORK, + service_message: `Sub action "invalidAction" is not registered. Connector id: ${geminiActionId}. Connector name: Gemini. Connector type: .gemini`, + }); + }); + }); + + describe('execution', () => { + describe('successful response simulator', () => { + const simulator = new GeminiSimulator({ + proxy: { + config: configService.get('kbnTestServer.serverArgs'), + }, + }); + let url: string; + let geminiActionId: string; + + before(async () => { + url = await simulator.start(); + geminiActionId = await createConnector(url); + }); + + after(() => { + simulator.close(); + }); + + it('should invoke AI with assistant AI body argument formatted to gemini expectations', async () => { + const { body } = await supertest + .post(`/api/actions/connector/${geminiActionId}/_execute`) + .set('kbn-xsrf', 'foo') + .send({ + params: { + subAction: 'invokeAI', + subActionParams: { + contents: [ + { + role: 'user', + parts: [ + { + text: 'Hello', + }, + ], + }, + { + role: 'model', + parts: [ + { + text: 'Hi there, how can I help you today?', + }, + ], + }, + { + role: 'user', + parts: [ + { + text: 'Write the first line of a story about a magic backpack.', + }, + ], + }, + ], + generation_config: { temperature: 0, maxOutputTokens: 8192 }, + }, + }, + }) + .expect(200); + + expect(simulator.requestData).to.eql({ + contents: [ + { + role: 'user', + parts: [{ text: 'Write the first line of a story about a magic backpack.' }], + }, + ], + generation_config: { temperature: 0, maxOutputTokens: 8192 }, + }); + expect(body).to.eql({ + status: 'ok', + connector_id: geminiActionId, + data: { completion: geminiSuccessResponse }, + }); + }); + }); + + describe('error response simulator', () => { + const simulator = new GeminiSimulator({ + returnError: true, + proxy: { + config: configService.get('kbnTestServer.serverArgs'), + }, + }); + + let geminiActionId: string; + + before(async () => { + const url = await simulator.start(); + geminiActionId = await createConnector(url); + }); + + after(() => { + simulator.close(); + }); + + it('should return a failure when error happens', async () => { + const { body } = await supertest + .post(`/api/actions/connector/${geminiActionId}/_execute`) + .set('kbn-xsrf', 'foo') + .send({ + params: {}, + }) + .expect(200); + + expect(body).to.eql({ + status: 'error', + connector_id: geminiActionId, + message: + 'error validating action params: [subAction]: expected value of type [string] but got [undefined]', + retry: false, + errorSource: TaskErrorSource.FRAMEWORK, + }); + }); + }); + }); + }); + }); +} diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/check_registered_connector_types.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/check_registered_connector_types.ts index 87a258cd022e4f..ac491f0e99aad2 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/actions/check_registered_connector_types.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/actions/check_registered_connector_types.ts @@ -51,6 +51,7 @@ export default function createRegisteredConnectorTypeTests({ getService }: FtrPr '.opsgenie', '.gen-ai', '.bedrock', + '.gemini', '.sentinelone', '.cases', '.crowdstrike', diff --git a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts index 5565e7a6e096b5..37bdd4975b2a6c 100644 --- a/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts +++ b/x-pack/test/api_integration/apis/cloud_security_posture/helper.ts @@ -10,6 +10,7 @@ import { Client } from '@elastic/elasticsearch'; import expect from '@kbn/expect'; import { ELASTIC_HTTP_VERSION_HEADER } from '@kbn/core-http-common'; import type { IndexDetails } from '@kbn/cloud-security-posture-plugin/common/types_old'; +import { CLOUD_SECURITY_PLUGIN_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; import { SecurityService } from '../../../../../test/common/services/security/security'; export const deleteIndex = (es: Client, indexToBeDeleted: string[]) => { @@ -51,7 +52,7 @@ export async function createPackagePolicy( posture: string, packageName: string = 'cloud_security_posture-1' ) { - const version = '1.7.1'; + const version = CLOUD_SECURITY_PLUGIN_VERSION; const title = 'Security Posture Management'; const streams = [ { diff --git a/x-pack/test/api_integration/services/usage_api.ts b/x-pack/test/api_integration/services/usage_api.ts index 500212d96ddfc7..14ead21c86d2b8 100644 --- a/x-pack/test/api_integration/services/usage_api.ts +++ b/x-pack/test/api_integration/services/usage_api.ts @@ -20,21 +20,38 @@ export interface UsageStatsPayloadTestFriendly extends UsageStatsPayload { export function UsageAPIProvider({ getService }: FtrProviderContext) { const supertest = getService('supertest'); - async function getTelemetryStats(payload: { - unencrypted: true; - refreshCache?: boolean; - }): Promise>; - async function getTelemetryStats(payload: { - unencrypted: false; - refreshCache?: boolean; - }): Promise>; - async function getTelemetryStats(payload: { - unencrypted?: boolean; - refreshCache?: boolean; - }): Promise> { + async function getTelemetryStats( + payload: { + unencrypted: true; + refreshCache?: boolean; + }, + options?: { authHeader: Record } + ): Promise>; + async function getTelemetryStats( + payload: { + unencrypted: false; + refreshCache?: boolean; + }, + options?: { authHeader: Record } + ): Promise>; + async function getTelemetryStats( + payload: { + unencrypted: false; + refreshCache?: boolean; + }, + options?: { authHeader: Record } + ): Promise>; + async function getTelemetryStats( + payload: { + unencrypted?: boolean; + refreshCache?: boolean; + }, + options?: { authHeader: Record } + ): Promise> { const { body } = await supertest .post('/internal/telemetry/clusters/_stats') .set('kbn-xsrf', 'xxx') + .set(options?.authHeader ?? {}) .set(ELASTIC_HTTP_VERSION_HEADER, '2') .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') .send({ refreshCache: true, ...payload }) diff --git a/x-pack/test/cloud_security_posture_api/config.ts b/x-pack/test/cloud_security_posture_api/config.ts index bbee66741210ef..62a976da706695 100644 --- a/x-pack/test/cloud_security_posture_api/config.ts +++ b/x-pack/test/cloud_security_posture_api/config.ts @@ -6,6 +6,7 @@ */ import type { FtrConfigProviderContext } from '@kbn/test'; +import { CLOUD_SECURITY_PLUGIN_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { const xpackFunctionalConfig = await readConfigFile( @@ -43,7 +44,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { * 2. merge the updated version number change to kibana */ `--xpack.fleet.packages.0.name=cloud_security_posture`, - `--xpack.fleet.packages.0.version=1.5.0`, + `--xpack.fleet.packages.0.version=${CLOUD_SECURITY_PLUGIN_VERSION}`, // `--xpack.fleet.registryUrl=https://localhost:8080`, ], }, diff --git a/x-pack/test/cloud_security_posture_functional/cloud_tests/README.md b/x-pack/test/cloud_security_posture_functional/cloud_tests/README.md new file mode 100644 index 00000000000000..ce67cefa1022aa --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/cloud_tests/README.md @@ -0,0 +1,24 @@ +## Tests Development Process + +**Preparation** + +- **Environment Deployment** - Initially, to start tests development, deploy the environment using the [Create Environment](https://github.com/elastic/cloudbeat/blob/main/dev-docs/Cloud-Env-Testing.md) workflow. + +- **Configuration & Run** - After provisioning the environment, configure the FTR environment variables accordingly. At a minimum, configure the following variables: TEST_KIBANA_URL, TEST_ES_URL, TEST_CLOUD, ES_SECURITY_ENABLED. More information can be found in the [FTR documentation](https://www.elastic.co/guide/en/kibana/current/development-tests.html#development-functional-tests). Note that URLs should contain the user and password. + +``` bash +export TEST_KIBANA_URL=https://elastic:password@my-kbn-cluster.elastic-cloud.com:443 +export TEST_ES_URL=https://elastic:password@my-es-cluster.elastic-cloud.com:443 + +export TEST_CLOUD=1 +export ES_SECURITY_ENABLED=1 + +node scripts/functional_test_runner [--config ] [--es-version ] +``` + +- **Suite Config** - The config file is located here: `x-pack/test/cloud_security_posture_functional/config.cloud.ts`. + + +**Final Testing on Demand** + +After finishing the implementation and ensuring that the whole suite is working locally, proceed to execution in the Create Environment workflow. [This PR](https://github.com/elastic/cloudbeat/pull/2219) adds the feature to run UI tests. To do this, open a PR in Kibana, then find the PR commit and apply it in the Create Environment workflow for the final end-to-end process. This process takes time, so proceed only after a few local runs to ensure test stability. \ No newline at end of file diff --git a/x-pack/test/cloud_security_posture_functional/cloud_tests/basic_ui_sanity.ts b/x-pack/test/cloud_security_posture_functional/cloud_tests/basic_ui_sanity.ts new file mode 100644 index 00000000000000..495105017e5c22 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/cloud_tests/basic_ui_sanity.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default ({ getPageObjects, getService }: FtrProviderContext) => { + const retry = getService('retry'); + const pageObjects = getPageObjects(['common', 'cloudPostureDashboard', 'header']); + + describe('Cloud Posture Dashboard Page', function () { + this.tags(['cloud_security_posture_ui_sanity']); + let cspDashboard: typeof pageObjects.cloudPostureDashboard; + let dashboard: typeof pageObjects.cloudPostureDashboard.dashboard; + + before(async () => { + cspDashboard = pageObjects.cloudPostureDashboard; + dashboard = pageObjects.cloudPostureDashboard.dashboard; + await cspDashboard.waitForPluginInitialized(); + await cspDashboard.navigateToComplianceDashboardPage(); + await retry.waitFor( + 'Cloud posture integration dashboard to be displayed', + async () => !!dashboard.getIntegrationDashboardContainer() + ); + }); + + describe('Cloud Dashboard', () => { + it('displays compliance score greater than 40', async () => { + await pageObjects.header.waitUntilLoadingHasFinished(); + const scoreElement = await dashboard.getCloudComplianceScore(); + const score = parseInt((await scoreElement.getVisibleText()).replace('%', ''), 10); + expect(score).to.be.greaterThan(40); + }); + + it('displays all compliance scores', async () => { + const scoresElements = await dashboard.getAllCloudComplianceScores(); + const scores: string[] = []; + for (const scoreElement of scoresElements) { + scores.push(await scoreElement.getVisibleText()); + } + // 3 scores for each cloud provider + 1 summary score + expect(scores.length).to.be(4); + }); + + it('displays a number of resources evaluated greater than 3000', async () => { + const resourcesEvaluated = await dashboard.getCloudResourcesEvaluated(); + const visibleText = await resourcesEvaluated.getVisibleText(); + const resourcesEvaluatedCount = parseInt(visibleText.replace(/,/g, ''), 10); + expect(resourcesEvaluatedCount).greaterThan(3000); + }); + }); + + describe('Kubernetes Dashboard', () => { + it('displays compliance score greater than 80', async () => { + await pageObjects.header.waitUntilLoadingHasFinished(); + const scoreElement = await dashboard.getKubernetesComplianceScore(); + const score = parseInt((await scoreElement.getVisibleText()).replace('%', ''), 10); + expect(score).to.be.greaterThan(80); + }); + + it('displays a number of resources evaluated greater than 150', async () => { + const resourcesEvaluated = await dashboard.getKubernetesResourcesEvaluated(); + const resourcesEvaluatedCount = parseInt( + (await resourcesEvaluated.getVisibleText()).replace(/,/g, ''), + 10 + ); + expect(resourcesEvaluatedCount).greaterThan(150); + }); + }); + }); +}; diff --git a/x-pack/test/cloud_security_posture_functional/cloud_tests/index.ts b/x-pack/test/cloud_security_posture_functional/cloud_tests/index.ts new file mode 100644 index 00000000000000..b08970ccaed13f --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/cloud_tests/index.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. + */ + +import { FtrProviderContext } from '../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Cloud Security Posture', function () { + loadTestFile(require.resolve('./basic_ui_sanity')); + }); +} diff --git a/x-pack/test/cloud_security_posture_functional/config.cloud.ts b/x-pack/test/cloud_security_posture_functional/config.cloud.ts new file mode 100644 index 00000000000000..1fc18baeba7434 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/config.cloud.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { resolve } from 'path'; +import type { FtrConfigProviderContext } from '@kbn/test'; +import { pageObjects } from './page_objects'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const xpackFunctionalConfig = await readConfigFile( + require.resolve('../functional/config.base.js') + ); + // FTR configuration for cloud testing + return { + ...xpackFunctionalConfig.getAll(), + pageObjects, + testFiles: [resolve(__dirname, './cloud_tests')], + junit: { + reportName: 'X-Pack Cloud Security Posture Sanity Tests', + }, + }; +} diff --git a/x-pack/test/cloud_security_posture_functional/config.ts b/x-pack/test/cloud_security_posture_functional/config.ts index bd2f1eb9d594dc..28283fe427949e 100644 --- a/x-pack/test/cloud_security_posture_functional/config.ts +++ b/x-pack/test/cloud_security_posture_functional/config.ts @@ -7,6 +7,7 @@ import { resolve } from 'path'; import type { FtrConfigProviderContext } from '@kbn/test'; +import { CLOUD_SECURITY_PLUGIN_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; import { pageObjects } from './page_objects'; export default async function ({ readConfigFile }: FtrConfigProviderContext) { @@ -38,7 +39,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { * 2. merge the updated version number change to kibana */ `--xpack.fleet.packages.0.name=cloud_security_posture`, - `--xpack.fleet.packages.0.version=1.7.4`, + `--xpack.fleet.packages.0.version=${CLOUD_SECURITY_PLUGIN_VERSION}`, // `--xpack.fleet.registryUrl=https://localhost:8080`, `--xpack.fleet.agents.fleet_server.hosts=["https://ftr.kibana:8220"]`, `--xpack.fleet.internal.fleetServerStandalone=true`, diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/benchmark_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/benchmark_page.ts new file mode 100644 index 00000000000000..39856fa34d3fba --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/page_objects/benchmark_page.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { + ELASTIC_HTTP_VERSION_HEADER, + X_ELASTIC_INTERNAL_ORIGIN_REQUEST, +} from '@kbn/core-http-common'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +export const CSP_BECNHMARK_TABLE = 'csp_benchmarks_table'; + +export function BenchmarkPagePageProvider({ getService, getPageObjects }: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['common', 'header']); + const retry = getService('retry'); + const supertest = getService('supertest'); + const log = getService('log'); + + /** + * required before indexing findings + */ + const waitForPluginInitialized = (): Promise => + retry.try(async () => { + log.debug('Check CSP plugin is initialized'); + const response = await supertest + .get('/internal/cloud_security_posture/status?check=init') + .set(ELASTIC_HTTP_VERSION_HEADER, '1') + .set(X_ELASTIC_INTERNAL_ORIGIN_REQUEST, 'kibana') + .expect(200); + expect(response.body).to.eql({ isPluginInitialized: true }); + log.debug('CSP plugin is initialized'); + }); + + const benchmarkPage = { + doesBenchmarkTableExists: async () => { + return await testSubjects.find('csp_benchmarks_table'); + }, + }; + + const navigateToBenchnmarkPage = async () => { + await PageObjects.common.navigateToUrl( + 'securitySolution', // Defined in Security Solution plugin + `cloud_security_posture/benchmarks/`, + { shouldUseHashForSubUrl: false } + ); + await PageObjects.header.waitUntilLoadingHasFinished(); + }; + + return { + waitForPluginInitialized, + navigateToBenchnmarkPage, + benchmarkPage, + }; +} diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/csp_dashboard_page.ts b/x-pack/test/cloud_security_posture_functional/page_objects/csp_dashboard_page.ts index 24a89549fb025b..4343662e32efdb 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/csp_dashboard_page.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/csp_dashboard_page.ts @@ -96,11 +96,26 @@ export function CspDashboardPageProvider({ getService, getPageObjects }: FtrProv return await testSubjects.find('dashboard-summary-section'); }, + getAllCloudComplianceScores: async () => { + await dashboard.getCloudDashboard(); + return await testSubjects.findAll('dashboard-summary-section-compliance-score'); + }, + getCloudComplianceScore: async () => { await dashboard.getCloudSummarySection(); return await testSubjects.find('dashboard-summary-section-compliance-score'); }, + getCloudResourcesEvaluatedCard: async () => { + await dashboard.getCloudDashboard(); + return await testSubjects.find('dashboard-counter-card-resources-evaluated'); + }, + + getCloudResourcesEvaluated: async () => { + const resourcesEvaluatedCard = await dashboard.getCloudResourcesEvaluatedCard(); + return await resourcesEvaluatedCard.findByXpath('//div/p/span'); + }, + // Kubernetes Dashboard getKubernetesDashboard: async () => { @@ -121,6 +136,16 @@ export function CspDashboardPageProvider({ getService, getPageObjects }: FtrProv return await testSubjects.find('dashboard-summary-section-compliance-score'); }, + + getKubernetesResourcesEvaluatedCard: async () => { + await dashboard.getKubernetesDashboard(); + return await testSubjects.find('dashboard-counter-card-resources-evaluated'); + }, + + getKubernetesResourcesEvaluated: async () => { + const resourcesEvaluatedCard = await dashboard.getKubernetesResourcesEvaluatedCard(); + return await resourcesEvaluatedCard.findByXpath('//div/p/span'); + }, }; const navigateToComplianceDashboardPage = async () => { 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 bc1ae63cea51ef..17cd9f581c6bed 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 @@ -337,6 +337,10 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider return trueOrFalse; }; + const getUnprivilegedPrompt = async () => { + return await testSubjects.find('status-api-unprivileged'); + }; + return { navigateToLatestFindingsPage, navigateToLatestVulnerabilitiesPage, @@ -356,5 +360,6 @@ export function FindingsPageProvider({ getService, getPageObjects }: FtrProvider findingsGrouping, createDataTableObject, isLatestFindingsTableThere, + getUnprivilegedPrompt, }; } diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/index.ts b/x-pack/test/cloud_security_posture_functional/page_objects/index.ts index 020341fdd811b1..704f6310cdbb20 100644 --- a/x-pack/test/cloud_security_posture_functional/page_objects/index.ts +++ b/x-pack/test/cloud_security_posture_functional/page_objects/index.ts @@ -10,6 +10,8 @@ import { FindingsPageProvider } from './findings_page'; import { CspDashboardPageProvider } from './csp_dashboard_page'; import { AddCisIntegrationFormPageProvider } from './add_cis_integration_form_page'; import { VulnerabilityDashboardPageProvider } from './vulnerability_dashboard_page_object'; +import { BenchmarkPagePageProvider } from './benchmark_page'; +import { CspSecurityCommonProvider } from './security_common'; import { RulePagePageProvider } from './rule_page'; export const cloudSecurityPosturePageObjects = { @@ -18,6 +20,8 @@ export const cloudSecurityPosturePageObjects = { cisAddIntegration: AddCisIntegrationFormPageProvider, vulnerabilityDashboard: VulnerabilityDashboardPageProvider, rule: RulePagePageProvider, + benchmark: BenchmarkPagePageProvider, + cspSecurity: CspSecurityCommonProvider, }; export const pageObjects = { ...xpackFunctionalPageObjects, diff --git a/x-pack/test/cloud_security_posture_functional/page_objects/security_common.ts b/x-pack/test/cloud_security_posture_functional/page_objects/security_common.ts new file mode 100644 index 00000000000000..4d5baaa6a2ff91 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/page_objects/security_common.ts @@ -0,0 +1,128 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FtrProviderContext } from '../ftr_provider_context'; + +export function CspSecurityCommonProvider({ getPageObjects, getService }: FtrProviderContext) { + const security = getService('security'); + const pageObjects = getPageObjects(['security']); + + const roles = [ + { + name: 'csp_viewer', + elasticsearch: { + indices: [ + { + names: ['logs-cloud_security_posture.findings-*'], + privileges: ['read'], + }, + { + names: ['logs-cloud_security_posture.findings_latest-*'], + privileges: ['read'], + }, + { + names: ['logs-cloud_security_posture.scores-*'], + privileges: ['read'], + }, + ], + }, + kibana: [ + { + base: ['all'], + spaces: ['*'], + }, + ], + }, + { + name: 'missing_access_findings_latest_role', + elasticsearch: { + indices: [ + { + names: ['logs-cloud_security_posture.findings-*'], + privileges: ['read'], + }, + { + names: ['logs-cloud_security_posture.scores-*'], + privileges: ['read'], + }, + ], + }, + kibana: [ + { + base: ['all'], + spaces: ['*'], + }, + ], + }, + ]; + + const users = [ + { + name: 'csp_read_user', + full_name: 'csp viewer', + password: 'test123', + roles: ['csp_viewer'], + }, + { + name: 'csp_missing_latest_findings_access_user', + full_name: 'missing latest findings index access', + password: 'csp123', + roles: ['missing_access_findings_latest_role'], + }, + ]; + + return { + async createRoles() { + for (const role of roles) { + await security.role.create(role.name, { + elasticsearch: role.elasticsearch, + kibana: role.kibana, + }); + } + }, + + async createUsers() { + for (const user of users) { + await security.user.create(user.name, { + password: user.password, + roles: user.roles, + full_name: user.full_name, + }); + } + }, + + async login(user: string) { + await pageObjects.security.login(user, this.getPasswordForUser(user), { + expectSpaceSelector: false, + }); + }, + + async logout() { + await pageObjects.security.forceLogout(); + }, + + async cleanRoles() { + for (const role of roles) { + await security.role.delete(role.name); + } + }, + + async cleanUsers() { + for (const user of users) { + await security.user.delete(user.name); + } + }, + + getPasswordForUser(user: string): string { + const userConfig = users.find((u) => u.name === user); + if (userConfig === undefined) { + throw new Error(`Can't log in user ${user} - not defined`); + } + return userConfig.password; + }, + }; +} diff --git a/x-pack/test/cloud_security_posture_functional/pages/benchmark.ts b/x-pack/test/cloud_security_posture_functional/pages/benchmark.ts new file mode 100644 index 00000000000000..7eca494108e876 --- /dev/null +++ b/x-pack/test/cloud_security_posture_functional/pages/benchmark.ts @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { k8sFindingsMock } from '../mocks/latest_findings_mock'; +import type { FtrProviderContext } from '../ftr_provider_context'; + +// eslint-disable-next-line import/no-default-export +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const pageObjects = getPageObjects([ + 'common', + 'cspSecurity', + 'cloudPostureDashboard', + 'rule', + 'benchmark', + 'findings', + ]); + + describe('Access with custom roles', async () => { + let cspSecurity = pageObjects.cspSecurity; + let rule: typeof pageObjects.rule; + let benchmark: typeof pageObjects.benchmark; + let findings: typeof pageObjects.findings; + + before(async () => { + benchmark = pageObjects.benchmark; + cspSecurity = pageObjects.cspSecurity; + await benchmark.waitForPluginInitialized(); + await kibanaServer.savedObjects.clean({ + types: ['cloud-security-posture-settings'], + }); + }); + + // Blocked by https://github.com/elastic/kibana/issues/184621 + it.skip('Access with valid user role', async () => { + await cspSecurity.logout(); + await cspSecurity.login('csp_read_user'); + await benchmark.navigateToBenchnmarkPage(); + expect(await benchmark.benchmarkPage.doesBenchmarkTableExists()); + }); + + // Blocked by https://github.com/elastic/kibana/issues/184621 + it.skip('Access with invalid user role', async () => {}); + + // The entire describe block bellow should move to rule.ts byt the page test is blocked by: + // FLAKY: https://github.com/elastic/kibana/issues/178413 + describe('Access with custom roles - rule page', async () => { + before(async () => { + findings = pageObjects.findings; + rule = pageObjects.rule; + await findings.index.add(k8sFindingsMock); + }); + after(async () => { + await findings.index.remove(); + }); + + afterEach(async () => { + // force logout to prevent the next test from failing + await cspSecurity.logout(); + }); + + it('Access with valid user role', async () => { + await cspSecurity.logout(); + await cspSecurity.login('csp_read_user'); + await rule.navigateToRulePage('cis_k8s', '1.0.1'); + + expect(await rule.rulePage.toggleBulkActionButton()); + }); + + // Blocked by https://github.com/elastic/kibana/issues/184621 + it.skip('Access with invalid user role', async () => {}); + }); + }); +} diff --git a/x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts b/x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts index 3faaa849c537cd..6d824df8ef4c41 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/compliance_dashboard.ts @@ -12,7 +12,7 @@ import type { FtrProviderContext } from '../ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function ({ getPageObjects, getService }: FtrProviderContext) { const retry = getService('retry'); - const pageObjects = getPageObjects(['common', 'cloudPostureDashboard', 'header']); + const pageObjects = getPageObjects(['common', 'cspSecurity', 'cloudPostureDashboard', 'header']); const chance = new Chance(); const data = [ @@ -36,10 +36,13 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { this.tags(['cloud_security_posture_compliance_dashboard']); let cspDashboard: typeof pageObjects.cloudPostureDashboard; let dashboard: typeof pageObjects.cloudPostureDashboard.dashboard; + let cspSecurity = pageObjects.cspSecurity; before(async () => { cspDashboard = pageObjects.cloudPostureDashboard; dashboard = pageObjects.cloudPostureDashboard.dashboard; + cspSecurity = pageObjects.cspSecurity; + await cspDashboard.waitForPluginInitialized(); await cspDashboard.index.add(data); @@ -66,5 +69,27 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { // describe('TODO - Cloud Dashboard', () => { // it('todo - displays accurate summary compliance score', async () => {}); // }); + + describe('Access with custom roles', async () => { + this.afterEach(async () => { + // force logout to prevent the next test from failing + await cspSecurity.logout(); + }); + it('Access with valid user role', async () => { + await cspSecurity.logout(); + await cspSecurity.login('csp_read_user'); + await cspDashboard.navigateToComplianceDashboardPage(); + await retry.waitFor( + 'Cloud posture integration dashboard to be displayed', + async () => !!dashboard.getIntegrationDashboardContainer() + ); + const scoreElement = await dashboard.getKubernetesComplianceScore(); + + expect((await scoreElement.getVisibleText()) === '0%').to.be(true); // based on the ingested findings + }); + + // Blocked by https://github.com/elastic/kibana/issues/184621 + it.skip('todo - Access with invalid user role', async () => {}); + }); }); } 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 f599648d0c2de1..6819da2a03e09d 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings.ts @@ -23,7 +23,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const retry = getService('retry'); const supertest = getService('supertest'); const kibanaServer = getService('kibanaServer'); - const pageObjects = getPageObjects(['common', 'findings', 'header']); + const pageObjects = getPageObjects(['common', 'cspSecurity', 'findings', 'header']); const chance = new Chance(); const timeFiveHoursAgo = (Date.now() - 18000000).toString(); @@ -120,6 +120,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { let findings: typeof pageObjects.findings; let latestFindingsTable: typeof findings.latestFindingsTable; let distributionBar: typeof findings.distributionBar; + let cspSecurity = pageObjects.cspSecurity; beforeEach(async () => { await kibanaServer.savedObjects.clean({ @@ -129,6 +130,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { findings = pageObjects.findings; latestFindingsTable = findings.latestFindingsTable; distributionBar = findings.distributionBar; + cspSecurity = pageObjects.cspSecurity; // Before we start any test we must wait for cloud_security_posture plugin to complete its initialization await findings.waitForPluginInitialized(); @@ -391,5 +393,30 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(await latestFindingsTable.getFindingsCount('passed')).to.eql(passedFindingsCount); }); }); + + describe('Access with custom roles', async () => { + this.afterEach(async () => { + // force logout to prevent the next test from failing + await cspSecurity.logout(); + }); + + it('Access with valid user role', async () => { + await cspSecurity.logout(); + await cspSecurity.login('csp_read_user'); + await findings.navigateToLatestFindingsPage(); + pageObjects.header.waitUntilLoadingHasFinished(); + expect(await latestFindingsTable.getRowsCount()).to.be.greaterThan(0); + }); + + it('Access with invalid user role', async () => { + await cspSecurity.logout(); + await cspSecurity.login('csp_missing_latest_findings_access_user'); + + await findings.navigateToLatestFindingsPage(); + + pageObjects.header.waitUntilLoadingHasFinished(); + expect(await findings.getUnprivilegedPrompt()); + }); + }); }); } diff --git a/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts b/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts index a7f36230bb1a53..ff77372b5ed232 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/findings_grouping.ts @@ -158,6 +158,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); after(async () => { + await findings.navigateToLatestFindingsPage(); + await pageObjects.header.waitUntilLoadingHasFinished(); const groupSelector = await findings.groupSelector(); await groupSelector.openDropDown(); await groupSelector.setValue('None'); diff --git a/x-pack/test/cloud_security_posture_functional/pages/index.ts b/x-pack/test/cloud_security_posture_functional/pages/index.ts index a1f9177f05c086..1edf38dc41ec94 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/index.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/index.ts @@ -8,8 +8,17 @@ import { FtrProviderContext } from '../ftr_provider_context'; // eslint-disable-next-line import/no-default-export -export default function ({ loadTestFile }: FtrProviderContext) { +export default function ({ getPageObjects, loadTestFile }: FtrProviderContext) { + const pageObjects = getPageObjects(['cspSecurity']); describe('Cloud Security Posture', function () { + let cspSecurity = pageObjects.cspSecurity; + + before(async () => { + cspSecurity = pageObjects.cspSecurity; + await cspSecurity.createRoles(); + await cspSecurity.createUsers(); + }); + loadTestFile(require.resolve('./rules')); loadTestFile(require.resolve('./findings_onboarding')); loadTestFile(require.resolve('./findings')); @@ -26,5 +35,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./findings_old_data')); loadTestFile(require.resolve('./vulnerabilities')); loadTestFile(require.resolve('./vulnerabilities_grouping')); + loadTestFile(require.resolve('./benchmark')); }); } diff --git a/x-pack/test/defend_workflows_cypress/serverless_config.ts b/x-pack/test/defend_workflows_cypress/serverless_config.ts index b3b01d69c43313..2efc55ea48081b 100644 --- a/x-pack/test/defend_workflows_cypress/serverless_config.ts +++ b/x-pack/test/defend_workflows_cypress/serverless_config.ts @@ -51,6 +51,11 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { `--xpack.fleet.agents.elasticsearch.host=http://${hostIp}:${defendWorkflowsCypressConfig.get( 'servers.elasticsearch.port' )}`, + + // Enable Fleet server standalone so that no checks are done to see if fleet-server has + // registered with Kibana and we are able to access the Agents page of Fleet + '--xpack.fleet.internal.fleetServerStandalone=true', + // set the packagerTaskInterval to 5s in order to speed up test executions when checking fleet artifacts '--xpack.securitySolution.packagerTaskInterval=5s', `--xpack.securitySolution.enableExperimental=${JSON.stringify(enabledFeatureFlags)}`, diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts index 76fe6e6e340fd7..11519523efb14f 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy.ts @@ -63,7 +63,7 @@ export default function (providerContext: FtrProviderContext) { .set('kbn-xsrf', 'xxxx') .expect(200); expect(body.items.length).to.eql(1); - const { id, updated_at: updatedAt, ...rest } = body.items[0]; + const { id, updated_at: updatedAt, version, ...rest } = body.items[0]; expectSnapshot(rest).toMatch(); }); @@ -1469,7 +1469,13 @@ export default function (providerContext: FtrProviderContext) { expect(items[0].package_policies.length).equal(1); expect(items[0].package_policies[0]).to.have.property('package'); expect(items[0].package_policies[0].package.name).equal('system'); - const { package_policies: packagePolicies, id, updated_at: updatedAt, ...rest } = items[0]; + const { + package_policies: packagePolicies, + id, + updated_at: updatedAt, + version: policyVersion, + ...rest + } = items[0]; expectSnapshot({ ...rest, package_policies: packagePolicies.map( diff --git a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy_with_agents_setup.ts b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy_with_agents_setup.ts index 70066599547d49..72fd2d855130df 100644 --- a/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy_with_agents_setup.ts +++ b/x-pack/test/fleet_api_integration/apis/agent_policy/agent_policy_with_agents_setup.ts @@ -10,6 +10,7 @@ import { AGENT_POLICY_INDEX, AGENT_UPDATE_LAST_CHECKIN_INTERVAL_MS, } from '@kbn/fleet-plugin/common'; +import { ENROLLMENT_API_KEYS_INDEX } from '@kbn/fleet-plugin/common/constants'; import { skipIfNoDockerRegistry } from '../../helpers'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { setupFleetAndAgents } from '../agents/services'; @@ -19,6 +20,7 @@ export default function (providerContext: FtrProviderContext) { const supertest = getService('supertest'); const esArchiver = getService('esArchiver'); const esClient = getService('es'); + const kibanaServer = getService('kibanaServer'); async function getEnrollmentKeyForPolicyId(policyId: string) { const listRes = await supertest.get(`/api/fleet/enrollment_api_keys`).expect(200); @@ -34,7 +36,7 @@ export default function (providerContext: FtrProviderContext) { return res.body.item; } - async function hasFleetServerPoliciesForPolicy(policyId: string) { + async function assertFleetServerPoliciesForPolicy(policyId: string, spaceId?: string) { const res = await esClient.search({ index: AGENT_POLICY_INDEX, ignore_unavailable: true, @@ -49,8 +51,36 @@ export default function (providerContext: FtrProviderContext) { }, }); + if (spaceId) { + const docsSpaceId = res.hits.hits.flatMap((hit) => (hit._source as any).namespaces)?.[0]; + expect(docsSpaceId).to.eql(docsSpaceId); + } + + // @ts-expect-error TotalHit + expect(res.hits.total.value !== 0).to.be(true); + } + + async function assertHasFleetServerEnrollmentApiKeyForPolicy(policyId: string, spaceId?: string) { + const res = await esClient.search({ + index: ENROLLMENT_API_KEYS_INDEX, + ignore_unavailable: true, + body: { + query: { + term: { + policy_id: policyId, + }, + }, + size: 1, + }, + }); + + if (spaceId) { + const docsSpaceId = res.hits.hits.flatMap((hit) => (hit._source as any).namespaces)?.[0]; + expect(docsSpaceId).to.eql(docsSpaceId); + } + // @ts-expect-error TotalHit - return res.hits.total.value !== 0; + expect(res.hits.total.value !== 0).to.be(true); } // Test all the side effect that should occurs when we create|update an agent policy @@ -70,47 +100,80 @@ export default function (providerContext: FtrProviderContext) { setupFleetAndAgents(providerContext); - describe('POST /api/fleet/agent_policies', () => { - it('should create an enrollment key for the policy', async () => { - const name = `test-${Date.now()}`; + describe('In default space', () => { + describe('POST /api/fleet/agent_policies', () => { + it('should create an enrollment key for the policy', async () => { + const name = `test-${Date.now()}`; + + const res = await supertest + .post(`/s/test/api/fleet/agent_policies?sys_monitoring=true`) + .set('kbn-xsrf', 'xxxx') + .send({ + name, + namespace: 'default', + }) + .expect(200); + + const policyId = res.body.item.id; + const enrollmentKey = await getEnrollmentKeyForPolicyId(policyId); + expect(enrollmentKey).not.empty(); + + await assertFleetServerPoliciesForPolicy(policyId); + }); + }); - const res = await supertest - .post(`/api/fleet/agent_policies?sys_monitoring=true`) - .set('kbn-xsrf', 'xxxx') - .send({ - name, - namespace: 'default', - }) - .expect(200); + describe('POST /api/fleet/agent_policies/copy', () => { + const TEST_POLICY_ID = `policy1`; - const policyId = res.body.item.id; - const enrollmentKey = await getEnrollmentKeyForPolicyId(policyId); - expect(enrollmentKey).not.empty(); + it('should create an enrollment key for the policy', async () => { + const name = `test-${Date.now()}`; - expect(await hasFleetServerPoliciesForPolicy(policyId)).to.be(true); - }); - }); + const res = await supertest + .post(`/api/fleet/agent_policies/${TEST_POLICY_ID}/copy`) + .set('kbn-xsrf', 'xxxx') + .send({ + name, + description: 'Test', + }) + .expect(200); - describe('POST /api/fleet/agent_policies/copy', () => { - const TEST_POLICY_ID = `policy1`; + const policyId = res.body.item.id; + const enrollmentKey = await getEnrollmentKeyForPolicyId(policyId); + expect(enrollmentKey).not.empty(); - it('should create an enrollment key for the policy', async () => { - const name = `test-${Date.now()}`; + await assertFleetServerPoliciesForPolicy(policyId); + }); + }); + }); - const res = await supertest - .post(`/api/fleet/agent_policies/${TEST_POLICY_ID}/copy`) - .set('kbn-xsrf', 'xxxx') - .send({ - name, - description: 'Test', + describe('In a non default space', () => { + const SPACE_ID = 'test'; + before(async () => { + await kibanaServer.spaces + .create({ + id: SPACE_ID, + name: SPACE_ID, }) - .expect(200); - - const policyId = res.body.item.id; - const enrollmentKey = await getEnrollmentKeyForPolicyId(policyId); - expect(enrollmentKey).not.empty(); - - expect(await hasFleetServerPoliciesForPolicy(policyId)).to.be(true); + .catch((err) => {}); + }); + describe('POST /s/test/api/fleet/agent_policies', () => { + it('should create an .fleet-policy and .fleet-enrollment key for the policy', async () => { + const name = `test-${Date.now()}`; + + const res = await supertest + .post(`/s/${SPACE_ID}/api/fleet/agent_policies?sys_monitoring=true`) + .set('kbn-xsrf', 'xxxx') + .send({ + name, + namespace: 'default', + }) + .expect(200); + + const policyId = res.body.item.id; + + await assertHasFleetServerEnrollmentApiKeyForPolicy(policyId, SPACE_ID); + await assertFleetServerPoliciesForPolicy(policyId, SPACE_ID); + }); }); }); }); diff --git a/x-pack/test/fleet_api_integration/apis/epm/file.ts b/x-pack/test/fleet_api_integration/apis/epm/file.ts index db4c463acb96eb..e44aa2f4e26340 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/file.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/file.ts @@ -21,6 +21,8 @@ export default function (providerContext: FtrProviderContext) { skipIfNoDockerRegistry(providerContext); describe('it gets files from registry', () => { it('fetches a .png screenshot image', async function () { + // wait 10s before uploading again to avoid getting 429 just in case a previous test was hitting the same endpoint + await new Promise((resolve) => setTimeout(resolve, 10000)); const res = await supertest .get('/api/fleet/epm/packages/filetest/0.1.0/img/screenshots/metricbeat_dashboard.png') .set('kbn-xsrf', 'xxx') diff --git a/x-pack/test/fleet_api_integration/apis/epm/get.ts b/x-pack/test/fleet_api_integration/apis/epm/get.ts index 7b79272bbef0bb..c98bb318bdf41a 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/get.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/get.ts @@ -40,6 +40,18 @@ export default function (providerContext: FtrProviderContext) { '../fixtures/direct_upload_packages/apache_0.1.4.zip' ); + async function uploadPackage(zipPackage: string) { + // wait 10s before uploading again to avoid getting 429 + await new Promise((resolve) => setTimeout(resolve, 10000)); + const buf = fs.readFileSync(zipPackage); + return await supertest + .post(`/api/fleet/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(200); + } + describe('EPM - get', () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -57,14 +69,9 @@ export default function (providerContext: FtrProviderContext) { expect(packageInfo.download).to.not.equal(undefined); await uninstallPackage(testPkgName, testPkgVersion); }); + it('returns correct package info if it was installed by upload', async function () { - const buf = fs.readFileSync(testPkgArchiveZip); - await supertest - .post(`/api/fleet/epm/packages`) - .set('kbn-xsrf', 'xxxx') - .type('application/zip') - .send(buf) - .expect(200); + await uploadPackage(testPkgArchiveZip); const res = await supertest .get(`/api/fleet/epm/packages/${testPkgName}/${testPkgVersion}`) @@ -76,14 +83,9 @@ export default function (providerContext: FtrProviderContext) { expect(packageInfo.download).to.not.equal(undefined); await uninstallPackage(testPkgName, testPkgVersion); }); + it('returns correct package info from registry if a different version is installed by upload', async function () { - const buf = fs.readFileSync(testPkgArchiveZip); - await supertest - .post(`/api/fleet/epm/packages`) - .set('kbn-xsrf', 'xxxx') - .type('application/zip') - .send(buf) - .expect(200); + await uploadPackage(testPkgArchiveZip); const res = await supertest.get(`/api/fleet/epm/packages/apache/0.1.3`).expect(200); const packageInfo = res.body.item; @@ -97,13 +99,7 @@ export default function (providerContext: FtrProviderContext) { path.dirname(__filename), '../fixtures/direct_upload_packages/apache_9999.0.0.zip' ); - const buf = fs.readFileSync(testPkgArchiveZipV9999); - await supertest - .post(`/api/fleet/epm/packages`) - .set('kbn-xsrf', 'xxxx') - .type('application/zip') - .send(buf) - .expect(200); + await uploadPackage(testPkgArchiveZipV9999); const res = await supertest.get(`/api/fleet/epm/packages/apache/9999.0.0`).expect(200); const packageInfo = res.body.item; @@ -111,6 +107,7 @@ export default function (providerContext: FtrProviderContext) { expect(packageInfo.download).to.equal(undefined); await uninstallPackage(testPkgName, '9999.0.0'); }); + describe('Installed Packages', () => { before(async () => { await installPackage(testPkgName, testPkgVersion); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts index 4b91e8ac88e54c..ffef5586288043 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_bundled.ts @@ -56,7 +56,7 @@ export default function (providerContext: FtrProviderContext) { const supertest = getService('supertest'); const log = getService('log'); - describe('installing bundled packages', async () => { + describe('Installing bundled packages', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -89,7 +89,6 @@ export default function (providerContext: FtrProviderContext) { .type('application/json') .send({ force: true }) .expect(200); - expect(installResponse.body._meta.install_source).to.be('bundled'); const updateResponse = await supertest @@ -103,8 +102,6 @@ export default function (providerContext: FtrProviderContext) { }); it('should load package archive from bundled package', async () => { - await bundlePackage('nginx-1.2.1'); - const response = await supertest .get(`/api/fleet/epm/packages/nginx/1.2.1?full=true`) .expect(200); @@ -117,7 +114,6 @@ export default function (providerContext: FtrProviderContext) { describe('with registry', () => { it('allows for updating from registry when outdated package is installed from bundled source', async () => { await bundlePackage('nginx-1.1.0'); - const bundledInstallResponse = await supertest .post(`/api/fleet/epm/packages/nginx/1.1.0`) .set('kbn-xsrf', 'xxxx') diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_by_upload.ts b/x-pack/test/fleet_api_integration/apis/epm/install_by_upload.ts index 729a0b4cc51962..e7f3d1d3c0f66f 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_by_upload.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_by_upload.ts @@ -16,6 +16,11 @@ import { skipIfNoDockerRegistry, isDockerRegistryEnabledOrSkipped } from '../../ import { setupFleetAndAgents } from '../agents/services'; import { testUsers } from '../test_users'; +/* + * This test takes long to execute because of the wait time between uploads + * The upload endpoint is rate limited with a minimum wait time of 10s + */ + export default function (providerContext: FtrProviderContext) { const { getService } = providerContext; const supertest = getService('supertest'); @@ -64,7 +69,7 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/fleet/epm/packages/${name}/${version}`).set('kbn-xsrf', 'xxxx'); }; - describe('installs packages from direct upload', async () => { + describe('Installs packages from direct upload', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -77,6 +82,8 @@ export default function (providerContext: FtrProviderContext) { async function uploadPackage() { const buf = fs.readFileSync(testPkgArchiveTgz); + // wait 10s before uploading again to avoid getting 429 + await new Promise((resolve) => setTimeout(resolve, 10000)); return await supertest .post(`/api/fleet/epm/packages`) .set('kbn-xsrf', 'xxxx') @@ -93,6 +100,7 @@ export default function (providerContext: FtrProviderContext) { it('should upgrade when uploading a newer zip archive', async () => { await uploadPackage(); + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveZipNewer); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -147,7 +155,23 @@ export default function (providerContext: FtrProviderContext) { expect(epmPackageAssetsRes.hits.total).to.equal(0); }); + it('should get 429 when trying to upload packages too soon', async () => { + await uploadPackage(); + + const buf = fs.readFileSync(testPkgArchiveZipNewer); + const res = await supertest + .post(`/api/fleet/epm/packages`) + .set('kbn-xsrf', 'xxxx') + .type('application/zip') + .send(buf) + .expect(429); + expect((res.error as HTTPError).text).to.equal( + '{"statusCode":429,"error":"Too Many Requests","message":"Too many requests. Please wait 10s before uploading again."}' + ); + }); + it('should install a zip archive correctly and package info should return correctly after validation', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveZip); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -159,6 +183,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive is zip but content type is gzip', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveZip); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -172,6 +197,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive is tar.gz but content type is zip', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveTgz); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -185,6 +211,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive contains two top-level directories', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveInvalidTwoToplevels); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -198,6 +225,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive does not contain a manifest', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveInvalidNoManifest); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -211,6 +239,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive manifest contains invalid YAML', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveInvalidManifestInvalidYaml); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -224,6 +253,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the archive manifest misses a mandatory field', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveInvalidManifestMissingField); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -237,6 +267,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should throw an error if the toplevel directory name does not match the package key', async function () { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveInvalidToplevelMismatch); const res = await supertest .post(`/api/fleet/epm/packages`) @@ -250,6 +281,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should not allow users without all access', async () => { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveTgz); await supertestWithoutAuth .post(`/api/fleet/epm/packages`) @@ -261,6 +293,7 @@ export default function (providerContext: FtrProviderContext) { }); it('should allow user with all access', async () => { + await new Promise((resolve) => setTimeout(resolve, 10000)); const buf = fs.readFileSync(testPkgArchiveTgz); await supertestWithoutAuth .post(`/api/fleet/epm/packages`) diff --git a/x-pack/test/fleet_api_integration/apis/epm/remove_legacy_templates.ts b/x-pack/test/fleet_api_integration/apis/epm/remove_legacy_templates.ts index 0ab9e68d3e59a9..bce10e14428f75 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/remove_legacy_templates.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/remove_legacy_templates.ts @@ -98,7 +98,7 @@ export default function (providerContext: FtrProviderContext) { await supertest.delete(`/api/fleet/epm/packages/${pkg}/${version}`).set('kbn-xsrf', 'xxxx'); }; - describe('legacy component template removal', async () => { + describe('Legacy component template removal', async () => { skipIfNoDockerRegistry(providerContext); setupFleetAndAgents(providerContext); @@ -137,6 +137,8 @@ export default function (providerContext: FtrProviderContext) { }); await waitUntilLegacyComponentTemplatesCreated(); + // wait 10s before uploading again to avoid getting 429 + await sleep(10000); await installUploadPackage(); const { component_templates: allComponentTemplates } = diff --git a/x-pack/test/fleet_api_integration/apis/outputs/crud.ts b/x-pack/test/fleet_api_integration/apis/outputs/crud.ts index efe17758ea53b4..e635ad8eafae79 100644 --- a/x-pack/test/fleet_api_integration/apis/outputs/crud.ts +++ b/x-pack/test/fleet_api_integration/apis/outputs/crud.ts @@ -6,10 +6,12 @@ */ import expect from '@kbn/expect'; +import { CreateAgentPolicyResponse, GetOneAgentPolicyResponse } from '@kbn/fleet-plugin/common'; import { GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, OUTPUT_HEALTH_DATA_STREAM, } from '@kbn/fleet-plugin/common/constants'; +import { v4 as uuidV4 } from 'uuid'; import { FtrProviderContext } from '../../../api_integration/ftr_provider_context'; import { skipIfNoDockerRegistry } from '../../helpers'; import { setupFleetAndAgents } from '../agents/services'; @@ -133,6 +135,51 @@ export default function (providerContext: FtrProviderContext) { } }; + const createAgentPolicy = async (spaceId?: string): Promise => { + const { body: testPolicyRes } = await supertest + .post(spaceId ? `/s/${spaceId}/api/fleet/agent_policies` : `/api/fleet/agent_policies`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: `test ${uuidV4()}`, + description: '', + namespace: 'default', + }) + .expect(200); + + return testPolicyRes; + }; + + const deleteAgentPolicy = async (agentPolicyId: string, spaceId?: string) => { + await supertest + .post( + spaceId + ? `/s/${spaceId}/api/fleet/agent_policies/delete` + : `/api/fleet/agent_policies/delete` + ) + .send({ + agentPolicyId, + }) + .set('kbn-xsrf', 'xxxx') + .expect(200); + }; + + const getAgentPolicy = async ( + policyId: string, + spaceId?: string + ): Promise => { + const { body: testPolicyRes } = await supertest + .get( + spaceId + ? `/s/${spaceId}/api/fleet/agent_policies/${policyId}` + : `/api/fleet/agent_policies/${policyId}` + ) + .expect(200); + + return testPolicyRes; + }; + + const TEST_SPACE_ID = 'testspaceoutputs'; + describe('fleet_outputs_crud', async function () { skipIfNoDockerRegistry(providerContext); before(async () => { @@ -149,6 +196,12 @@ export default function (providerContext: FtrProviderContext) { before(async function () { await enableSecrets(); await enableOutputSecrets(); + await kibanaServer.spaces + .create({ + id: TEST_SPACE_ID, + name: TEST_SPACE_ID, + }) + .catch((err) => {}); // we must first force install the fleet_server package to override package verification error on policy create // https://github.com/elastic/kibana/issues/137450 const getPkRes = await supertest @@ -725,6 +778,40 @@ export default function (providerContext: FtrProviderContext) { // not found } }); + + it('should bump all policies in all spaces if updating the default output', async () => { + const [policy1, policy2, policy3] = await Promise.all([ + createAgentPolicy(), + createAgentPolicy(), + createAgentPolicy(TEST_SPACE_ID), + ]); + + await supertest + .put(`/api/fleet/outputs/${defaultOutputId}`) + .set('kbn-xsrf', 'xxxx') + .send({ + name: 'Updated Default ES Output', + type: 'elasticsearch', + hosts: ['http://test.fr:443'], + }) + .expect(200); + + const [updatedPolicy1, updatedPolicy2, updatedPolicy3] = await Promise.all([ + getAgentPolicy(policy1.item.id), + getAgentPolicy(policy2.item.id), + getAgentPolicy(policy3.item.id, TEST_SPACE_ID), + ]); + expect(updatedPolicy1.item.revision).to.eql(policy1.item.revision + 1); + expect(updatedPolicy2.item.revision).to.eql(policy2.item.revision + 1); + expect(updatedPolicy3.item.revision).to.eql(policy3.item.revision + 1); + + // cleanup + await Promise.all([ + deleteAgentPolicy(policy1.item.id), + deleteAgentPolicy(policy2.item.id), + deleteAgentPolicy(policy3.item.id, TEST_SPACE_ID), + ]); + }); }); describe('POST /outputs', () => { diff --git a/x-pack/test/functional/apps/infra/home_page.ts b/x-pack/test/functional/apps/infra/home_page.ts index f1de6350b084f6..e197715aadedf0 100644 --- a/x-pack/test/functional/apps/infra/home_page.ts +++ b/x-pack/test/functional/apps/infra/home_page.ts @@ -295,7 +295,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { { metric: 'cpuUsage', value: '2,500.0%' }, { metric: 'memoryUsage', value: '2,000.0%' }, ].forEach(({ metric, value }) => { - it(`${metric} tile should show ${value}`, async () => { + it.skip(`${metric} tile should show ${value}`, async () => { await retry.tryForTime(3 * 1000, async () => { const tileValue = await pageObjects.assetDetails.getAssetDetailsKPITileValue( metric @@ -309,7 +309,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { { metric: 'cpu', chartsCount: 1 }, { metric: 'memory', chartsCount: 1 }, ].forEach(({ metric, chartsCount }) => { - it(`should render ${chartsCount} ${metric} chart(s) in the Metrics section`, async () => { + it.skip(`should render ${chartsCount} ${metric} chart(s) in the Metrics section`, async () => { const containers = await pageObjects.assetDetails.getOverviewTabDockerMetricCharts( metric ); diff --git a/x-pack/test/functional/apps/infra/node_details.ts b/x-pack/test/functional/apps/infra/node_details.ts index 47792ec4bb2ba8..4318644c81bb59 100644 --- a/x-pack/test/functional/apps/infra/node_details.ts +++ b/x-pack/test/functional/apps/infra/node_details.ts @@ -663,7 +663,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { { metric: 'cpu', chartsCount: 1 }, { metric: 'memory', chartsCount: 1 }, ].forEach(({ metric, chartsCount }) => { - it(`should render ${chartsCount} ${metric} chart(s) in the Metrics section`, async () => { + it.skip(`should render ${chartsCount} ${metric} chart(s) in the Metrics section`, async () => { const charts = await pageObjects.assetDetails.getOverviewTabDockerMetricCharts( metric ); diff --git a/x-pack/test/functional/apps/ingest_pipelines/ingest_pipelines.ts b/x-pack/test/functional/apps/ingest_pipelines/ingest_pipelines.ts index c6f1eb4d189a00..b4a6bfe60e0103 100644 --- a/x-pack/test/functional/apps/ingest_pipelines/ingest_pipelines.ts +++ b/x-pack/test/functional/apps/ingest_pipelines/ingest_pipelines.ts @@ -133,6 +133,22 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); + it('Shows a prompt when trying to navigate away from the creation form when the form is dirty', async () => { + // Navigate to creation flow + await testSubjects.click('createPipelineDropdown'); + await testSubjects.click('createNewPipeline'); + + // Fill in the form with some data + await testSubjects.setValue('nameField > input', 'test_name'); + await testSubjects.setValue('descriptionField > input', 'test_description'); + + // Try to navigate to another page + await testSubjects.click('logo'); + + // Since the form is now dirty it should trigger a confirmation prompt + expect(await testSubjects.exists('navigationBlockConfirmModal')).to.be(true); + }); + describe('Create pipeline', () => { afterEach(async () => { // Delete the pipeline that was created diff --git a/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts index 1c64c85534d666..2ce47eb927d8ca 100644 --- a/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/columns_selection.ts @@ -85,7 +85,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('render content virtual column properly', async () => { it('should render log level and log message when present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('A sample log')).to.be(true); @@ -94,7 +94,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render log message when present and skip log level when missing', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 3); + const cellElement = await dataGrid.getCellElement(1, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(false); expect(cellValue.includes('A sample log')).to.be(true); @@ -103,7 +103,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render message from error object when top level message not present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(2, 3); + const cellElement = await dataGrid.getCellElement(2, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('error.message')).to.be(true); @@ -113,7 +113,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render message from event.original when top level message and error.message not present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(3, 3); + const cellElement = await dataGrid.getCellElement(3, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('event.original')).to.be(true); @@ -123,7 +123,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the whole JSON when neither message, error.message and event.original are present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(4, 3); + const cellElement = await dataGrid.getCellElement(4, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); @@ -137,7 +137,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('on cell expansion with no message field should open JSON Viewer', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - await dataGrid.clickCellExpandButton(4, 3); + await dataGrid.clickCellExpandButton(4, 4); await testSubjects.existOrFail('dataTableExpandCellActionJsonPopover'); }); }); @@ -145,7 +145,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('on cell expansion with message field should open regular popover', async () => { await navigateToLogsExplorer(); await retry.tryForTime(TEST_TIMEOUT, async () => { - await dataGrid.clickCellExpandButton(3, 3); + await dataGrid.clickCellExpandButton(3, 4); await testSubjects.existOrFail('euiDataGridExpansionPopover'); }); }); @@ -154,7 +154,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('render resource virtual column properly', async () => { it('should render service name and host name when present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 2); + const cellElement = await dataGrid.getCellElement(0, 3); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('synth-service')).to.be(true); expect(cellValue.includes('synth-host')).to.be(true); @@ -168,7 +168,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should render a popover with cell actions when a chip on content column is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -184,7 +184,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where log.level value is info when filter in action is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -204,7 +204,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where log.level value is not info when filter out action is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -222,7 +222,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where service.name value is selected', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 2); + const cellElement = await dataGrid.getCellElement(0, 3); const serviceNameChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_service.name' ); diff --git a/x-pack/test/functional/apps/observability_logs_explorer/custom_control_columns.ts b/x-pack/test/functional/apps/observability_logs_explorer/custom_control_columns.ts index 9fcea31d6b8b7b..21dd8a6772bb7e 100644 --- a/x-pack/test/functional/apps/observability_logs_explorer/custom_control_columns.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/custom_control_columns.ts @@ -46,30 +46,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('should render custom control columns properly', async () => { it('should render control column with proper header', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - // First control column has no title, so empty string, last control column has title + // First control column has no title, so empty string, leading control column has title expect(await dataGrid.getControlColumnHeaderFields()).to.eql(['', 'actions']); }); }); - it('should render the expand icon in the last control column', async () => { + it('should render the expand icon in the leading control column', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 4); + const cellElement = await dataGrid.getCellElement(0, 1); const expandButton = await cellElement.findByTestSubject('docTableExpandToggleColumn'); expect(expandButton).to.not.be.empty(); }); }); - it('should render the degraded icon in the last control column if degraded doc exists', async () => { + it('should render the degraded icon in the leading control column if degraded doc exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 4); + const cellElement = await dataGrid.getCellElement(1, 1); const degradedButton = await cellElement.findByTestSubject('docTableDegradedDocExist'); expect(degradedButton).to.not.be.empty(); }); }); - it('should render the disabled degraded icon in the last control column when degraded doc does not exists', async () => { + it('should render the disabled degraded icon in the leading control column when degraded doc does not exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 4); + const cellElement = await dataGrid.getCellElement(0, 1); const degradedDisableButton = await cellElement.findByTestSubject( 'docTableDegradedDocDoesNotExist' ); @@ -77,17 +77,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - it('should render the stacktrace icon in the last control column when stacktrace exists', async () => { + it('should render the stacktrace icon in the leading control column when stacktrace exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(4, 4); + const cellElement = await dataGrid.getCellElement(4, 1); const stacktraceButton = await cellElement.findByTestSubject('docTableStacktraceExist'); expect(stacktraceButton).to.not.be.empty(); }); }); - it('should render the stacktrace icon disabled in the last control column when stacktrace does not exists', async () => { + it('should render the stacktrace icon disabled in the leading control column when stacktrace does not exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 4); + const cellElement = await dataGrid.getCellElement(1, 1); const stacktraceButton = await cellElement.findByTestSubject( 'docTableStacktraceDoesNotExist' ); diff --git a/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts index 22732d9933bbb3..c5c11cac571851 100644 --- a/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts +++ b/x-pack/test/functional/apps/observability_logs_explorer/flyout.ts @@ -66,7 +66,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display the logs overview tab', async () => { - await dataGrid.clickRowToggle({ columnIndex: 4 }); + await dataGrid.clickRowToggle({ columnIndex: 1 }); await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); }); }); diff --git a/x-pack/test/functional/es_archives/fleet/agents/mappings.json b/x-pack/test/functional/es_archives/fleet/agents/mappings.json index a345f97f541666..bbed5094bc3efc 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -375,67 +375,3 @@ } } } - -{ - "type": "index", - "value": { - "aliases": { - ".fleet-servers": { - } - }, - "index": ".fleet-servers-7", - "mappings": { - "_meta": { - "migrationHash": "e2782448c7235ec9af66ca7997e867d715ac379c" - }, - "dynamic": "false", - "properties": { - "@timestamp": { - "type": "date" - }, - "agent": { - "properties": { - "id": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - }, - "host": { - "properties": { - "architecture": { - "type": "keyword" - }, - "id": { - "type": "keyword" - }, - "ip": { - "type": "keyword" - }, - "name": { - "type": "keyword" - } - } - }, - "server": { - "properties": { - "id": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - } - } - }, - "settings": { - "index": { - "number_of_replicas": "1", - "number_of_shards": "1" - } - } - } -} diff --git a/x-pack/test/functional/es_archives/fleet/empty_fleet_server/mappings.json b/x-pack/test/functional/es_archives/fleet/empty_fleet_server/mappings.json index a04b7a7dc21c7e..b10f0934d981d1 100644 --- a/x-pack/test/functional/es_archives/fleet/empty_fleet_server/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/empty_fleet_server/mappings.json @@ -375,66 +375,3 @@ } } -{ - "type": "index", - "value": { - "aliases": { - ".fleet-servers": { - } - }, - "index": ".fleet-servers-7", - "mappings": { - "_meta": { - "migrationHash": "e2782448c7235ec9af66ca7997e867d715ac379c" - }, - "dynamic": "false", - "properties": { - "@timestamp": { - "type": "date" - }, - "agent": { - "properties": { - "id": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - }, - "host": { - "properties": { - "architecture": { - "type": "keyword" - }, - "id": { - "type": "keyword" - }, - "ip": { - "type": "keyword" - }, - "name": { - "type": "keyword" - } - } - }, - "server": { - "properties": { - "id": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - } - } - }, - "settings": { - "index": { - "number_of_replicas": "1", - "number_of_shards": "1" - } - } - } -} diff --git a/x-pack/test/functional/page_objects/ingest_pipelines_page.ts b/x-pack/test/functional/page_objects/ingest_pipelines_page.ts index d7a2e32f302d2f..218a34e5c1ae22 100644 --- a/x-pack/test/functional/page_objects/ingest_pipelines_page.ts +++ b/x-pack/test/functional/page_objects/ingest_pipelines_page.ts @@ -32,6 +32,7 @@ export function IngestPipelinesPageProvider({ getService, getPageObjects }: FtrP processors?: string; onFailureProcessors?: string; }) { + await pageObjects.common.sleep(250); await testSubjects.click('createPipelineDropdown'); await testSubjects.click('createNewPipeline'); @@ -82,6 +83,7 @@ export function IngestPipelinesPageProvider({ getService, getPageObjects }: FtrP }, async createPipelineFromCsv({ name }: { name: string }) { + await pageObjects.common.sleep(250); await testSubjects.click('createPipelineDropdown'); await testSubjects.click('createPipelineFromCsv'); diff --git a/x-pack/test/monitoring_api_integration/apis/elasticsearch/index.ts b/x-pack/test/monitoring_api_integration/apis/elasticsearch/index.ts index cfcb7bf5570aa4..2ed2b6c35bd265 100644 --- a/x-pack/test/monitoring_api_integration/apis/elasticsearch/index.ts +++ b/x-pack/test/monitoring_api_integration/apis/elasticsearch/index.ts @@ -9,7 +9,8 @@ import { FtrProviderContext } from '../../../api_integration/ftr_provider_contex import { installPackage } from '../../packages'; export default function ({ loadTestFile, getService }: FtrProviderContext) { - describe('Elasticsearch', () => { + // FLAKY: https://github.com/elastic/kibana/issues/184619 + describe.skip('Elasticsearch', () => { before(() => installPackage(getService('supertest'), 'elasticsearch')); loadTestFile(require.resolve('./ccr')); diff --git a/x-pack/test/monitoring_api_integration/apis/kibana/index.ts b/x-pack/test/monitoring_api_integration/apis/kibana/index.ts index 4409c5a8713977..8b6ca6b8e58f17 100644 --- a/x-pack/test/monitoring_api_integration/apis/kibana/index.ts +++ b/x-pack/test/monitoring_api_integration/apis/kibana/index.ts @@ -10,7 +10,7 @@ import { installPackage } from '../../packages'; export default function ({ loadTestFile, getService }: FtrProviderContext) { describe('Kibana', () => { - before(() => installPackage(getService('supertest'), 'kibana')); + before(async () => await installPackage(getService('supertest'), 'kibana')); loadTestFile(require.resolve('./overview')); loadTestFile(require.resolve('./instances')); diff --git a/x-pack/test/monitoring_api_integration/apis/kibana/overview.ts b/x-pack/test/monitoring_api_integration/apis/kibana/overview.ts index 98a8687eedc06f..3bb5bd3f3077e7 100644 --- a/x-pack/test/monitoring_api_integration/apis/kibana/overview.ts +++ b/x-pack/test/monitoring_api_integration/apis/kibana/overview.ts @@ -28,7 +28,8 @@ export default function ({ getService }: FtrProviderContext) { }; testRunner(() => { - it('should get kibana rules at cluster level', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/184853 + it.skip('should get kibana rules at cluster level', async () => { const { body } = await supertest .post('/api/monitoring/v1/clusters/rSEDbJNIQmOE-v9n2rV5cA') .set('kbn-xsrf', 'xxx') diff --git a/x-pack/test/monitoring_api_integration/packages.ts b/x-pack/test/monitoring_api_integration/packages.ts index 981845eb460dc3..ec9d9911b189f9 100644 --- a/x-pack/test/monitoring_api_integration/packages.ts +++ b/x-pack/test/monitoring_api_integration/packages.ts @@ -30,12 +30,14 @@ export const getPackagesArgs = (): string[] => { export const bundledPackagesLocation = path.join(path.dirname(__filename), '/fixtures/packages'); -export function installPackage(supertest: SuperTest.Agent, packageName: SupportedPackage) { +export async function installPackage(supertest: SuperTest.Agent, packageName: SupportedPackage) { const pkg = PACKAGES.find(({ name }) => name === packageName); const request = supertest .post('/api/fleet/epm/packages') .set('kbn-xsrf', 'xxx') .set('content-type', 'application/zip'); + // wait 10s before uploading again to avoid getting 429 from upload endpoint + await new Promise((resolve) => setTimeout(resolve, 10000)); return new Promise((resolve, reject) => { createReadStream(path.join(bundledPackagesLocation, `${pkg!.name}-${pkg!.version}.zip`)) 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 01f6e8cdd7bcea..eb5ed07d3ea08b 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 @@ -193,7 +193,6 @@ export default function ApiTest({ getService }: FtrProviderContext) { role: MessageRole.Assistant, function_call: { name: 'context', - arguments: JSON.stringify({ queries: [], categories: [] }), trigger: MessageRole.Assistant, }, }, diff --git a/x-pack/test/observability_ai_assistant_api_integration/tests/public_complete/public_complete.spec.ts b/x-pack/test/observability_ai_assistant_api_integration/tests/public_complete/public_complete.spec.ts index ac2fa36f6b0fd1..f496e42868ac8d 100644 --- a/x-pack/test/observability_ai_assistant_api_integration/tests/public_complete/public_complete.spec.ts +++ b/x-pack/test/observability_ai_assistant_api_integration/tests/public_complete/public_complete.spec.ts @@ -72,6 +72,7 @@ export default function ApiTest({ getService }: FtrProviderContext) { format, }) .set('kbn-xsrf', 'foo') + .set('elastic-api-version', '2023-10-31') .send({ messages, connectorId, @@ -83,13 +84,20 @@ export default function ApiTest({ getService }: FtrProviderContext) { if (err) { return reject(err); } + if (response.status !== 200) { + return reject(new Error(`${response.status}: ${JSON.stringify(response.body)}`)); + } return resolve(response); }); }); - const [conversationSimulator, titleSimulator] = await Promise.all([ - conversationInterceptor.waitForIntercept(), - titleInterceptor.waitForIntercept(), + const [conversationSimulator, titleSimulator] = await Promise.race([ + Promise.all([ + conversationInterceptor.waitForIntercept(), + titleInterceptor.waitForIntercept(), + ]), + // make sure any request failures (like 400s) are properly propagated + responsePromise.then(() => []), ]); await titleSimulator.status(200); 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 b7c33db0a41226..3e766877c5bcae 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 @@ -94,7 +94,7 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte content: '', function_call: { name: 'context', - arguments: '{"queries":[],"categories":[]}', + arguments: '{}', trigger: MessageRole.Assistant, }, }, @@ -290,7 +290,6 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte expect(pick(contextRequest.function_call, 'name', 'arguments')).to.eql({ name: 'context', - arguments: JSON.stringify({ queries: [], categories: [] }), }); expect(contextResponse.name).to.eql('context'); @@ -354,7 +353,6 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte expect(pick(contextRequest.function_call, 'name', 'arguments')).to.eql({ name: 'context', - arguments: JSON.stringify({ queries: [], categories: [] }), }); expect(contextResponse.name).to.eql('context'); diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts index 163c416bea3144..ff650c32de9afb 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/check_registered_task_types.ts @@ -57,6 +57,7 @@ export default function ({ getService }: FtrProviderContext) { 'actions:.crowdstrike', 'actions:.d3security', 'actions:.email', + 'actions:.gemini', 'actions:.gen-ai', 'actions:.index', 'actions:.jira', diff --git a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts index 8d79b4250de604..fb8ee402fcc881 100644 --- a/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts +++ b/x-pack/test/plugin_api_integration/test_suites/task_manager/metrics_route.ts @@ -133,8 +133,8 @@ export default function ({ getService }: FtrProviderContext) { expect(metrics?.task_claim).not.to.be(null); expect(metrics?.task_claim?.value).not.to.be(null); - expect(metrics?.task_claim?.value.success).to.equal(0); - expect(metrics?.task_claim?.value.total).to.equal(0); + expect(metrics?.task_claim?.value.success).to.equal(1); + expect(metrics?.task_claim?.value.total).to.equal(1); previousTaskClaimTimestamp = metrics?.task_claim?.timestamp!; @@ -264,10 +264,7 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); const metrics = ( - await getMetrics( - false, - (m) => m?.metrics?.task_run?.value.overall.framework_errors! === 1 - ) + await getMetrics(true, (m) => m?.metrics?.task_run?.value.overall.framework_errors! === 1) ).metrics; const total = metrics?.task_run?.value.overall.total || 0; @@ -305,13 +302,13 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); const metrics = ( - await getMetrics(false, (m) => m?.metrics?.task_run?.value.overall.user_errors! === 1) + await getMetrics(true, (m) => m?.metrics?.task_run?.value.overall.user_errors! === 1) ).metrics; const total = metrics?.task_run?.value.overall.total || 0; const success = metrics?.task_run?.value.overall.success || 0; - expect(total - success).to.be(2); + expect(total - success).to.be(1); }); }); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/list_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/list_view.ts index 30f3a2c87dfd78..6903ac026cd816 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/list_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_alerting/list_view.ts @@ -58,5 +58,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 1024 ); }); + + it('alerts UI screenshots', async () => { + await pageObjects.common.navigateToUrl( + 'management', + 'insightsAndAlerting/triggersActionsAlerts', + { + shouldUseHashForSubUrl: false, + } + ); + await pageObjects.header.waitUntilLoadingHasFinished(); + await commonScreenshots.takeScreenshot( + 'stack-management-alerts-page', + screenshotDirectories, + 1400, + 1024 + ); + const queryMenu = await testSubjects.find('showQueryBarMenu'); + await queryMenu.click(); + await commonScreenshots.takeScreenshot( + 'stack-management-alerts-query-menu', + screenshotDirectories, + 1400, + 1024 + ); + }); }); } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts index b4e1eaa391744e..b0a0e3f8b66bac 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/eql_alert_suppression.ts @@ -7,6 +7,8 @@ import expect from 'expect'; import { v4 as uuidv4 } from 'uuid'; +import sortBy from 'lodash/sortBy'; + import { EqlRuleCreateProps } from '@kbn/security-solution-plugin/common/api/detection_engine'; import { ALERT_SUPPRESSION_START, @@ -255,6 +257,96 @@ export default ({ getService }: FtrProviderContext) => { ); }); + it('deduplicates new alerts if they were previously created without suppression', async () => { + const id = uuidv4(); + const firstTimestamp = new Date().toISOString(); + + const ruleWithoutSuppression: EqlRuleCreateProps = { + ...getEqlRuleForAlertTesting(['ecs_compliant']), + query: getQuery(id), + from: 'now-35m', + interval: '30m', + }; + const alertSuppression = { + group_by: ['host.name'], + duration: { + value: 300, + unit: 'm' as const, + }, + missing_fields_strategy: 'suppress', + }; + + const firstDocument = { + id, + '@timestamp': firstTimestamp, + host: { + name: 'host-a', + }, + }; + await indexListOfSourceDocuments([firstDocument, firstDocument]); + + const createdRule = await createRule(supertest, log, ruleWithoutSuppression); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + expect(alerts.hits.hits).toHaveLength(2); + // alert does not have suppression properties + alerts.hits.hits.forEach((previewAlert) => { + const source = previewAlert._source; + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + }); + + const secondTimestamp = new Date().toISOString(); + const secondDocument = { + id, + '@timestamp': secondTimestamp, + host: { + name: 'host-a', + }, + }; + + await indexListOfSourceDocuments([secondDocument, secondDocument]); + + // update the rule to include suppression + await patchRule(supertest, log, { + id: createdRule.id, + alert_suppression: alertSuppression, + enabled: false, + }); + await patchRule(supertest, log, { id: createdRule.id, enabled: true }); + + const afterTimestamp = new Date(); + const secondAlerts = await getOpenAlerts( + supertest, + log, + es, + createdRule, + RuleExecutionStatusEnum.succeeded, + undefined, + afterTimestamp + ); + + expect(secondAlerts.hits.hits.length).toEqual(3); + + const sortedAlerts = sortBy(secondAlerts.hits.hits, ALERT_ORIGINAL_TIME); + + // third alert is generated with suppression + expect(sortedAlerts[2]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'host.name', + value: ['host-a'], + }, + ], + [ALERT_ORIGINAL_TIME]: secondTimestamp, + [ALERT_SUPPRESSION_DOCS_COUNT]: 1, + }) + ); + }); + it('does not suppress alerts when suppression duration is less than rule interval', async () => { const id = uuidv4(); const firstTimestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts index 7ab53b9817970b..39724206cfab3e 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/esql_suppression.ts @@ -256,6 +256,95 @@ export default ({ getService }: FtrProviderContext) => { ); }); + it('deduplicates new alerts if they were previously created without suppression', async () => { + const id = uuidv4(); + const firstTimestamp = new Date().toISOString(); + + const ruleWithoutSuppression: EsqlRuleCreateProps = { + ...getCreateEsqlRulesSchemaMock('rule-1', true), + query: getNonAggRuleQueryWithMetadata(id), + from: 'now-35m', + interval: '30m', + }; + const alertSuppression = { + group_by: ['host.name'], + duration: { + value: 300, + unit: 'm' as const, + }, + missing_fields_strategy: 'suppress', + }; + + const firstExecutionDocuments = [ + { + host: { name: 'host-0' }, + id, + '@timestamp': firstTimestamp, + }, + ]; + + await indexListOfDocuments(firstExecutionDocuments); + + const createdRule = await createRule(supertest, log, ruleWithoutSuppression); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + expect(alerts.hits.hits).toHaveLength(1); + // alert does not have suppression properties + alerts.hits.hits.forEach((previewAlert) => { + const source = previewAlert._source; + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + }); + + const secondTimestamp = new Date().toISOString(); + const secondExecutionDocument = { + host: { name: 'host-0' }, + id, + '@timestamp': secondTimestamp, + }; + + await indexListOfDocuments([secondExecutionDocument, secondExecutionDocument]); + + // update the rule to include suppression + await patchRule(supertest, log, { + id: createdRule.id, + alert_suppression: alertSuppression, + enabled: false, + }); + await patchRule(supertest, log, { id: createdRule.id, enabled: true }); + + const afterTimestamp = new Date(); + const secondAlerts = await getOpenAlerts( + supertest, + log, + es, + createdRule, + RuleExecutionStatusEnum.succeeded, + undefined, + afterTimestamp + ); + + expect(secondAlerts.hits.hits.length).toEqual(2); + + const sortedAlerts = sortBy(secondAlerts.hits.hits, ALERT_ORIGINAL_TIME); + + // second alert is generated with suppression + expect(sortedAlerts[1]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'host.name', + value: 'host-0', + }, + ], + [ALERT_ORIGINAL_TIME]: secondTimestamp, + [ALERT_SUPPRESSION_DOCS_COUNT]: 1, + }) + ); + }); + it('should NOT suppress alerts when suppression period is less than rule interval', async () => { const id = uuidv4(); const firstTimestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts index c0b8e85ec27af0..1868fbdef1555d 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/indicator_match_alert_suppression.ts @@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid'; import expect from 'expect'; +import sortBy from 'lodash/sortBy'; import { ALERT_SUPPRESSION_START, @@ -372,6 +373,109 @@ export default ({ getService }: FtrProviderContext) => { ); }); + it('deduplicates new alerts if they were previously created without suppression', async () => { + const id = uuidv4(); + const firstTimestamp = new Date().toISOString(); + + await eventsFiller({ id, count: eventsCount, timestamp: [firstTimestamp] }); + await threatsFiller({ id, count: threatsCount, timestamp: firstTimestamp }); + + const firstDocument = { + id, + '@timestamp': firstTimestamp, + host: { + name: 'host-a', + }, + }; + await indexListOfSourceDocuments([firstDocument]); + + await addThreatDocuments({ + id, + timestamp: firstTimestamp, + fields: { + host: { + name: 'host-a', + }, + }, + count: 1, + }); + + const ruleWithoutSuppression: ThreatMatchRuleCreateProps = { + ...indicatorMatchRule(id), + from: 'now-35m', + interval: '30m', + }; + const alertSuppression = { + group_by: ['host.name'], + duration: { + value: 300, + unit: 'm' as const, + }, + missing_fields_strategy: 'suppress', + }; + + const createdRule = await createRule(supertest, log, ruleWithoutSuppression); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + expect(alerts.hits.hits).toHaveLength(1); + // alert does not have suppression properties + alerts.hits.hits.forEach((previewAlert) => { + const source = previewAlert._source; + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + }); + + const secondTimestamp = new Date().toISOString(); + const secondDocument = { + id, + '@timestamp': secondTimestamp, + host: { + name: 'host-a', + }, + }; + + await indexListOfSourceDocuments([secondDocument, secondDocument]); + + // update the rule to include suppression + await patchRule(supertest, log, { + id: createdRule.id, + alert_suppression: alertSuppression, + enabled: false, + }); + await patchRule(supertest, log, { id: createdRule.id, enabled: true }); + + const afterTimestamp = new Date(); + const secondAlerts = await getOpenAlerts( + supertest, + log, + es, + createdRule, + RuleExecutionStatusEnum.succeeded, + undefined, + afterTimestamp + ); + + expect(secondAlerts.hits.hits.length).toEqual(2); + + const sortedAlerts = sortBy(secondAlerts.hits.hits, ALERT_ORIGINAL_TIME); + + // second alert is generated with suppression + expect(sortedAlerts[1]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'host.name', + value: ['host-a'], + }, + ], + [ALERT_ORIGINAL_TIME]: secondTimestamp, + [ALERT_SUPPRESSION_DOCS_COUNT]: 1, + }) + ); + }); + it('should NOT suppress alerts when suppression period is less than rule interval', async () => { const id = uuidv4(); const firstTimestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts index 863a107af8ab5b..4a2644a9737a67 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/new_terms_alert_suppression.ts @@ -7,6 +7,7 @@ import { v4 as uuidv4 } from 'uuid'; import expect from 'expect'; +import sortBy from 'lodash/sortBy'; import { ALERT_SUPPRESSION_START, @@ -276,6 +277,105 @@ export default ({ getService }: FtrProviderContext) => { ); }); + it('deduplicates new alerts if they were previously created without suppression', async () => { + const id = uuidv4(); + const firstTimestamp = new Date().toISOString(); + + const ruleWithoutSuppression: NewTermsRuleCreateProps = { + ...getCreateNewTermsRulesSchemaMock(id, true), + new_terms_fields: ['host.ip'], + index: ['ecs_compliant'], + history_window_start: historicalWindowStart, + from: 'now-35m', + interval: '30m', + query: `id: "${id}"`, + }; + const alertSuppression = { + group_by: ['host.name'], + duration: { + value: 300, + unit: 'm' as const, + }, + missing_fields_strategy: 'suppress', + }; + + const firstExecutionDocuments = [ + { + host: { name: 'host-0', ip: '127.0.0.3' }, + id, + '@timestamp': firstTimestamp, + }, + ]; + + await indexListOfDocuments(firstExecutionDocuments); + + const createdRule = await createRule(supertest, log, ruleWithoutSuppression); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + expect(alerts.hits.hits).toHaveLength(1); + // alert does not have suppression properties + alerts.hits.hits.forEach((previewAlert) => { + const source = previewAlert._source; + expect(source).toHaveProperty('id', id); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + }); + + const secondTimestamp = new Date().toISOString(); + const secondExecutionDocuments = [ + { + host: { name: 'host-0', ip: '127.0.0.5' }, + id, + '@timestamp': secondTimestamp, + }, + { + host: { name: 'host-0', ip: '127.0.0.6' }, + id, + '@timestamp': secondTimestamp, + }, + ]; + + await indexListOfDocuments(secondExecutionDocuments); + + // update the rule to include suppression + await patchRule(supertest, log, { + id: createdRule.id, + alert_suppression: alertSuppression, + enabled: false, + }); + await patchRule(supertest, log, { id: createdRule.id, enabled: true }); + + const afterTimestamp = new Date(); + const secondAlerts = await getOpenAlerts( + supertest, + log, + es, + createdRule, + RuleExecutionStatusEnum.succeeded, + undefined, + afterTimestamp + ); + + expect(secondAlerts.hits.hits.length).toEqual(2); + + const sortedAlerts = sortBy(secondAlerts.hits.hits, ALERT_ORIGINAL_TIME); + + // second alert is generated with suppression + expect(sortedAlerts[1]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'host.name', + value: ['host-0'], + }, + ], + [ALERT_ORIGINAL_TIME]: secondTimestamp, + [ALERT_SUPPRESSION_DOCS_COUNT]: 1, + }) + ); + }); + it('should NOT suppress alerts when suppression period is less than rule interval', async () => { const id = uuidv4(); const firstTimestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts index 53b03edba30df8..d97bd0d517314b 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/detection_engine/rule_execution_logic/trial_license_complete_tier/execution_logic/threshold_alert_suppression.ts @@ -7,7 +7,7 @@ import { v4 as uuidv4 } from 'uuid'; import expect from 'expect'; - +import sortBy from 'lodash/sortBy'; import { ALERT_SUPPRESSION_START, ALERT_SUPPRESSION_END, @@ -24,9 +24,11 @@ import { RuleExecutionStatusEnum } from '@kbn/security-solution-plugin/common/ap import { ENABLE_ASSET_CRITICALITY_SETTING } from '@kbn/security-solution-plugin/common/constants'; import { ALERT_ORIGINAL_TIME } from '@kbn/security-solution-plugin/common/field_maps/field_names'; +import { AlertSuppression } from '@kbn/security-solution-plugin/common/api/detection_engine/model/rule_schema'; import { createRule } from '../../../../../../../common/utils/security_solution'; import { getAlerts, + getOpenAlerts, getPreviewAlerts, getThresholdRuleForAlertTesting, previewRule, @@ -248,6 +250,96 @@ export default ({ getService }: FtrProviderContext) => { ); }); + it('deduplicates new alerts if they were previously created without suppression', async () => { + const id = uuidv4(); + const firstTimestamp = new Date().toISOString(); + const firstDocument = { + id, + '@timestamp': firstTimestamp, + agent: { + name: 'agent-1', + }, + }; + await indexListOfDocuments([firstDocument]); + + const ruleWithoutSuppression: ThresholdRuleCreateProps = { + ...getThresholdRuleForAlertTesting(['ecs_compliant']), + query: `id:${id}`, + threshold: { + field: ['agent.name'], + value: 1, + }, + from: 'now-35m', + interval: '30m', + }; + const alertSuppression = { + duration: { + value: 300, + unit: 'm', + }, + }; + + const createdRule = await createRule(supertest, log, ruleWithoutSuppression); + const alerts = await getOpenAlerts(supertest, log, es, createdRule); + expect(alerts.hits.hits).toHaveLength(1); + // alert does not have suppression properties + alerts.hits.hits.forEach((previewAlert) => { + const source = previewAlert._source; + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_END); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_TERMS); + expect(source).not.toHaveProperty(ALERT_SUPPRESSION_DOCS_COUNT); + }); + + const secondTimestamp = new Date().toISOString(); + const secondDocument = { + id, + '@timestamp': secondTimestamp, + agent: { + name: 'agent-1', + }, + }; + + await indexListOfDocuments([secondDocument, secondDocument]); + + // update the rule to include suppression + await patchRule(supertest, log, { + id: createdRule.id, + alert_suppression: alertSuppression as AlertSuppression, + enabled: false, + }); + await patchRule(supertest, log, { id: createdRule.id, enabled: true }); + + const afterTimestamp = new Date(); + const secondAlerts = await getOpenAlerts( + supertest, + log, + es, + createdRule, + RuleExecutionStatusEnum.succeeded, + undefined, + afterTimestamp + ); + + expect(secondAlerts.hits.hits.length).toEqual(2); + + const sortedAlerts = sortBy(secondAlerts.hits.hits, ALERT_ORIGINAL_TIME); + + // second alert is generated with suppression + expect(sortedAlerts[1]._source).toEqual( + expect.objectContaining({ + [ALERT_SUPPRESSION_TERMS]: [ + { + field: 'agent.name', + value: 'agent-1', + }, + ], + [ALERT_ORIGINAL_TIME]: secondTimestamp, + [ALERT_SUPPRESSION_DOCS_COUNT]: 0, + }) + ); + }); + it('should generate an alert per rule run when duration is less than rule interval', async () => { const id = uuidv4(); const timestamp = '2020-10-28T05:45:00.000Z'; diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts index 1dd6b0f9e57667..29451ef9dacbe1 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_calculation.ts @@ -138,8 +138,8 @@ export default ({ getService }: FtrProviderContext): void => { expect(score).to.eql({ calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, - category_1_score: 8.039816232771821, + calculated_score_norm: 8.10060175898781, + category_1_score: 8.10060175898781, category_1_count: 1, id_field: 'host.name', id_value: 'host-1', @@ -353,8 +353,8 @@ export default ({ getService }: FtrProviderContext): void => { criticality_modifier: 1.5, calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 11.59366948840633, - category_1_score: 8.039816232771821, + calculated_score_norm: 11.677912063468526, + category_1_score: 8.10060175898781, category_1_count: 1, id_field: 'host.name', id_value: 'host-1', diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_entity_calculation.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_entity_calculation.ts index e3ddfbbda4ef20..2f7b7d44898c14 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_entity_calculation.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_entity_calculation.ts @@ -126,8 +126,8 @@ export default ({ getService }: FtrProviderContext): void => { const expectedScore = { calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, - category_1_score: 8.039816232771821, + calculated_score_norm: 8.10060175898781, + category_1_score: 8.10060175898781, category_1_count: 1, id_field: 'host.name', id_value: 'host-1', @@ -176,8 +176,8 @@ export default ({ getService }: FtrProviderContext): void => { criticality_modifier: 1.5, calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 11.59366948840633, - category_1_score: 8.039816232771821, + calculated_score_norm: 11.677912063468526, + category_1_score: 8.10060175898781, category_1_count: 1, id_field: 'host.name', id_value: 'host-1', diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_preview.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_preview.ts index 28ebe8dae5f56b..dfd7efe8d6583e 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_preview.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_score_preview.ts @@ -116,9 +116,9 @@ export default ({ getService }: FtrProviderContext): void => { expect(score).to.eql({ calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, + calculated_score_norm: 8.10060175898781, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-1', }); @@ -144,18 +144,18 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, + calculated_score_norm: 8.10060175898781, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-1', }, { calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, + calculated_score_norm: 8.10060175898781, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-2', }, @@ -177,9 +177,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Unknown', calculated_score: 28.42462120245875, - calculated_score_norm: 10.88232052161514, + calculated_score_norm: 10.964596976723788, category_1_count: 2, - category_1_score: 10.882320521615142, + category_1_score: 10.964596976723788, id_field: 'host.name', id_value: 'host-1', }, @@ -199,9 +199,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Unknown', calculated_score: 47.25513506055279, - calculated_score_norm: 18.091552473412246, + calculated_score_norm: 18.228334771081926, category_1_count: 30, - category_1_score: 18.091552473412246, + category_1_score: 18.228334771081926, id_field: 'host.name', id_value: 'host-1', }, @@ -224,18 +224,18 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Unknown', calculated_score: 47.25513506055279, - calculated_score_norm: 18.091552473412246, + calculated_score_norm: 18.228334771081926, category_1_count: 30, - category_1_score: 18.091552473412246, + category_1_score: 18.228334771081926, id_field: 'host.name', id_value: 'host-1', }, { calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, + calculated_score_norm: 8.10060175898781, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-2', }, @@ -255,9 +255,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Unknown', calculated_score: 50.67035607277805, - calculated_score_norm: 19.399064346392823, + calculated_score_norm: 19.545732168175455, category_1_count: 100, - category_1_score: 19.399064346392823, + category_1_score: 19.545732168175455, id_field: 'host.name', id_value: 'host-1', }, @@ -280,9 +280,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Critical', calculated_score: 241.2874098703716, - calculated_score_norm: 92.37649688758484, + calculated_score_norm: 93.07491508654975, category_1_count: 100, - category_1_score: 92.37649688758484, + category_1_score: 93.07491508654975, id_field: 'host.name', id_value: 'host-1', }, @@ -311,9 +311,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Critical', calculated_score: 254.91456029175757, - calculated_score_norm: 97.59362951445543, + calculated_score_norm: 98.33149216623883, category_1_count: 1000, - category_1_score: 97.59362951445543, + category_1_score: 98.33149216623883, id_field: 'host.name', id_value: 'host-1', }, @@ -407,9 +407,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'High', calculated_score: 225.1106801442913, - calculated_score_norm: 86.18326192354185, + calculated_score_norm: 86.83485578779946, category_1_count: 100, - category_1_score: 86.18326192354185, + category_1_score: 86.83485578779946, id_field: 'host.name', id_value: 'host-1', }, @@ -436,9 +436,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Moderate', calculated_score: 120.6437049351858, - calculated_score_norm: 46.18824844379242, + calculated_score_norm: 46.537457543274876, category_1_count: 100, - category_1_score: 92.37649688758484, + category_1_score: 93.07491508654975, id_field: 'host.name', id_value: 'host-1', }, @@ -463,9 +463,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Moderate', calculated_score: 168.9011869092601, - calculated_score_norm: 64.66354782130938, + calculated_score_norm: 65.15244056058482, category_1_count: 100, - category_1_score: 92.37649688758484, + category_1_score: 93.07491508654975, id_field: 'user.name', id_value: 'user-1', }, @@ -492,9 +492,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'Low', calculated_score: 93.23759116471251, - calculated_score_norm: 35.695861854790394, + calculated_score_norm: 35.96574261869793, category_1_count: 50, - category_1_score: 89.23965463697598, + category_1_score: 89.91435654674481, id_field: 'host.name', id_value: 'host-1', }, @@ -504,9 +504,9 @@ export default ({ getService }: FtrProviderContext): void => { { calculated_level: 'High', calculated_score: 186.47518232942502, - calculated_score_norm: 71.39172370958079, + calculated_score_norm: 71.93148523739586, category_1_count: 50, - category_1_score: 89.23965463697598, + category_1_score: 89.91435654674481, id_field: 'user.name', id_value: 'user-1', }, @@ -547,18 +547,18 @@ export default ({ getService }: FtrProviderContext): void => { criticality_modifier: 2.0, calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 14.8830616583983, + calculated_score_norm: 14.987153868113044, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-1', }, { calculated_level: 'Unknown', calculated_score: 21, - calculated_score_norm: 8.039816232771823, + calculated_score_norm: 8.10060175898781, category_1_count: 1, - category_1_score: 8.039816232771821, + category_1_score: 8.10060175898781, id_field: 'host.name', id_value: 'host-2', }, diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts index bcdcd9085a7c1e..d53ffc707b3961 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/risk_scoring_task/task_execution.ts @@ -274,9 +274,9 @@ export default ({ getService }: FtrProviderContext): void => { criticality_modifier: 2, calculated_level: 'Moderate', calculated_score: 79.81345973382406, - calculated_score_norm: 46.809565696393314, + calculated_score_norm: 47.08016240063269, category_1_count: 10, - category_1_score: 30.55645472198471, + category_1_score: 30.787478681462762, }, ]); }); diff --git a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts index 3eca71c37dab5a..6b45ab7a18427f 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/entity_analytics/risk_engine/trial_license_complete_tier/telemetry_usage.ts @@ -100,10 +100,10 @@ export default ({ getService }: FtrProviderContext) => { ...otherStats } = await getRiskEngineStats(supertest, log); const expected = { - unique_host_risk_score_total: 0, - unique_user_risk_score_total: 0, - unique_user_risk_score_day: 0, - unique_host_risk_score_day: 0, + unique_host_risk_score_total: 10, + unique_user_risk_score_total: 10, + unique_user_risk_score_day: 10, + unique_host_risk_score_day: 10, all_user_risk_scores_total: 10, all_host_risk_scores_total: 10, all_user_risk_scores_total_day: 10, diff --git a/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/configs/ess.config.ts b/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/configs/ess.config.ts index 722b39a7000267..2674d0fe847640 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/configs/ess.config.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/genai/invoke_ai/trial_license_complete_tier/configs/ess.config.ts @@ -23,7 +23,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...functionalConfig.get('kbnTestServer.serverArgs'), // used for connector simulators `--xpack.actions.proxyUrl=http://localhost:${proxyPort}`, - `--xpack.actions.enabledActionTypes=${JSON.stringify(['.bedrock', '.gen-ai'])}`, + `--xpack.actions.enabledActionTypes=${JSON.stringify(['.bedrock', '.gen-ai', '.gemini'])}`, ], }, testFiles: [require.resolve('..')], diff --git a/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts index 00a395fdc4b596..df8dee3493ec07 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/security_solution_endpoint/services/endpoint.ts @@ -160,6 +160,7 @@ export class EndpointTestResources extends FtrService { undefined, undefined, undefined, + undefined, this.log ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts index 5fa97ed2f90f96..518980c29c9089 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/entity_analytics/dashboards/upgrade_risk_score.cy.ts @@ -35,7 +35,8 @@ import { deleteRiskEngineConfiguration } from '../../../tasks/api_calls/risk_eng const spaceId = 'default'; -describe('Upgrade risk scores', { tags: ['@ess'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/185024 +describe.skip('Upgrade risk scores', { tags: ['@ess'] }, () => { beforeEach(() => { login(); deleteRiskEngineConfiguration(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts index ce95eed9c66710..142ae6efbd439e 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/detection_page_filters.cy.ts @@ -105,7 +105,8 @@ const assertFilterControlsWithFilterObject = ( }); }; -describe(`Detections : Page Filters`, { tags: ['@ess', '@serverless'] }, () => { +// FLAKY: https://github.com/elastic/kibana/issues/167914 +describe.skip(`Detections : Page Filters`, { tags: ['@ess', '@serverless'] }, () => { beforeEach(() => { deleteAlertsAndRules(); createRule(getNewRule()); diff --git a/x-pack/test_serverless/api_integration/services/slo_api.ts b/x-pack/test_serverless/api_integration/services/slo_api.ts index 7312905589cb7b..96b7f9e518f315 100644 --- a/x-pack/test_serverless/api_integration/services/slo_api.ts +++ b/x-pack/test_serverless/api_integration/services/slo_api.ts @@ -10,6 +10,7 @@ import { FetchHistoricalSummaryResponse, } from '@kbn/slo-schema'; import * as t from 'io-ts'; +import type { RoleCredentials } from '../../shared/services'; import { FtrProviderContext } from '../ftr_provider_context'; type DurationUnit = 'm' | 'h' | 'd' | 'w' | 'M'; @@ -70,50 +71,58 @@ type FetchHistoricalSummaryParams = t.OutputOf< export function SloApiProvider({ getService }: FtrProviderContext) { const es = getService('es'); const supertest = getService('supertest'); + const svlCommonApi = getService('svlCommonApi'); const retry = getService('retry'); const requestTimeout = 30 * 1000; const retryTimeout = 180 * 1000; return { - async create(slo: SloParams) { + async create(slo: SloParams, roleAuthc: RoleCredentials) { const { body } = await supertest .post(`/api/observability/slos`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(slo); return body; }, - async delete(sloId: string) { + async delete({ sloId, roleAuthc }: { sloId: string; roleAuthc: RoleCredentials }) { const response = await supertest .delete(`/api/observability/slos/${sloId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader); return response; }, async fetchHistoricalSummary( - params: FetchHistoricalSummaryParams + params: FetchHistoricalSummaryParams, + roleAuthc: RoleCredentials ): Promise { const { body } = await supertest .post(`/internal/observability/slos/_historical_summary`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(params); return body; }, - async waitForSloToBeDeleted(sloId: string) { + async waitForSloToBeDeleted({ + sloId, + roleAuthc, + }: { + sloId: string; + roleAuthc: RoleCredentials; + }) { if (!sloId) { throw new Error(`sloId is undefined`); } return await retry.tryForTime(retryTimeout, async () => { const response = await supertest .delete(`/api/observability/slos/${sloId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .timeout(requestTimeout); if (!response.ok) { throw new Error(`slodId [${sloId}] was not deleted`); @@ -122,15 +131,15 @@ export function SloApiProvider({ getService }: FtrProviderContext) { }); }, - async waitForSloCreated({ sloId }: { sloId: string }) { + async waitForSloCreated({ sloId, roleAuthc }: { sloId: string; roleAuthc: RoleCredentials }) { if (!sloId) { throw new Error(`'sloId is undefined`); } return await retry.tryForTime(retryTimeout, async () => { const response = await supertest .get(`/api/observability/slos/${sloId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .timeout(requestTimeout); if (response.body.id === undefined) { throw new Error(`No slo with id ${sloId} found`); @@ -187,16 +196,14 @@ export function SloApiProvider({ getService }: FtrProviderContext) { async deleteAllSLOs() { const response = await supertest .get(`/api/observability/slos/_definitions`) - .set('kbn-xsrf', 'true') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) .send() .expect(200); await Promise.all( response.body.results.map(({ id }: { id: string }) => { return supertest .delete(`/api/observability/slos/${id}`) - .set('kbn-xsrf', 'true') - .set('x-elastic-internal-origin', 'foo') + .set(svlCommonApi.getInternalRequestHeader()) .send() .expect(204); }) diff --git a/x-pack/test_serverless/api_integration/services/svl_cases/api.ts b/x-pack/test_serverless/api_integration/services/svl_cases/api.ts index 7089655551fbef..c01365861c2d3e 100644 --- a/x-pack/test_serverless/api_integration/services/svl_cases/api.ts +++ b/x-pack/test_serverless/api_integration/services/svl_cases/api.ts @@ -5,13 +5,13 @@ * 2.0. */ -import type SuperTest from 'supertest'; import { CASES_URL } from '@kbn/cases-plugin/common'; import { Case, CaseSeverity, CaseStatuses } from '@kbn/cases-plugin/common/types/domain'; import type { CasePostRequest } from '@kbn/cases-plugin/common/types/api'; import { ConnectorTypes } from '@kbn/cases-plugin/common/types/domain'; import { CasesFindResponse } from '@kbn/cases-plugin/common/types/api'; import { kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { RoleCredentials } from '../../../shared/services'; import { FtrProviderContext } from '../../ftr_provider_context'; export interface User { @@ -23,13 +23,8 @@ export interface User { export function SvlCasesApiServiceProvider({ getService }: FtrProviderContext) { const kbnServer = getService('kibanaServer'); - const supertest = getService('supertest'); - - const superUser: User = { - username: 'superuser', - password: 'superuser', - roles: ['superuser'], - }; + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlCommonApi = getService('svlCommonApi'); const defaultUser = { email: null, @@ -57,22 +52,6 @@ export function SvlCasesApiServiceProvider({ getService }: FtrProviderContext) { }; return { - setupAuth({ - apiCall, - headers, - auth, - }: { - apiCall: SuperTest.Test; - headers: Record; - auth?: { user: User; space: string | null } | null; - }): SuperTest.Test { - if (!Object.hasOwn(headers, 'Cookie') && auth != null) { - return apiCall.auth(auth.user.username, auth.user.password); - } - - return apiCall; - }, - getSpaceUrlPrefix(spaceId: string | undefined | null) { return spaceId && spaceId !== 'default' ? `/s/${spaceId}` : ``; }, @@ -139,65 +118,65 @@ export function SvlCasesApiServiceProvider({ getService }: FtrProviderContext) { async createCase( params: CasePostRequest, - expectedHttpCode: number = 200, - auth: { user: User; space: string | null } | null = { user: superUser, space: null }, - headers: Record = {} + roleAuthc: RoleCredentials, + expectedHttpCode: number = 200 ): Promise { - const apiCall = supertest.post(`${CASES_URL}`); - - this.setupAuth({ apiCall, headers, auth }); + const apiCall = supertestWithoutAuth.post(`${CASES_URL}`); const response = await apiCall - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .set(headers) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(params) .expect(expectedHttpCode); return response.body; }, - async findCases({ - query = {}, - expectedHttpCode = 200, - auth = { user: superUser, space: null }, - }: { - query?: Record; - expectedHttpCode?: number; - auth?: { user: User; space: string | null }; - }): Promise { - const { body: res } = await supertest - .get(`${this.getSpaceUrlPrefix(auth.space)}${CASES_URL}/_find`) - .auth(auth.user.username, auth.user.password) + async findCases( + { + query = {}, + expectedHttpCode = 200, + space = 'default', + }: { + query?: Record; + expectedHttpCode?: number; + space?: string; + }, + roleAuthc: RoleCredentials + ): Promise { + const { body: res } = await supertestWithoutAuth + .get(`${this.getSpaceUrlPrefix(space)}${CASES_URL}/_find`) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .query({ sortOrder: 'asc', ...query }) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') .send() .expect(expectedHttpCode); return res; }, - async getCase({ - caseId, - includeComments = false, - expectedHttpCode = 200, - auth = { user: superUser, space: null }, - }: { - caseId: string; - includeComments?: boolean; - expectedHttpCode?: number; - auth?: { user: User; space: string | null }; - }): Promise { - const { body: theCase } = await supertest + async getCase( + { + caseId, + space = 'default', + includeComments = false, + expectedHttpCode = 200, + }: { + caseId: string; + space?: string; + includeComments?: boolean; + expectedHttpCode?: number; + }, + roleAuthc: RoleCredentials + ): Promise { + const { body: theCase } = await supertestWithoutAuth .get( `${this.getSpaceUrlPrefix( - auth?.space + space )}${CASES_URL}/${caseId}?includeComments=${includeComments}` ) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .auth(auth.user.username, auth.user.password) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .expect(expectedHttpCode); return theCase; diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts index 26f72d754c4d60..3e0f400d35e78d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/alert_documents.ts @@ -54,7 +54,6 @@ export default function ({ getService }: FtrProviderContext) { let roleAdmin: RoleCredentials; let internalReqHeader: InternalRequestHeader; const supertest = getService('supertest'); - const esClient = getService('es'); const objectRemover = new ObjectRemover(supertest); diff --git a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts index 70d8f07cc8b84d..5c6120c8bd60f1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/alerting/rules.ts @@ -31,7 +31,7 @@ import { waitForExecutionEventLog, waitForNumRuleRuns, } from './helpers/alerting_wait_for_helpers'; -import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -60,14 +60,8 @@ export default function ({ getService }: FtrProviderContext) { }); afterEach(async () => { - await supertest - .delete(`/api/actions/connector/${connectorId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/actions/connector/${connectorId}`).set(internalReqHeader); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: '.kibana-event-log-*', conflicts: 'proceed', diff --git a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts index 76d6580e8bbb87..d6ec69803b8f5e 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/platform_security/authorization.ts @@ -6,11 +6,25 @@ */ import expect from 'expect'; +import { KibanaFeatureConfig, SubFeaturePrivilegeConfig } from '@kbn/features-plugin/common'; import { FtrProviderContext } from '../../../ftr_provider_context'; +function collectSubFeaturesPrivileges(feature: KibanaFeatureConfig) { + return new Map( + feature.subFeatures?.flatMap((subFeature) => + subFeature.privilegeGroups.flatMap(({ privileges }) => + privileges.map( + (privilege) => [privilege.id, privilege] as [string, SubFeaturePrivilegeConfig] + ) + ) + ) ?? [] + ); +} + export default function ({ getService }: FtrProviderContext) { const svlCommonApi = getService('svlCommonApi'); const supertest = getService('supertest'); + const log = getService('log'); describe('security/authorization', function () { describe('route access', () => { @@ -76,5 +90,39 @@ export default function ({ getService }: FtrProviderContext) { }); }); }); + + describe('available features', () => { + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let adminCredentials: { Cookie: string }; + + before(async () => { + // get auth header for Viewer role + adminCredentials = await svlUserManager.getApiCredentialsForRole('admin'); + }); + + it('all Dashboard and Discover sub-feature privileges are disabled', async () => { + const { body } = await supertestWithoutAuth + .get('/api/features') + .set(svlCommonApi.getInternalRequestHeader()) + .set(adminCredentials) + .expect(200); + + // We should make sure that neither Discover nor Dashboard displays any sub-feature privileges in Serverless. + // If any of these features adds a new sub-feature privilege we should make an explicit decision whether it + // should be displayed in Serverless. + const features = body as KibanaFeatureConfig[]; + for (const featureId of ['discover', 'dashboard']) { + const feature = features.find((f) => f.id === featureId)!; + const subFeaturesPrivileges = collectSubFeaturesPrivileges(feature); + for (const privilege of subFeaturesPrivileges.values()) { + log.debug( + `Verifying that ${privilege.id} sub-feature privilege of ${featureId} feature is disabled.` + ); + expect(privilege.disabled).toBe(true); + } + } + }); + }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts index 62db8c2eddda49..1478ba20a007dc 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/common/apm_api_supertest.ts @@ -14,6 +14,7 @@ import type { import { Config, kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; import type { APIEndpoint } from '@kbn/apm-plugin/server'; import { formatRequest } from '@kbn/server-route-repository'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import { InheritedFtrProviderContext } from '../../../../services'; export function createApmApiClient(st: supertest.Agent) { @@ -21,20 +22,18 @@ export function createApmApiClient(st: supertest.Agent) { options: { type?: 'form-data'; endpoint: TEndpoint; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } ): Promise> => { - const { endpoint, type } = options; + const { endpoint, type, roleAuthc, internalReqHeader } = options; const params = 'params' in options ? (options.params as Record) : {}; const { method, pathname, version } = formatRequest(endpoint, params.path); const url = format({ pathname, query: params?.query }); - const headers: Record = { - 'kbn-xsrf': 'foo', - 'x-elastic-internal-origin': 'foo', - }; - + const headers: Record = { ...internalReqHeader, ...roleAuthc.apiKeyHeader }; if (version) { headers['Elastic-Api-Version'] = version; } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts index 279a1e0970b571..9701107994e56b 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/apm_api_integration/feature_flags.ts @@ -6,6 +6,7 @@ */ import expect from 'expect'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { APMFtrContextProvider } from './common/services'; import { ApmApiClient } from './common/apm_api_supertest'; @@ -49,7 +50,11 @@ const SAMPLE_SOURCEMAP = { mappings: 'A,AAAB;;ABCDE;', }; -async function uploadSourcemap(apmApiClient: ApmApiClient) { +async function uploadSourcemap( + apmApiClient: ApmApiClient, + roleAuthc: RoleCredentials, + internalReqHeader: InternalRequestHeader +) { const response = await apmApiClient.slsUser({ endpoint: 'POST /api/apm/sourcemaps 2023-10-31', type: 'form-data', @@ -61,14 +66,30 @@ async function uploadSourcemap(apmApiClient: ApmApiClient) { sourcemap: JSON.stringify(SAMPLE_SOURCEMAP), }, }, + roleAuthc, + internalReqHeader, }); return response.body; } export default function ({ getService }: APMFtrContextProvider) { const apmApiClient = getService('apmApiClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); describe('apm feature flags', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + before(async () => { + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + describe('fleet migrations', () => { it('rejects requests to save apm server schema', async () => { try { @@ -81,6 +102,8 @@ export default function ({ getService }: APMFtrContextProvider) { }, }, }, + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(fleetMigrationResponse.statusCode); @@ -92,6 +115,8 @@ export default function ({ getService }: APMFtrContextProvider) { try { await apmApiClient.slsUser({ endpoint: 'GET /internal/apm/fleet/apm_server_schema/unsupported', + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(fleetMigrationResponse.statusCode); @@ -103,6 +128,8 @@ export default function ({ getService }: APMFtrContextProvider) { try { await apmApiClient.slsUser({ endpoint: 'GET /internal/apm/fleet/migration_check', + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(fleetMigrationResponse.statusCode); @@ -116,6 +143,8 @@ export default function ({ getService }: APMFtrContextProvider) { try { await apmApiClient.slsUser({ endpoint: 'GET /api/apm/settings/agent-configuration 2023-10-31', + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(agentConfigurationResponse.statusCode); @@ -127,6 +156,8 @@ export default function ({ getService }: APMFtrContextProvider) { try { await apmApiClient.slsUser({ endpoint: 'GET /api/apm/settings/agent-configuration/view 2023-10-31', + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(agentConfigurationResponse.statusCode); @@ -143,6 +174,8 @@ export default function ({ getService }: APMFtrContextProvider) { service: {}, }, }, + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(agentConfigurationResponse.statusCode); @@ -160,6 +193,8 @@ export default function ({ getService }: APMFtrContextProvider) { settings: { transaction_sample_rate: '0.55' }, }, }, + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(agentConfigurationResponse.statusCode); @@ -177,6 +212,8 @@ export default function ({ getService }: APMFtrContextProvider) { etag: '7312bdcc34999629a3d39df24ed9b2a7553c0c39', }, }, + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(agentConfigurationResponse.statusCode); @@ -190,6 +227,8 @@ export default function ({ getService }: APMFtrContextProvider) { try { await apmApiClient.slsUser({ endpoint: 'GET /api/apm/sourcemaps 2023-10-31', + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(sourceMapsResponse.statusCode); @@ -199,7 +238,7 @@ export default function ({ getService }: APMFtrContextProvider) { it('rejects requests to upload source maps', async () => { try { - await uploadSourcemap(apmApiClient); + await uploadSourcemap(apmApiClient, roleAuthc, internalReqHeader); } catch (err) { expect(err.res.status).toBe(sourceMapsResponse.statusCode); expect(err.res.body).toStrictEqual(sourceMapsResponse); @@ -211,6 +250,8 @@ export default function ({ getService }: APMFtrContextProvider) { await apmApiClient.slsUser({ endpoint: 'DELETE /api/apm/sourcemaps/{id} 2023-10-31', params: { path: { id: 'foo' } }, + roleAuthc, + internalReqHeader, }); } catch (err) { expect(err.res.status).toBe(sourceMapsResponse.statusCode); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts b/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts index d16169aa77f398..1d5dd1de80a9f8 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/burn_rate_rule/burn_rate_rule.ts @@ -14,7 +14,7 @@ import { cleanup, Dataset, generate, PartialConfig } from '@kbn/data-forge'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { RoleCredentials } from '../../../../shared/services'; +import { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -25,7 +25,9 @@ export default function ({ getService }: FtrProviderContext) { const dataViewApi = getService('dataViewApi'); const sloApi = getService('sloApi'); const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Burn rate rule', () => { const RULE_TYPE_ID = 'slo.rules.burnRate'; @@ -41,6 +43,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -63,17 +66,12 @@ export default function ({ getService }: FtrProviderContext) { id: DATA_VIEW_ID, title: DATA_VIEW, }); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: '.kibana-event-log-*', query: { term: { 'rule.id': ruleId } }, @@ -82,10 +80,7 @@ export default function ({ getService }: FtrProviderContext) { await dataViewApi.delete({ id: DATA_VIEW_ID, }); - await supertest - .delete('/api/observability/slos/my-custom-id') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete('/api/observability/slos/my-custom-id').set(internalReqHeader); await esDeleteAllIndices([ALERT_ACTION_INDEX, ...dataForgeIndices]); await cleanup({ client: esClient, config: dataForgeConfig, logger }); @@ -100,29 +95,32 @@ export default function ({ getService }: FtrProviderContext) { indexName: ALERT_ACTION_INDEX, }); - await sloApi.create({ - id: 'my-custom-id', - name: 'my custom name', - description: 'my custom description', - indicator: { - type: 'sli.kql.custom', - params: { - index: DATA_VIEW, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + await sloApi.create( + { + id: 'my-custom-id', + name: 'my custom name', + description: 'my custom description', + indicator: { + type: 'sli.kql.custom', + params: { + index: DATA_VIEW, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: '*', }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: '*', - }); + roleAuthc + ); const dependencyRule = await alertingApi.createRule({ roleAuthc, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/cases/find_cases.ts b/x-pack/test_serverless/api_integration/test_suites/observability/cases/find_cases.ts index c28247b3cea0b5..e18c8fd55ba7b1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/cases/find_cases.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/cases/find_cases.ts @@ -5,19 +5,28 @@ * 2.0. */ +import { CasePostRequest } from '@kbn/cases-plugin/common/types/api'; import expect from '@kbn/expect'; +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); let findCasesResp: any; - let postCaseReq: any; + let postCaseReq: CasePostRequest; describe('find_cases', () => { + let roleAuthc: RoleCredentials; before(async () => { findCasesResp = svlCases.api.getFindCasesResp(); postCaseReq = svlCases.api.getPostCaseReq('observability'); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); afterEach(async () => { @@ -25,16 +34,16 @@ export default ({ getService }: FtrProviderContext): void => { }); it('should return empty response', async () => { - const cases = await svlCases.api.findCases({}); + const cases = await svlCases.api.findCases({}, roleAuthc); expect(cases).to.eql(findCasesResp); }); it('should return cases', async () => { - const a = await svlCases.api.createCase(postCaseReq); - const b = await svlCases.api.createCase(postCaseReq); - const c = await svlCases.api.createCase(postCaseReq); + const a = await svlCases.api.createCase(postCaseReq, roleAuthc); + const b = await svlCases.api.createCase(postCaseReq, roleAuthc); + const c = await svlCases.api.createCase(postCaseReq, roleAuthc); - const cases = await svlCases.api.findCases({}); + const cases = await svlCases.api.findCases({}, roleAuthc); expect(cases).to.eql({ ...findCasesResp, @@ -45,14 +54,22 @@ export default ({ getService }: FtrProviderContext): void => { }); it('returns empty response when trying to find cases with owner as cases', async () => { - const cases = await svlCases.api.findCases({ query: { owner: 'cases' } }); + const cases = await svlCases.api.findCases( + { + query: { owner: 'cases' }, + }, + roleAuthc + ); expect(cases).to.eql(findCasesResp); }); it('returns empty response when trying to find cases with owner as securitySolution', async () => { - const cases = await svlCases.api.findCases({ - query: { owner: 'securitySolution' }, - }); + const cases = await svlCases.api.findCases( + { + query: { owner: 'securitySolution' }, + }, + roleAuthc + ); expect(cases).to.eql(findCasesResp); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/cases/get_case.ts b/x-pack/test_serverless/api_integration/test_suites/observability/cases/get_case.ts index 30fbe518085cb3..717d02715f3ba2 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/cases/get_case.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/cases/get_case.ts @@ -6,28 +6,47 @@ */ import expect from '@kbn/expect'; - +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); describe('get_case', () => { + let roleAuthc: RoleCredentials; + + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + afterEach(async () => { await svlCases.api.deleteCases(); }); it('should return a case', async () => { const postedCase = await svlCases.api.createCase( - svlCases.api.getPostCaseRequest('observability') + svlCases.api.getPostCaseRequest('observability'), + roleAuthc ); - const theCase = await svlCases.api.getCase({ - caseId: postedCase.id, - includeComments: true, - }); + const theCase = await svlCases.api.getCase( + { + caseId: postedCase.id, + includeComments: true, + }, + roleAuthc + ); + + const { created_by: createdBy, ...data } = + svlCases.omit.removeServerGeneratedPropertiesFromCase(theCase); + const { created_by: _, ...expectedData } = svlCases.api.postCaseResp('observability'); - const data = svlCases.omit.removeServerGeneratedPropertiesFromCase(theCase); - expect(data).to.eql(svlCases.api.postCaseResp('observability')); + expect(data).to.eql(expectedData); + expect(createdBy).to.have.keys('full_name', 'email', 'username'); expect(data.comments?.length).to.eql(0); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/cases/post_case.ts b/x-pack/test_serverless/api_integration/test_suites/observability/cases/post_case.ts index 79f180a5092ff9..ccc1d5f79aee2a 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/cases/post_case.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/cases/post_case.ts @@ -7,13 +7,24 @@ import expect from '@kbn/expect'; import { ConnectorTypes } from '@kbn/cases-plugin/common/types/domain'; - +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); describe('post_case', () => { + let roleAuthc: RoleCredentials; + + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + afterEach(async () => { await svlCases.api.deleteCases(); }); @@ -29,6 +40,7 @@ export default ({ getService }: FtrProviderContext): void => { fields: { issueType: 'Task', priority: 'High', parent: null }, }, }), + roleAuthc, 200 ) ); @@ -40,6 +52,7 @@ export default ({ getService }: FtrProviderContext): void => { svlCases.api.getPostCaseRequest('observability', { owner: 'securitySolution', }), + roleAuthc, 403 ) ); @@ -51,6 +64,7 @@ export default ({ getService }: FtrProviderContext): void => { svlCases.api.getPostCaseRequest('observability', { owner: 'cases', }), + roleAuthc, 403 ) ); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts index 4a1e97c83cb27c..e0f207ef2ee946 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_fired.ts @@ -13,10 +13,11 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { omit } from 'lodash'; import { COMPARATORS } from '@kbn/alerting-comparators'; +import { kbnTestConfig } from '@kbn/test'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; -import { RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -25,8 +26,10 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const logger = getService('log'); + const svlCommonApi = getService('svlCommonApi'); const svlUserManager = getService('svlUserManager'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - AVG - PCT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -42,6 +45,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -71,14 +75,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -234,9 +232,10 @@ export default function ({ getService }: FtrProviderContext) { docCountTarget: 1, }); + const { protocol, hostname, port } = kbnTestConfig.getUrlParts(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `http://localhost:5620/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( `Average system.cpu.user.pct is 250%, above the threshold of 50%. (duration: 5 mins, data view: ${DATA_VIEW_NAME})` diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts index 333c34f68ab4d1..90d6c5f29f7997 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/avg_pct_no_data.ts @@ -12,10 +12,11 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { omit } from 'lodash'; import { COMPARATORS } from '@kbn/alerting-comparators'; +import { kbnTestConfig } from '@kbn/test'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; -import { RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -24,7 +25,9 @@ export default function ({ getService }: FtrProviderContext) { const dataViewApi = getService('dataViewApi'); const esDeleteAllIndices = getService('esDeleteAllIndices'); const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - AVG - PCT - NoData', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -38,6 +41,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); await dataViewApi.create({ name: DATA_VIEW_NAME, id: DATA_VIEW_ID, @@ -46,14 +50,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -210,9 +208,10 @@ export default function ({ getService }: FtrProviderContext) { docCountTarget: 1, }); + const { protocol, hostname, port } = kbnTestConfig.getUrlParts(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `http://localhost:5620/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( 'Average system.cpu.user.pct reported no data in the last 5m' diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts index 1fc2bab9afa409..53f39bdec4319d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/custom_eq_avg_bytes_fired.ts @@ -17,7 +17,8 @@ import { COMPARATORS } from '@kbn/alerting-comparators'; import { FIRED_ACTIONS_ID } from '@kbn/observability-plugin/server/lib/rules/custom_threshold/constants'; import expect from '@kbn/expect'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; -import { RoleCredentials } from '../../../../shared/services'; +import { kbnTestConfig } from '@kbn/test'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ActionDocument } from './typings'; @@ -29,7 +30,9 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - CUSTOM_EQ - AVG - BYTES - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -44,6 +47,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -74,14 +78,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -241,9 +239,10 @@ export default function ({ getService }: FtrProviderContext) { docCountTarget: 1, }); + const { protocol, hostname, port } = kbnTestConfig.getUrlParts(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `http://localhost:5620/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( `Custom equation is 1 B, above the threshold of 0.9 B. (duration: 1 min, data view: ${DATA_VIEW})` diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts index 84f1d74527fdf5..de32e95f1a939c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/documents_count_fired.ts @@ -13,10 +13,11 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { omit } from 'lodash'; import { COMPARATORS } from '@kbn/alerting-comparators'; +import { kbnTestConfig } from '@kbn/test'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; -import { RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -26,7 +27,9 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - DOCUMENTS_COUNT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -42,6 +45,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -75,14 +79,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -239,9 +237,11 @@ export default function ({ getService }: FtrProviderContext) { docCountTarget: 1, }); + const { protocol, hostname, port } = kbnTestConfig.getUrlParts(); + expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `http://localhost:5620/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts index 59c9e393df9565..7caf393c3dbd3d 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/group_by_fired.ts @@ -20,7 +20,7 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { COMPARATORS } from '@kbn/alerting-comparators'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ActionDocument } from './typings'; -import { RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -29,9 +29,11 @@ export default function ({ getService }: FtrProviderContext) { const logger = getService('log'); const alertingApi = getService('alertingApi'); const dataViewApi = getService('dataViewApi'); - let alertId: string; const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + let alertId: string; let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - GROUP_BY - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -45,6 +47,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -75,14 +78,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -123,7 +120,11 @@ export default function ({ getService }: FtrProviderContext) { timeSize: 1, timeUnit: 'm', metrics: [ - { name: 'A', field: 'system.cpu.total.norm.pct', aggType: Aggregators.AVERAGE }, + { + name: 'A', + field: 'system.cpu.total.norm.pct', + aggType: Aggregators.AVERAGE, + }, ], }, ], @@ -265,7 +266,7 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `${protocol}://${hostname}:${port}/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( `Average system.cpu.total.norm.pct is 80%, above or equal the threshold of 20%. (duration: 1 min, data view: ${DATA_VIEW}, group: host-0,container-0)` diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts index aa00aa6a7b0a6b..461654677ef137 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/custom_threshold_rule/p99_pct_fired.ts @@ -13,10 +13,11 @@ import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { parseSearchParams } from '@kbn/share-plugin/common/url_service'; import { omit } from 'lodash'; import { COMPARATORS } from '@kbn/alerting-comparators'; +import { kbnTestConfig } from '@kbn/test'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { ISO_DATE_REGEX } from './constants'; import { ActionDocument, LogsExplorerLocatorParsedParams } from './typings'; -import { RoleCredentials } from '../../../../shared/services'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); @@ -25,7 +26,9 @@ export default function ({ getService }: FtrProviderContext) { const alertingApi = getService('alertingApi'); const logger = getService('log'); const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; describe('Custom Threshold rule - P99 - PCT - FIRED', () => { const CUSTOM_THRESHOLD_RULE_ALERT_INDEX = '.alerts-observability.threshold.alerts-default'; @@ -52,6 +55,7 @@ export default function ({ getService }: FtrProviderContext) { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); dataForgeConfig = { schedule: [ { @@ -77,14 +81,8 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); await esClient.deleteByQuery({ index: CUSTOM_THRESHOLD_RULE_ALERT_INDEX, query: { term: { 'kibana.alert.rule.uuid': ruleId } }, @@ -238,9 +236,10 @@ export default function ({ getService }: FtrProviderContext) { docCountTarget: 1, }); + const { protocol, hostname, port } = kbnTestConfig.getUrlParts(); expect(resp.hits.hits[0]._source?.ruleType).eql('observability.rules.custom_threshold'); expect(resp.hits.hits[0]._source?.alertDetailsUrl).eql( - `http://localhost:5620/app/observability/alerts/${alertId}` + `${protocol}://${hostname}${port ? `:${port}` : ''}/app/observability/alerts/${alertId}` ); expect(resp.hits.hits[0]._source?.reason).eql( `99th percentile of system.cpu.user.pct is 250%, above the threshold of 50%. (duration: 5 mins, data view: ${DATA_VIEW_NAME})` diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts index f1d746b49ff069..83aec6feb343d6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/common/dataset_quality_api_supertest.ts @@ -11,6 +11,7 @@ import type { APIClientRequestParamsOf, APIReturnType } from '@kbn/dataset-quali import { Config, kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; import type { APIEndpoint } from '@kbn/dataset-quality-plugin/server/routes'; import { formatRequest } from '@kbn/server-route-repository'; +import { InternalRequestHeader, RoleCredentials } from '../../../../../shared/services'; import { InheritedFtrProviderContext } from '../../../../services'; export function createDatasetQualityApiClient(st: supertest.Agent) { @@ -18,20 +19,18 @@ export function createDatasetQualityApiClient(st: supertest.Agent) { options: { type?: 'form-data'; endpoint: TEndpoint; + roleAuthc: RoleCredentials; + internalReqHeader: InternalRequestHeader; } & APIClientRequestParamsOf & { params?: { query?: { _inspect?: boolean } } } ): Promise> => { - const { endpoint, type } = options; + const { endpoint, type, internalReqHeader, roleAuthc } = options; const params = 'params' in options ? (options.params as Record) : {}; const { method, pathname, version } = formatRequest(endpoint, params.path); const url = format({ pathname, query: params?.query }); - const headers: Record = { - 'kbn-xsrf': 'foo', - 'x-elastic-internal-origin': 'foo', - }; - + const headers: Record = { ...internalReqHeader, ...roleAuthc.apiKeyHeader }; if (version) { headers['Elastic-Api-Version'] = version; } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts index 1a4db10f140dc3..563e3d53afd692 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_details.ts @@ -7,6 +7,7 @@ import { log, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { expectToReject } from './utils'; import { DatasetQualityApiClient, @@ -17,6 +18,8 @@ import { DatasetQualityFtrContextProvider } from './common/services'; export default function ({ getService }: DatasetQualityFtrContextProvider) { const datasetQualityApiClient: DatasetQualityApiClient = getService('datasetQualityApiClient'); const synthtrace = getService('logSynthtraceEsClient'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); const start = '2023-12-11T18:00:00.000Z'; const end = '2023-12-11T18:01:00.000Z'; const type = 'logs'; @@ -25,7 +28,11 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { const serviceName = 'my-service'; const hostName = 'synth-host'; - async function callApi(dataStream: string) { + async function callApi( + dataStream: string, + roleAuthc: RoleCredentials, + internalReqHeader: InternalRequestHeader + ) { return await datasetQualityApiClient.slsUser({ endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/details', params: { @@ -37,12 +44,19 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { end, }, }, + roleAuthc, + internalReqHeader, }); } describe('gets the data stream details', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + before(async () => { - await synthtrace.index([ + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + return synthtrace.index([ timerange(start, end) .interval('1m') .rate(1) @@ -61,11 +75,14 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { ), ]); }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('returns error when dataStream param is not provided', async () => { const expectedMessage = 'Data Stream name cannot be empty'; const err = await expectToReject(() => - callApi(encodeURIComponent(' ')) + callApi(encodeURIComponent(' '), roleAuthc, internalReqHeader) ); expect(err.res.status).to.be(400); expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); @@ -74,17 +91,17 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { it('returns {} if matching data stream is not available', async () => { const nonExistentDataSet = 'Non-existent'; const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApi(nonExistentDataStream); + const resp = await callApi(nonExistentDataStream, roleAuthc, internalReqHeader); expect(resp.body).empty(); }); it('returns "sizeBytes" as null in serverless', async () => { - const resp = await callApi(`${type}-${dataset}-${namespace}`); + const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); expect(resp.body.sizeBytes).to.be(null); }); it('returns service.name and host.name correctly', async () => { - const resp = await callApi(`${type}-${dataset}-${namespace}`); + const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); expect(resp.body.services).to.eql({ ['service.name']: [serviceName] }); expect(resp.body.hosts?.['host.name']).to.eql([hostName]); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts index a0ea813a839312..5c99f690abf8e6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/dataset_quality_api_integration/data_stream_settings.ts @@ -7,6 +7,7 @@ import { log, timerange } from '@kbn/apm-synthtrace-client'; import expect from '@kbn/expect'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { expectToReject, getDataStreamSettingsOfEarliestIndex, rolloverDataStream } from './utils'; import { DatasetQualityApiClient, @@ -17,6 +18,8 @@ import { DatasetQualityFtrContextProvider } from './common/services'; export default function ({ getService }: DatasetQualityFtrContextProvider) { const datasetQualityApiClient: DatasetQualityApiClient = getService('datasetQualityApiClient'); const synthtrace = getService('logSynthtraceEsClient'); + const svlCommonApi = getService('svlCommonApi'); + const svlUserManager = getService('svlUserManager'); const esClient = getService('es'); const start = '2023-12-11T18:00:00.000Z'; const end = '2023-12-11T18:01:00.000Z'; @@ -26,7 +29,11 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { const serviceName = 'my-service'; const hostName = 'synth-host'; - async function callApi(dataStream: string) { + async function callApi( + dataStream: string, + roleAuthc: RoleCredentials, + internalReqHeader: InternalRequestHeader + ) { return await datasetQualityApiClient.slsUser({ endpoint: 'GET /internal/dataset_quality/data_streams/{dataStream}/settings', params: { @@ -34,12 +41,18 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { dataStream, }, }, + roleAuthc, + internalReqHeader, }); } describe('gets the data stream settings', () => { + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; before(async () => { - await synthtrace.index([ + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + return synthtrace.index([ timerange(start, end) .interval('1m') .rate(1) @@ -59,10 +72,14 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { ]); }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); + it('returns error when dataStream param is not provided', async () => { const expectedMessage = 'Data Stream name cannot be empty'; const err = await expectToReject(() => - callApi(encodeURIComponent(' ')) + callApi(encodeURIComponent(' '), roleAuthc, internalReqHeader) ); expect(err.res.status).to.be(400); expect(err.res.body.message.indexOf(expectedMessage)).to.greaterThan(-1); @@ -71,7 +88,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { it('returns {} if matching data stream is not available', async () => { const nonExistentDataSet = 'Non-existent'; const nonExistentDataStream = `${type}-${nonExistentDataSet}-${namespace}`; - const resp = await callApi(nonExistentDataStream); + const resp = await callApi(nonExistentDataStream, roleAuthc, internalReqHeader); expect(resp.body).empty(); }); @@ -80,7 +97,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { esClient, `${type}-${dataset}-${namespace}` ); - const resp = await callApi(`${type}-${dataset}-${namespace}`); + const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); }); @@ -90,7 +107,7 @@ export default function ({ getService }: DatasetQualityFtrContextProvider) { esClient, `${type}-${dataset}-${namespace}` ); - const resp = await callApi(`${type}-${dataset}-${namespace}`); + const resp = await callApi(`${type}-${dataset}-${namespace}`, roleAuthc, internalReqHeader); expect(resp.body.createdOn).to.be(Number(dataStreamSettings?.index?.creation_date)); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts index b473f62c4f108a..c7afd2ff5a165f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/es_query_rule/es_query_rule.ts @@ -38,14 +38,9 @@ export default function ({ getService }: FtrProviderContext) { }); after(async () => { - await supertest - .delete(`/api/alerting/rule/${ruleId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); - await supertest - .delete(`/api/actions/connector/${actionId}`) - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + await supertest.delete(`/api/alerting/rule/${ruleId}`).set(internalReqHeader); + await supertest.delete(`/api/actions/connector/${actionId}`).set(internalReqHeader); + await esClient.deleteByQuery({ index: '.kibana-event-log-*', query: { term: { 'rule.id': ruleId } }, diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/fleet/fleet.ts b/x-pack/test_serverless/api_integration/test_suites/observability/fleet/fleet.ts index 547d16399bdab9..85cd638bdde5bb 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/fleet/fleet.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/fleet/fleet.ts @@ -6,6 +6,7 @@ */ import expect from 'expect'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { expectDefaultElasticsearchOutput, @@ -14,24 +15,35 @@ import { export default function (ctx: FtrProviderContext) { const svlCommonApi = ctx.getService('svlCommonApi'); - const supertest = ctx.getService('supertest'); + const svlUserManager = ctx.getService('svlUserManager'); + const supertestWithoutAuth = ctx.getService('supertestWithoutAuth'); describe('fleet', function () { let defaultFleetServerHostUrl: string = ''; let defaultEsOutputUrl: string = ''; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; before(async () => { + internalReqHeader = svlCommonApi.getInternalRequestHeader(); defaultFleetServerHostUrl = await expectDefaultFleetServer(ctx); expect(defaultFleetServerHostUrl).not.toBe(''); defaultEsOutputUrl = await expectDefaultElasticsearchOutput(ctx); expect(defaultEsOutputUrl).not.toBe(''); + + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); it('rejects request to create a new fleet server hosts if host url is different from default', async () => { - const { body, status } = await supertest + const { body, status } = await supertestWithoutAuth .post('/api/fleet/fleet_server_hosts') - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'test', host_urls: ['https://localhost:8221'], @@ -47,9 +59,10 @@ export default function (ctx: FtrProviderContext) { }); it('accepts request to create a new fleet server hosts if host url is same as default', async () => { - const { body, status } = await supertest + const { body, status } = await supertestWithoutAuth .post('/api/fleet/fleet_server_hosts') - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'Test Fleet server host', host_urls: [defaultFleetServerHostUrl], @@ -65,9 +78,10 @@ export default function (ctx: FtrProviderContext) { }); it('rejects request to create a new elasticsearch output if host is different from default', async () => { - const { body, status } = await supertest + const { body, status } = await supertestWithoutAuth .post('/api/fleet/outputs') - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'Test output', type: 'elasticsearch', @@ -83,9 +97,10 @@ export default function (ctx: FtrProviderContext) { }); it('accepts request to create a new elasticsearch output if host url is same as default', async () => { - const { body, status } = await supertest + const { body, status } = await supertestWithoutAuth .post('/api/fleet/outputs') - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .send({ name: 'Test output', type: 'elasticsearch', diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts index c6257df072d853..dfd398fc360d0f 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.feature_flags.ts @@ -11,6 +11,7 @@ export default function ({ loadTestFile }: FtrProviderContext) { describe('Serverless observability API - feature flags', function () { loadTestFile(require.resolve('./custom_threshold_rule')); loadTestFile(require.resolve('./infra')); + loadTestFile(require.resolve('./platform_security')); loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/infra/infra.ts b/x-pack/test_serverless/api_integration/test_suites/observability/infra/infra.ts index d6fad63b9751b8..78b385ba301e1c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/infra/infra.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/infra/infra.ts @@ -10,8 +10,7 @@ import type { GetInfraMetricsRequestBodyPayload, GetInfraMetricsResponsePayload, } from '@kbn/infra-plugin/common/http_api'; - -import { kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { RoleCredentials } from '../../../../shared/services'; import type { FtrProviderContext } from '../../../ftr_provider_context'; import { DATES, ARCHIVE_NAME } from './constants'; @@ -23,67 +22,77 @@ const timeRange = { export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); - const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username || ''; - const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password || ''; + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); const fetchInfraHosts = async ( - body: GetInfraMetricsRequestBodyPayload + body: GetInfraMetricsRequestBodyPayload, + roleAuthc: RoleCredentials ): Promise => { - const response = await supertest + const response = await supertestWithoutAuth .post('/api/metrics/infra') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .auth(username, password) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(body) .expect(200); return response.body; }; describe('API /metrics/infra', () => { + let roleAuthc: RoleCredentials; describe('works', () => { describe('with host asset', () => { - before(async () => esArchiver.load(ARCHIVE_NAME)); - after(async () => esArchiver.unload(ARCHIVE_NAME)); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + return esArchiver.load(ARCHIVE_NAME); + }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + return esArchiver.unload(ARCHIVE_NAME); + }); it('received data', async () => { - const infraHosts = await fetchInfraHosts({ - type: 'host', - limit: 100, - metrics: [ - { - type: 'rx', - }, - { - type: 'tx', - }, - { - type: 'memory', - }, - { - type: 'cpu', - }, - { - type: 'diskSpaceUsage', - }, - { - type: 'memoryFree', + const infraHosts = await fetchInfraHosts( + { + type: 'host', + limit: 100, + metrics: [ + { + type: 'rx', + }, + { + type: 'tx', + }, + { + type: 'memory', + }, + { + type: 'cpu', + }, + { + type: 'diskSpaceUsage', + }, + { + type: 'memoryFree', + }, + ], + query: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, }, - ], - query: { - bool: { - must: [], - filter: [], - should: [], - must_not: [], + range: { + from: timeRange.from, + to: timeRange.to, }, + sourceId: 'default', }, - range: { - from: timeRange.from, - to: timeRange.to, - }, - sourceId: 'default', - }); + roleAuthc + ); if (infraHosts) { const { nodes } = infraHosts; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/infra/metadata.ts b/x-pack/test_serverless/api_integration/test_suites/observability/infra/metadata.ts index 4b21967d6460e1..b711674ebb95eb 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/infra/metadata.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/infra/metadata.ts @@ -10,7 +10,7 @@ import type { InfraMetadata, InfraMetadataRequest, } from '@kbn/infra-plugin/common/http_api/metadata_api'; -import { kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { RoleCredentials } from '../../../../shared/services'; import type { FtrProviderContext } from '../../../ftr_provider_context'; import { DATES, ARCHIVE_NAME } from './constants'; @@ -22,34 +22,45 @@ const timeRange = { export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); - const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username || ''; - const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password || ''; + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); - const fetchMetadata = async (body: InfraMetadataRequest): Promise => { - const response = await supertest + const fetchMetadata = async ( + body: InfraMetadataRequest, + roleAuthc: RoleCredentials + ): Promise => { + const response = await supertestWithoutAuth .post('/api/infra/metadata') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .auth(username, password) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(body) .expect(200); return response.body; }; describe('API /infra/metadata', () => { + let roleAuthc: RoleCredentials; describe('works', () => { describe('Host asset type', () => { - before(async () => esArchiver.load(ARCHIVE_NAME)); - after(async () => esArchiver.unload(ARCHIVE_NAME)); - + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + await esArchiver.load(ARCHIVE_NAME); + }); + after(async () => { + await esArchiver.unload(ARCHIVE_NAME); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('with serverless existing host', async () => { - const metadata = await fetchMetadata({ - sourceId: 'default', - nodeId: 'serverless-host', - nodeType: 'host', - timeRange, - }); + const metadata = await fetchMetadata( + { + sourceId: 'default', + nodeId: 'serverless-host', + nodeType: 'host', + timeRange, + }, + roleAuthc + ); if (metadata) { expect(metadata.features.length).to.be(4); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/infra/processes.ts b/x-pack/test_serverless/api_integration/test_suites/observability/infra/processes.ts index 14e072fb038979..e6f490ec4bfae5 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/infra/processes.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/infra/processes.ts @@ -11,27 +11,33 @@ import { ProcessListAPIResponseRT, } from '@kbn/infra-plugin/common/http_api/host_details/process_list'; import { decodeOrThrow } from '@kbn/infra-plugin/common/runtime_types'; -import { kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { RoleCredentials } from '../../../../shared/services'; + import type { FtrProviderContext } from '../../../ftr_provider_context'; import { DATES, ARCHIVE_NAME } from './constants'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); describe('API /metrics/process_list', () => { - const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username || ''; - const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password || ''; - - before(async () => esArchiver.load(ARCHIVE_NAME)); - after(async () => esArchiver.unload(ARCHIVE_NAME)); + let roleAuthc: RoleCredentials; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + await esArchiver.load(ARCHIVE_NAME); + }); + after(async () => { + await esArchiver.unload(ARCHIVE_NAME); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('works', async () => { - const response = await supertest + const response = await supertestWithoutAuth .post('/api/metrics/process_list') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .auth(username, password) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send( ProcessListAPIRequestRT.encode({ hostTerm: { diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/infra/snapshot.ts b/x-pack/test_serverless/api_integration/test_suites/observability/infra/snapshot.ts index ff6d5a5a4785e7..1b3d5ba899b1ea 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/infra/snapshot.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/infra/snapshot.ts @@ -10,48 +10,60 @@ import type { SnapshotNodeResponse, SnapshotRequest, } from '@kbn/infra-plugin/common/http_api/snapshot_api'; -import { kbnTestConfig, kibanaTestSuperuserServerless } from '@kbn/test'; +import type { RoleCredentials } from '../../../../shared/services'; import type { FtrProviderContext } from '../../../ftr_provider_context'; import { DATES, ARCHIVE_NAME } from './constants'; export default function ({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); - const supertest = getService('supertest'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const fetchSnapshot = async ( - body: SnapshotRequest + body: SnapshotRequest, + roleAuthc: RoleCredentials ): Promise => { - const username = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).username || ''; - const password = kbnTestConfig.getUrlParts(kibanaTestSuperuserServerless).password || ''; - const response = await supertest + const response = await supertestWithoutAuth .post('/api/metrics/snapshot') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo') - .auth(username, password) + .set(svlCommonApi.getInternalRequestHeader()) + .set(roleAuthc.apiKeyHeader) .send(body) .expect(200); return response.body; }; describe('API /metrics/snapshot', () => { + let roleAuthc: RoleCredentials; + describe('Snapshot nodes', () => { const { min, max } = DATES.serverlessTestingHost; - before(async () => esArchiver.load(ARCHIVE_NAME)); - after(async () => esArchiver.unload(ARCHIVE_NAME)); + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + await esArchiver.load(ARCHIVE_NAME); + }); + after(async () => { + await esArchiver.unload(ARCHIVE_NAME); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('should work', async () => { - const snapshot = await fetchSnapshot({ - sourceId: 'default', - timerange: { - to: max, - from: min, - interval: '10m', + const snapshot = await fetchSnapshot( + { + sourceId: 'default', + timerange: { + to: max, + from: min, + interval: '10m', + }, + metrics: [{ type: 'cpu' }], + nodeType: 'host', + groupBy: [], + includeTimeseries: false, }, - metrics: [{ type: 'cpu' }], - nodeType: 'host', - groupBy: [], - includeTimeseries: false, - }); + roleAuthc + ); if (!snapshot) { return; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts new file mode 100644 index 00000000000000..25bdff734e3792 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/authorization.ts @@ -0,0 +1,9585 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const svlCommonApi = getService('svlCommonApi'); + + describe('security/authorization', function () { + describe('available features', () => { + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let adminCredentials: { Cookie: string }; + + before(async () => { + // get auth header for Viewer role + adminCredentials = await svlUserManager.getApiCredentialsForRole('admin'); + }); + + it('composite features', async () => { + const { body } = await supertestWithoutAuth + .get('/api/security/privileges?includeActions=true') + .set(svlCommonApi.getInternalRequestHeader()) + .set(adminCredentials) + .expect(200); + + // The following features are composed of other features in a way that is + // specific to the observability solution. + const compositeFeatureIds = [ + 'apm', + 'dashboard', + 'discover', + 'fleetv2', + 'infrastructure', + 'reporting', + 'slo', + 'uptime', + ]; + + const features = Object.fromEntries( + Object.entries(body.features).filter(([key]) => compositeFeatureIds.includes(key)) + ); + expectSnapshot(features).toMatchInline(` + Object { + "apm": Object { + "all": Array [ + "login:", + "api:apm", + "api:apm_write", + "api:rac", + "app:apm", + "app:ux", + "app:kibana", + "ui:catalogue/apm", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/apm", + "ui:navLinks/ux", + "ui:navLinks/kibana", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:apm-indices/bulk_get", + "saved_object:apm-indices/get", + "saved_object:apm-indices/find", + "saved_object:apm-indices/open_point_in_time", + "saved_object:apm-indices/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:apm/show", + "ui:apm/save", + "ui:apm/alerting:show", + "ui:apm/alerting:save", + "alerting:apm.error_rate/apm/rule/get", + "alerting:apm.error_rate/apm/rule/getRuleState", + "alerting:apm.error_rate/apm/rule/getAlertSummary", + "alerting:apm.error_rate/apm/rule/getExecutionLog", + "alerting:apm.error_rate/apm/rule/getActionErrorLog", + "alerting:apm.error_rate/apm/rule/find", + "alerting:apm.error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/apm/rule/getBackfill", + "alerting:apm.error_rate/apm/rule/findBackfill", + "alerting:apm.error_rate/apm/rule/create", + "alerting:apm.error_rate/apm/rule/delete", + "alerting:apm.error_rate/apm/rule/update", + "alerting:apm.error_rate/apm/rule/updateApiKey", + "alerting:apm.error_rate/apm/rule/enable", + "alerting:apm.error_rate/apm/rule/disable", + "alerting:apm.error_rate/apm/rule/muteAll", + "alerting:apm.error_rate/apm/rule/unmuteAll", + "alerting:apm.error_rate/apm/rule/muteAlert", + "alerting:apm.error_rate/apm/rule/unmuteAlert", + "alerting:apm.error_rate/apm/rule/snooze", + "alerting:apm.error_rate/apm/rule/bulkEdit", + "alerting:apm.error_rate/apm/rule/bulkDelete", + "alerting:apm.error_rate/apm/rule/bulkEnable", + "alerting:apm.error_rate/apm/rule/bulkDisable", + "alerting:apm.error_rate/apm/rule/unsnooze", + "alerting:apm.error_rate/apm/rule/runSoon", + "alerting:apm.error_rate/apm/rule/scheduleBackfill", + "alerting:apm.error_rate/apm/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/apm/rule/get", + "alerting:apm.transaction_error_rate/apm/rule/getRuleState", + "alerting:apm.transaction_error_rate/apm/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/apm/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/apm/rule/find", + "alerting:apm.transaction_error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/apm/rule/getBackfill", + "alerting:apm.transaction_error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_error_rate/apm/rule/create", + "alerting:apm.transaction_error_rate/apm/rule/delete", + "alerting:apm.transaction_error_rate/apm/rule/update", + "alerting:apm.transaction_error_rate/apm/rule/updateApiKey", + "alerting:apm.transaction_error_rate/apm/rule/enable", + "alerting:apm.transaction_error_rate/apm/rule/disable", + "alerting:apm.transaction_error_rate/apm/rule/muteAll", + "alerting:apm.transaction_error_rate/apm/rule/unmuteAll", + "alerting:apm.transaction_error_rate/apm/rule/muteAlert", + "alerting:apm.transaction_error_rate/apm/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/apm/rule/snooze", + "alerting:apm.transaction_error_rate/apm/rule/bulkEdit", + "alerting:apm.transaction_error_rate/apm/rule/bulkDelete", + "alerting:apm.transaction_error_rate/apm/rule/bulkEnable", + "alerting:apm.transaction_error_rate/apm/rule/bulkDisable", + "alerting:apm.transaction_error_rate/apm/rule/unsnooze", + "alerting:apm.transaction_error_rate/apm/rule/runSoon", + "alerting:apm.transaction_error_rate/apm/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/apm/rule/deleteBackfill", + "alerting:apm.transaction_duration/apm/rule/get", + "alerting:apm.transaction_duration/apm/rule/getRuleState", + "alerting:apm.transaction_duration/apm/rule/getAlertSummary", + "alerting:apm.transaction_duration/apm/rule/getExecutionLog", + "alerting:apm.transaction_duration/apm/rule/getActionErrorLog", + "alerting:apm.transaction_duration/apm/rule/find", + "alerting:apm.transaction_duration/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/apm/rule/getBackfill", + "alerting:apm.transaction_duration/apm/rule/findBackfill", + "alerting:apm.transaction_duration/apm/rule/create", + "alerting:apm.transaction_duration/apm/rule/delete", + "alerting:apm.transaction_duration/apm/rule/update", + "alerting:apm.transaction_duration/apm/rule/updateApiKey", + "alerting:apm.transaction_duration/apm/rule/enable", + "alerting:apm.transaction_duration/apm/rule/disable", + "alerting:apm.transaction_duration/apm/rule/muteAll", + "alerting:apm.transaction_duration/apm/rule/unmuteAll", + "alerting:apm.transaction_duration/apm/rule/muteAlert", + "alerting:apm.transaction_duration/apm/rule/unmuteAlert", + "alerting:apm.transaction_duration/apm/rule/snooze", + "alerting:apm.transaction_duration/apm/rule/bulkEdit", + "alerting:apm.transaction_duration/apm/rule/bulkDelete", + "alerting:apm.transaction_duration/apm/rule/bulkEnable", + "alerting:apm.transaction_duration/apm/rule/bulkDisable", + "alerting:apm.transaction_duration/apm/rule/unsnooze", + "alerting:apm.transaction_duration/apm/rule/runSoon", + "alerting:apm.transaction_duration/apm/rule/scheduleBackfill", + "alerting:apm.transaction_duration/apm/rule/deleteBackfill", + "alerting:apm.anomaly/apm/rule/get", + "alerting:apm.anomaly/apm/rule/getRuleState", + "alerting:apm.anomaly/apm/rule/getAlertSummary", + "alerting:apm.anomaly/apm/rule/getExecutionLog", + "alerting:apm.anomaly/apm/rule/getActionErrorLog", + "alerting:apm.anomaly/apm/rule/find", + "alerting:apm.anomaly/apm/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/apm/rule/getBackfill", + "alerting:apm.anomaly/apm/rule/findBackfill", + "alerting:apm.anomaly/apm/rule/create", + "alerting:apm.anomaly/apm/rule/delete", + "alerting:apm.anomaly/apm/rule/update", + "alerting:apm.anomaly/apm/rule/updateApiKey", + "alerting:apm.anomaly/apm/rule/enable", + "alerting:apm.anomaly/apm/rule/disable", + "alerting:apm.anomaly/apm/rule/muteAll", + "alerting:apm.anomaly/apm/rule/unmuteAll", + "alerting:apm.anomaly/apm/rule/muteAlert", + "alerting:apm.anomaly/apm/rule/unmuteAlert", + "alerting:apm.anomaly/apm/rule/snooze", + "alerting:apm.anomaly/apm/rule/bulkEdit", + "alerting:apm.anomaly/apm/rule/bulkDelete", + "alerting:apm.anomaly/apm/rule/bulkEnable", + "alerting:apm.anomaly/apm/rule/bulkDisable", + "alerting:apm.anomaly/apm/rule/unsnooze", + "alerting:apm.anomaly/apm/rule/runSoon", + "alerting:apm.anomaly/apm/rule/scheduleBackfill", + "alerting:apm.anomaly/apm/rule/deleteBackfill", + "alerting:apm.error_rate/apm/alert/get", + "alerting:apm.error_rate/apm/alert/find", + "alerting:apm.error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/apm/alert/getAlertSummary", + "alerting:apm.error_rate/apm/alert/update", + "alerting:apm.transaction_error_rate/apm/alert/get", + "alerting:apm.transaction_error_rate/apm/alert/find", + "alerting:apm.transaction_error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/alert/update", + "alerting:apm.transaction_duration/apm/alert/get", + "alerting:apm.transaction_duration/apm/alert/find", + "alerting:apm.transaction_duration/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/apm/alert/getAlertSummary", + "alerting:apm.transaction_duration/apm/alert/update", + "alerting:apm.anomaly/apm/alert/get", + "alerting:apm.anomaly/apm/alert/find", + "alerting:apm.anomaly/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/apm/alert/getAlertSummary", + "alerting:apm.anomaly/apm/alert/update", + "api:infra", + "app:infra", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/infra", + "ui:navLinks/logs", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_all": Array [ + "login:", + "api:apm", + "api:apm_write", + "api:rac", + "app:apm", + "app:ux", + "app:kibana", + "ui:catalogue/apm", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/apm", + "ui:navLinks/ux", + "ui:navLinks/kibana", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:apm-indices/bulk_get", + "saved_object:apm-indices/get", + "saved_object:apm-indices/find", + "saved_object:apm-indices/open_point_in_time", + "saved_object:apm-indices/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:apm/show", + "ui:apm/save", + "ui:apm/alerting:show", + "ui:apm/alerting:save", + "alerting:apm.error_rate/apm/rule/get", + "alerting:apm.error_rate/apm/rule/getRuleState", + "alerting:apm.error_rate/apm/rule/getAlertSummary", + "alerting:apm.error_rate/apm/rule/getExecutionLog", + "alerting:apm.error_rate/apm/rule/getActionErrorLog", + "alerting:apm.error_rate/apm/rule/find", + "alerting:apm.error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/apm/rule/getBackfill", + "alerting:apm.error_rate/apm/rule/findBackfill", + "alerting:apm.error_rate/apm/rule/create", + "alerting:apm.error_rate/apm/rule/delete", + "alerting:apm.error_rate/apm/rule/update", + "alerting:apm.error_rate/apm/rule/updateApiKey", + "alerting:apm.error_rate/apm/rule/enable", + "alerting:apm.error_rate/apm/rule/disable", + "alerting:apm.error_rate/apm/rule/muteAll", + "alerting:apm.error_rate/apm/rule/unmuteAll", + "alerting:apm.error_rate/apm/rule/muteAlert", + "alerting:apm.error_rate/apm/rule/unmuteAlert", + "alerting:apm.error_rate/apm/rule/snooze", + "alerting:apm.error_rate/apm/rule/bulkEdit", + "alerting:apm.error_rate/apm/rule/bulkDelete", + "alerting:apm.error_rate/apm/rule/bulkEnable", + "alerting:apm.error_rate/apm/rule/bulkDisable", + "alerting:apm.error_rate/apm/rule/unsnooze", + "alerting:apm.error_rate/apm/rule/runSoon", + "alerting:apm.error_rate/apm/rule/scheduleBackfill", + "alerting:apm.error_rate/apm/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/apm/rule/get", + "alerting:apm.transaction_error_rate/apm/rule/getRuleState", + "alerting:apm.transaction_error_rate/apm/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/apm/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/apm/rule/find", + "alerting:apm.transaction_error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/apm/rule/getBackfill", + "alerting:apm.transaction_error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_error_rate/apm/rule/create", + "alerting:apm.transaction_error_rate/apm/rule/delete", + "alerting:apm.transaction_error_rate/apm/rule/update", + "alerting:apm.transaction_error_rate/apm/rule/updateApiKey", + "alerting:apm.transaction_error_rate/apm/rule/enable", + "alerting:apm.transaction_error_rate/apm/rule/disable", + "alerting:apm.transaction_error_rate/apm/rule/muteAll", + "alerting:apm.transaction_error_rate/apm/rule/unmuteAll", + "alerting:apm.transaction_error_rate/apm/rule/muteAlert", + "alerting:apm.transaction_error_rate/apm/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/apm/rule/snooze", + "alerting:apm.transaction_error_rate/apm/rule/bulkEdit", + "alerting:apm.transaction_error_rate/apm/rule/bulkDelete", + "alerting:apm.transaction_error_rate/apm/rule/bulkEnable", + "alerting:apm.transaction_error_rate/apm/rule/bulkDisable", + "alerting:apm.transaction_error_rate/apm/rule/unsnooze", + "alerting:apm.transaction_error_rate/apm/rule/runSoon", + "alerting:apm.transaction_error_rate/apm/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/apm/rule/deleteBackfill", + "alerting:apm.transaction_duration/apm/rule/get", + "alerting:apm.transaction_duration/apm/rule/getRuleState", + "alerting:apm.transaction_duration/apm/rule/getAlertSummary", + "alerting:apm.transaction_duration/apm/rule/getExecutionLog", + "alerting:apm.transaction_duration/apm/rule/getActionErrorLog", + "alerting:apm.transaction_duration/apm/rule/find", + "alerting:apm.transaction_duration/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/apm/rule/getBackfill", + "alerting:apm.transaction_duration/apm/rule/findBackfill", + "alerting:apm.transaction_duration/apm/rule/create", + "alerting:apm.transaction_duration/apm/rule/delete", + "alerting:apm.transaction_duration/apm/rule/update", + "alerting:apm.transaction_duration/apm/rule/updateApiKey", + "alerting:apm.transaction_duration/apm/rule/enable", + "alerting:apm.transaction_duration/apm/rule/disable", + "alerting:apm.transaction_duration/apm/rule/muteAll", + "alerting:apm.transaction_duration/apm/rule/unmuteAll", + "alerting:apm.transaction_duration/apm/rule/muteAlert", + "alerting:apm.transaction_duration/apm/rule/unmuteAlert", + "alerting:apm.transaction_duration/apm/rule/snooze", + "alerting:apm.transaction_duration/apm/rule/bulkEdit", + "alerting:apm.transaction_duration/apm/rule/bulkDelete", + "alerting:apm.transaction_duration/apm/rule/bulkEnable", + "alerting:apm.transaction_duration/apm/rule/bulkDisable", + "alerting:apm.transaction_duration/apm/rule/unsnooze", + "alerting:apm.transaction_duration/apm/rule/runSoon", + "alerting:apm.transaction_duration/apm/rule/scheduleBackfill", + "alerting:apm.transaction_duration/apm/rule/deleteBackfill", + "alerting:apm.anomaly/apm/rule/get", + "alerting:apm.anomaly/apm/rule/getRuleState", + "alerting:apm.anomaly/apm/rule/getAlertSummary", + "alerting:apm.anomaly/apm/rule/getExecutionLog", + "alerting:apm.anomaly/apm/rule/getActionErrorLog", + "alerting:apm.anomaly/apm/rule/find", + "alerting:apm.anomaly/apm/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/apm/rule/getBackfill", + "alerting:apm.anomaly/apm/rule/findBackfill", + "alerting:apm.anomaly/apm/rule/create", + "alerting:apm.anomaly/apm/rule/delete", + "alerting:apm.anomaly/apm/rule/update", + "alerting:apm.anomaly/apm/rule/updateApiKey", + "alerting:apm.anomaly/apm/rule/enable", + "alerting:apm.anomaly/apm/rule/disable", + "alerting:apm.anomaly/apm/rule/muteAll", + "alerting:apm.anomaly/apm/rule/unmuteAll", + "alerting:apm.anomaly/apm/rule/muteAlert", + "alerting:apm.anomaly/apm/rule/unmuteAlert", + "alerting:apm.anomaly/apm/rule/snooze", + "alerting:apm.anomaly/apm/rule/bulkEdit", + "alerting:apm.anomaly/apm/rule/bulkDelete", + "alerting:apm.anomaly/apm/rule/bulkEnable", + "alerting:apm.anomaly/apm/rule/bulkDisable", + "alerting:apm.anomaly/apm/rule/unsnooze", + "alerting:apm.anomaly/apm/rule/runSoon", + "alerting:apm.anomaly/apm/rule/scheduleBackfill", + "alerting:apm.anomaly/apm/rule/deleteBackfill", + "alerting:apm.error_rate/apm/alert/get", + "alerting:apm.error_rate/apm/alert/find", + "alerting:apm.error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/apm/alert/getAlertSummary", + "alerting:apm.error_rate/apm/alert/update", + "alerting:apm.transaction_error_rate/apm/alert/get", + "alerting:apm.transaction_error_rate/apm/alert/find", + "alerting:apm.transaction_error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/alert/update", + "alerting:apm.transaction_duration/apm/alert/get", + "alerting:apm.transaction_duration/apm/alert/find", + "alerting:apm.transaction_duration/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/apm/alert/getAlertSummary", + "alerting:apm.transaction_duration/apm/alert/update", + "alerting:apm.anomaly/apm/alert/get", + "alerting:apm.anomaly/apm/alert/find", + "alerting:apm.anomaly/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/apm/alert/getAlertSummary", + "alerting:apm.anomaly/apm/alert/update", + "api:infra", + "app:infra", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/infra", + "ui:navLinks/logs", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_read": Array [ + "login:", + "api:apm", + "api:rac", + "app:apm", + "app:ux", + "app:kibana", + "ui:catalogue/apm", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/apm", + "ui:navLinks/ux", + "ui:navLinks/kibana", + "saved_object:apm-indices/bulk_get", + "saved_object:apm-indices/get", + "saved_object:apm-indices/find", + "saved_object:apm-indices/open_point_in_time", + "saved_object:apm-indices/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:apm/show", + "ui:apm/alerting:show", + "alerting:apm.error_rate/apm/rule/get", + "alerting:apm.error_rate/apm/rule/getRuleState", + "alerting:apm.error_rate/apm/rule/getAlertSummary", + "alerting:apm.error_rate/apm/rule/getExecutionLog", + "alerting:apm.error_rate/apm/rule/getActionErrorLog", + "alerting:apm.error_rate/apm/rule/find", + "alerting:apm.error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/apm/rule/getBackfill", + "alerting:apm.error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_error_rate/apm/rule/get", + "alerting:apm.transaction_error_rate/apm/rule/getRuleState", + "alerting:apm.transaction_error_rate/apm/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/apm/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/apm/rule/find", + "alerting:apm.transaction_error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/apm/rule/getBackfill", + "alerting:apm.transaction_error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_duration/apm/rule/get", + "alerting:apm.transaction_duration/apm/rule/getRuleState", + "alerting:apm.transaction_duration/apm/rule/getAlertSummary", + "alerting:apm.transaction_duration/apm/rule/getExecutionLog", + "alerting:apm.transaction_duration/apm/rule/getActionErrorLog", + "alerting:apm.transaction_duration/apm/rule/find", + "alerting:apm.transaction_duration/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/apm/rule/getBackfill", + "alerting:apm.transaction_duration/apm/rule/findBackfill", + "alerting:apm.anomaly/apm/rule/get", + "alerting:apm.anomaly/apm/rule/getRuleState", + "alerting:apm.anomaly/apm/rule/getAlertSummary", + "alerting:apm.anomaly/apm/rule/getExecutionLog", + "alerting:apm.anomaly/apm/rule/getActionErrorLog", + "alerting:apm.anomaly/apm/rule/find", + "alerting:apm.anomaly/apm/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/apm/rule/getBackfill", + "alerting:apm.anomaly/apm/rule/findBackfill", + "alerting:apm.error_rate/apm/alert/get", + "alerting:apm.error_rate/apm/alert/find", + "alerting:apm.error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/alert/get", + "alerting:apm.transaction_error_rate/apm/alert/find", + "alerting:apm.transaction_error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_duration/apm/alert/get", + "alerting:apm.transaction_duration/apm/alert/find", + "alerting:apm.transaction_duration/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/apm/alert/getAlertSummary", + "alerting:apm.anomaly/apm/alert/get", + "alerting:apm.anomaly/apm/alert/find", + "alerting:apm.anomaly/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/apm/alert/getAlertSummary", + "api:infra", + "app:infra", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/infra", + "ui:navLinks/logs", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "api:apm", + "api:rac", + "app:apm", + "app:ux", + "app:kibana", + "ui:catalogue/apm", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/apm", + "ui:navLinks/ux", + "ui:navLinks/kibana", + "saved_object:apm-indices/bulk_get", + "saved_object:apm-indices/get", + "saved_object:apm-indices/find", + "saved_object:apm-indices/open_point_in_time", + "saved_object:apm-indices/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:apm/show", + "ui:apm/alerting:show", + "alerting:apm.error_rate/apm/rule/get", + "alerting:apm.error_rate/apm/rule/getRuleState", + "alerting:apm.error_rate/apm/rule/getAlertSummary", + "alerting:apm.error_rate/apm/rule/getExecutionLog", + "alerting:apm.error_rate/apm/rule/getActionErrorLog", + "alerting:apm.error_rate/apm/rule/find", + "alerting:apm.error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/apm/rule/getBackfill", + "alerting:apm.error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_error_rate/apm/rule/get", + "alerting:apm.transaction_error_rate/apm/rule/getRuleState", + "alerting:apm.transaction_error_rate/apm/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/apm/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/apm/rule/find", + "alerting:apm.transaction_error_rate/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/apm/rule/getBackfill", + "alerting:apm.transaction_error_rate/apm/rule/findBackfill", + "alerting:apm.transaction_duration/apm/rule/get", + "alerting:apm.transaction_duration/apm/rule/getRuleState", + "alerting:apm.transaction_duration/apm/rule/getAlertSummary", + "alerting:apm.transaction_duration/apm/rule/getExecutionLog", + "alerting:apm.transaction_duration/apm/rule/getActionErrorLog", + "alerting:apm.transaction_duration/apm/rule/find", + "alerting:apm.transaction_duration/apm/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/apm/rule/getBackfill", + "alerting:apm.transaction_duration/apm/rule/findBackfill", + "alerting:apm.anomaly/apm/rule/get", + "alerting:apm.anomaly/apm/rule/getRuleState", + "alerting:apm.anomaly/apm/rule/getAlertSummary", + "alerting:apm.anomaly/apm/rule/getExecutionLog", + "alerting:apm.anomaly/apm/rule/getActionErrorLog", + "alerting:apm.anomaly/apm/rule/find", + "alerting:apm.anomaly/apm/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/apm/rule/getBackfill", + "alerting:apm.anomaly/apm/rule/findBackfill", + "alerting:apm.error_rate/apm/alert/get", + "alerting:apm.error_rate/apm/alert/find", + "alerting:apm.error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/apm/alert/get", + "alerting:apm.transaction_error_rate/apm/alert/find", + "alerting:apm.transaction_error_rate/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/apm/alert/getAlertSummary", + "alerting:apm.transaction_duration/apm/alert/get", + "alerting:apm.transaction_duration/apm/alert/find", + "alerting:apm.transaction_duration/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/apm/alert/getAlertSummary", + "alerting:apm.anomaly/apm/alert/get", + "alerting:apm.anomaly/apm/alert/find", + "alerting:apm.anomaly/apm/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/apm/alert/getAlertSummary", + "api:infra", + "app:infra", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/infra", + "ui:navLinks/logs", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + }, + "dashboard": Object { + "all": Array [ + "login:", + "api:bulkGetUserProfiles", + "api:store_search_session", + "api:generateReport", + "api:downloadCsv", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "ui:dashboard/createShortUrl", + "ui:dashboard/storeSearchSession", + "ui:dashboard/generateScreenshot", + "ui:dashboard/downloadCsv", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + ], + "download_csv_report": Array [ + "login:", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + ], + "generate_report": Array [ + "login:", + "api:generateReport", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/generateScreenshot", + ], + "minimal_all": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + "api:generateReport", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + ], + "minimal_read": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:dashboard/show", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:visualize/show", + "ui:visualize/createShortUrl", + ], + "read": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "ui:dashboard/show", + "ui:dashboard/createShortUrl", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "ui:visualize/show", + "ui:visualize/createShortUrl", + ], + "store_search_session": Array [ + "login:", + "api:store_search_session", + "ui:management/kibana/search_sessions", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:dashboard/storeSearchSession", + ], + "url_create": Array [ + "login:", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:dashboard/createShortUrl", + ], + }, + "discover": Object { + "all": Array [ + "login:", + "api:fileUpload:analyzeFile", + "api:store_search_session", + "api:generateReport", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + "ui:discover/createShortUrl", + "ui:discover/storeSearchSession", + "ui:discover/generateCsv", + "api:rac", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "generate_report": Array [ + "login:", + "api:generateReport", + "ui:management/insightsAndAlerting/reporting", + "ui:discover/generateCsv", + ], + "minimal_all": Array [ + "login:", + "api:fileUpload:analyzeFile", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + "api:rac", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_read": Array [ + "login:", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:discover/show", + "api:rac", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "ui:discover/show", + "ui:discover/createShortUrl", + "api:rac", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "store_search_session": Array [ + "login:", + "api:store_search_session", + "ui:management/kibana/search_sessions", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:discover/storeSearchSession", + ], + "url_create": Array [ + "login:", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:discover/createShortUrl", + ], + }, + "fleetv2": Object { + "all": Array [ + "login:", + "api:fleet-read", + "api:fleet-all", + "app:fleet", + "ui:catalogue/fleet", + "ui:navLinks/fleet", + "saved_object:ingest-outputs/bulk_get", + "saved_object:ingest-outputs/get", + "saved_object:ingest-outputs/find", + "saved_object:ingest-outputs/open_point_in_time", + "saved_object:ingest-outputs/close_point_in_time", + "saved_object:ingest-outputs/create", + "saved_object:ingest-outputs/bulk_create", + "saved_object:ingest-outputs/update", + "saved_object:ingest-outputs/bulk_update", + "saved_object:ingest-outputs/delete", + "saved_object:ingest-outputs/bulk_delete", + "saved_object:ingest-outputs/share_to_space", + "saved_object:ingest-agent-policies/bulk_get", + "saved_object:ingest-agent-policies/get", + "saved_object:ingest-agent-policies/find", + "saved_object:ingest-agent-policies/open_point_in_time", + "saved_object:ingest-agent-policies/close_point_in_time", + "saved_object:ingest-agent-policies/create", + "saved_object:ingest-agent-policies/bulk_create", + "saved_object:ingest-agent-policies/update", + "saved_object:ingest-agent-policies/bulk_update", + "saved_object:ingest-agent-policies/delete", + "saved_object:ingest-agent-policies/bulk_delete", + "saved_object:ingest-agent-policies/share_to_space", + "saved_object:ingest-package-policies/bulk_get", + "saved_object:ingest-package-policies/get", + "saved_object:ingest-package-policies/find", + "saved_object:ingest-package-policies/open_point_in_time", + "saved_object:ingest-package-policies/close_point_in_time", + "saved_object:ingest-package-policies/create", + "saved_object:ingest-package-policies/bulk_create", + "saved_object:ingest-package-policies/update", + "saved_object:ingest-package-policies/bulk_update", + "saved_object:ingest-package-policies/delete", + "saved_object:ingest-package-policies/bulk_delete", + "saved_object:ingest-package-policies/share_to_space", + "saved_object:epm-packages/bulk_get", + "saved_object:epm-packages/get", + "saved_object:epm-packages/find", + "saved_object:epm-packages/open_point_in_time", + "saved_object:epm-packages/close_point_in_time", + "saved_object:epm-packages/create", + "saved_object:epm-packages/bulk_create", + "saved_object:epm-packages/update", + "saved_object:epm-packages/bulk_update", + "saved_object:epm-packages/delete", + "saved_object:epm-packages/bulk_delete", + "saved_object:epm-packages/share_to_space", + "saved_object:epm-packages-assets/bulk_get", + "saved_object:epm-packages-assets/get", + "saved_object:epm-packages-assets/find", + "saved_object:epm-packages-assets/open_point_in_time", + "saved_object:epm-packages-assets/close_point_in_time", + "saved_object:epm-packages-assets/create", + "saved_object:epm-packages-assets/bulk_create", + "saved_object:epm-packages-assets/update", + "saved_object:epm-packages-assets/bulk_update", + "saved_object:epm-packages-assets/delete", + "saved_object:epm-packages-assets/bulk_delete", + "saved_object:epm-packages-assets/share_to_space", + "saved_object:fleet-preconfiguration-deletion-record/bulk_get", + "saved_object:fleet-preconfiguration-deletion-record/get", + "saved_object:fleet-preconfiguration-deletion-record/find", + "saved_object:fleet-preconfiguration-deletion-record/open_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/close_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/create", + "saved_object:fleet-preconfiguration-deletion-record/bulk_create", + "saved_object:fleet-preconfiguration-deletion-record/update", + "saved_object:fleet-preconfiguration-deletion-record/bulk_update", + "saved_object:fleet-preconfiguration-deletion-record/delete", + "saved_object:fleet-preconfiguration-deletion-record/bulk_delete", + "saved_object:fleet-preconfiguration-deletion-record/share_to_space", + "saved_object:ingest-download-sources/bulk_get", + "saved_object:ingest-download-sources/get", + "saved_object:ingest-download-sources/find", + "saved_object:ingest-download-sources/open_point_in_time", + "saved_object:ingest-download-sources/close_point_in_time", + "saved_object:ingest-download-sources/create", + "saved_object:ingest-download-sources/bulk_create", + "saved_object:ingest-download-sources/update", + "saved_object:ingest-download-sources/bulk_update", + "saved_object:ingest-download-sources/delete", + "saved_object:ingest-download-sources/bulk_delete", + "saved_object:ingest-download-sources/share_to_space", + "saved_object:fleet-fleet-server-host/bulk_get", + "saved_object:fleet-fleet-server-host/get", + "saved_object:fleet-fleet-server-host/find", + "saved_object:fleet-fleet-server-host/open_point_in_time", + "saved_object:fleet-fleet-server-host/close_point_in_time", + "saved_object:fleet-fleet-server-host/create", + "saved_object:fleet-fleet-server-host/bulk_create", + "saved_object:fleet-fleet-server-host/update", + "saved_object:fleet-fleet-server-host/bulk_update", + "saved_object:fleet-fleet-server-host/delete", + "saved_object:fleet-fleet-server-host/bulk_delete", + "saved_object:fleet-fleet-server-host/share_to_space", + "saved_object:fleet-proxy/bulk_get", + "saved_object:fleet-proxy/get", + "saved_object:fleet-proxy/find", + "saved_object:fleet-proxy/open_point_in_time", + "saved_object:fleet-proxy/close_point_in_time", + "saved_object:fleet-proxy/create", + "saved_object:fleet-proxy/bulk_create", + "saved_object:fleet-proxy/update", + "saved_object:fleet-proxy/bulk_update", + "saved_object:fleet-proxy/delete", + "saved_object:fleet-proxy/bulk_delete", + "saved_object:fleet-proxy/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:fleetv2/read", + "ui:fleetv2/all", + "api:infra", + "api:rac", + "app:infra", + "app:logs", + "app:kibana", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/logs", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + ], + "minimal_all": Array [ + "login:", + "api:fleet-read", + "api:fleet-all", + "app:fleet", + "ui:catalogue/fleet", + "ui:navLinks/fleet", + "saved_object:ingest-outputs/bulk_get", + "saved_object:ingest-outputs/get", + "saved_object:ingest-outputs/find", + "saved_object:ingest-outputs/open_point_in_time", + "saved_object:ingest-outputs/close_point_in_time", + "saved_object:ingest-outputs/create", + "saved_object:ingest-outputs/bulk_create", + "saved_object:ingest-outputs/update", + "saved_object:ingest-outputs/bulk_update", + "saved_object:ingest-outputs/delete", + "saved_object:ingest-outputs/bulk_delete", + "saved_object:ingest-outputs/share_to_space", + "saved_object:ingest-agent-policies/bulk_get", + "saved_object:ingest-agent-policies/get", + "saved_object:ingest-agent-policies/find", + "saved_object:ingest-agent-policies/open_point_in_time", + "saved_object:ingest-agent-policies/close_point_in_time", + "saved_object:ingest-agent-policies/create", + "saved_object:ingest-agent-policies/bulk_create", + "saved_object:ingest-agent-policies/update", + "saved_object:ingest-agent-policies/bulk_update", + "saved_object:ingest-agent-policies/delete", + "saved_object:ingest-agent-policies/bulk_delete", + "saved_object:ingest-agent-policies/share_to_space", + "saved_object:ingest-package-policies/bulk_get", + "saved_object:ingest-package-policies/get", + "saved_object:ingest-package-policies/find", + "saved_object:ingest-package-policies/open_point_in_time", + "saved_object:ingest-package-policies/close_point_in_time", + "saved_object:ingest-package-policies/create", + "saved_object:ingest-package-policies/bulk_create", + "saved_object:ingest-package-policies/update", + "saved_object:ingest-package-policies/bulk_update", + "saved_object:ingest-package-policies/delete", + "saved_object:ingest-package-policies/bulk_delete", + "saved_object:ingest-package-policies/share_to_space", + "saved_object:epm-packages/bulk_get", + "saved_object:epm-packages/get", + "saved_object:epm-packages/find", + "saved_object:epm-packages/open_point_in_time", + "saved_object:epm-packages/close_point_in_time", + "saved_object:epm-packages/create", + "saved_object:epm-packages/bulk_create", + "saved_object:epm-packages/update", + "saved_object:epm-packages/bulk_update", + "saved_object:epm-packages/delete", + "saved_object:epm-packages/bulk_delete", + "saved_object:epm-packages/share_to_space", + "saved_object:epm-packages-assets/bulk_get", + "saved_object:epm-packages-assets/get", + "saved_object:epm-packages-assets/find", + "saved_object:epm-packages-assets/open_point_in_time", + "saved_object:epm-packages-assets/close_point_in_time", + "saved_object:epm-packages-assets/create", + "saved_object:epm-packages-assets/bulk_create", + "saved_object:epm-packages-assets/update", + "saved_object:epm-packages-assets/bulk_update", + "saved_object:epm-packages-assets/delete", + "saved_object:epm-packages-assets/bulk_delete", + "saved_object:epm-packages-assets/share_to_space", + "saved_object:fleet-preconfiguration-deletion-record/bulk_get", + "saved_object:fleet-preconfiguration-deletion-record/get", + "saved_object:fleet-preconfiguration-deletion-record/find", + "saved_object:fleet-preconfiguration-deletion-record/open_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/close_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/create", + "saved_object:fleet-preconfiguration-deletion-record/bulk_create", + "saved_object:fleet-preconfiguration-deletion-record/update", + "saved_object:fleet-preconfiguration-deletion-record/bulk_update", + "saved_object:fleet-preconfiguration-deletion-record/delete", + "saved_object:fleet-preconfiguration-deletion-record/bulk_delete", + "saved_object:fleet-preconfiguration-deletion-record/share_to_space", + "saved_object:ingest-download-sources/bulk_get", + "saved_object:ingest-download-sources/get", + "saved_object:ingest-download-sources/find", + "saved_object:ingest-download-sources/open_point_in_time", + "saved_object:ingest-download-sources/close_point_in_time", + "saved_object:ingest-download-sources/create", + "saved_object:ingest-download-sources/bulk_create", + "saved_object:ingest-download-sources/update", + "saved_object:ingest-download-sources/bulk_update", + "saved_object:ingest-download-sources/delete", + "saved_object:ingest-download-sources/bulk_delete", + "saved_object:ingest-download-sources/share_to_space", + "saved_object:fleet-fleet-server-host/bulk_get", + "saved_object:fleet-fleet-server-host/get", + "saved_object:fleet-fleet-server-host/find", + "saved_object:fleet-fleet-server-host/open_point_in_time", + "saved_object:fleet-fleet-server-host/close_point_in_time", + "saved_object:fleet-fleet-server-host/create", + "saved_object:fleet-fleet-server-host/bulk_create", + "saved_object:fleet-fleet-server-host/update", + "saved_object:fleet-fleet-server-host/bulk_update", + "saved_object:fleet-fleet-server-host/delete", + "saved_object:fleet-fleet-server-host/bulk_delete", + "saved_object:fleet-fleet-server-host/share_to_space", + "saved_object:fleet-proxy/bulk_get", + "saved_object:fleet-proxy/get", + "saved_object:fleet-proxy/find", + "saved_object:fleet-proxy/open_point_in_time", + "saved_object:fleet-proxy/close_point_in_time", + "saved_object:fleet-proxy/create", + "saved_object:fleet-proxy/bulk_create", + "saved_object:fleet-proxy/update", + "saved_object:fleet-proxy/bulk_update", + "saved_object:fleet-proxy/delete", + "saved_object:fleet-proxy/bulk_delete", + "saved_object:fleet-proxy/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:fleetv2/read", + "ui:fleetv2/all", + "api:infra", + "api:rac", + "app:infra", + "app:logs", + "app:kibana", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/logs", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + ], + "minimal_read": Array [ + "login:", + "api:fleet-read", + "app:fleet", + "ui:catalogue/fleet", + "ui:navLinks/fleet", + "saved_object:ingest-outputs/bulk_get", + "saved_object:ingest-outputs/get", + "saved_object:ingest-outputs/find", + "saved_object:ingest-outputs/open_point_in_time", + "saved_object:ingest-outputs/close_point_in_time", + "saved_object:ingest-agent-policies/bulk_get", + "saved_object:ingest-agent-policies/get", + "saved_object:ingest-agent-policies/find", + "saved_object:ingest-agent-policies/open_point_in_time", + "saved_object:ingest-agent-policies/close_point_in_time", + "saved_object:ingest-package-policies/bulk_get", + "saved_object:ingest-package-policies/get", + "saved_object:ingest-package-policies/find", + "saved_object:ingest-package-policies/open_point_in_time", + "saved_object:ingest-package-policies/close_point_in_time", + "saved_object:epm-packages/bulk_get", + "saved_object:epm-packages/get", + "saved_object:epm-packages/find", + "saved_object:epm-packages/open_point_in_time", + "saved_object:epm-packages/close_point_in_time", + "saved_object:epm-packages-assets/bulk_get", + "saved_object:epm-packages-assets/get", + "saved_object:epm-packages-assets/find", + "saved_object:epm-packages-assets/open_point_in_time", + "saved_object:epm-packages-assets/close_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/bulk_get", + "saved_object:fleet-preconfiguration-deletion-record/get", + "saved_object:fleet-preconfiguration-deletion-record/find", + "saved_object:fleet-preconfiguration-deletion-record/open_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/close_point_in_time", + "saved_object:ingest-download-sources/bulk_get", + "saved_object:ingest-download-sources/get", + "saved_object:ingest-download-sources/find", + "saved_object:ingest-download-sources/open_point_in_time", + "saved_object:ingest-download-sources/close_point_in_time", + "saved_object:fleet-fleet-server-host/bulk_get", + "saved_object:fleet-fleet-server-host/get", + "saved_object:fleet-fleet-server-host/find", + "saved_object:fleet-fleet-server-host/open_point_in_time", + "saved_object:fleet-fleet-server-host/close_point_in_time", + "saved_object:fleet-proxy/bulk_get", + "saved_object:fleet-proxy/get", + "saved_object:fleet-proxy/find", + "saved_object:fleet-proxy/open_point_in_time", + "saved_object:fleet-proxy/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:fleetv2/read", + "api:infra", + "api:rac", + "app:infra", + "app:logs", + "app:kibana", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/logs", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "api:fleet-read", + "app:fleet", + "ui:catalogue/fleet", + "ui:navLinks/fleet", + "saved_object:ingest-outputs/bulk_get", + "saved_object:ingest-outputs/get", + "saved_object:ingest-outputs/find", + "saved_object:ingest-outputs/open_point_in_time", + "saved_object:ingest-outputs/close_point_in_time", + "saved_object:ingest-agent-policies/bulk_get", + "saved_object:ingest-agent-policies/get", + "saved_object:ingest-agent-policies/find", + "saved_object:ingest-agent-policies/open_point_in_time", + "saved_object:ingest-agent-policies/close_point_in_time", + "saved_object:ingest-package-policies/bulk_get", + "saved_object:ingest-package-policies/get", + "saved_object:ingest-package-policies/find", + "saved_object:ingest-package-policies/open_point_in_time", + "saved_object:ingest-package-policies/close_point_in_time", + "saved_object:epm-packages/bulk_get", + "saved_object:epm-packages/get", + "saved_object:epm-packages/find", + "saved_object:epm-packages/open_point_in_time", + "saved_object:epm-packages/close_point_in_time", + "saved_object:epm-packages-assets/bulk_get", + "saved_object:epm-packages-assets/get", + "saved_object:epm-packages-assets/find", + "saved_object:epm-packages-assets/open_point_in_time", + "saved_object:epm-packages-assets/close_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/bulk_get", + "saved_object:fleet-preconfiguration-deletion-record/get", + "saved_object:fleet-preconfiguration-deletion-record/find", + "saved_object:fleet-preconfiguration-deletion-record/open_point_in_time", + "saved_object:fleet-preconfiguration-deletion-record/close_point_in_time", + "saved_object:ingest-download-sources/bulk_get", + "saved_object:ingest-download-sources/get", + "saved_object:ingest-download-sources/find", + "saved_object:ingest-download-sources/open_point_in_time", + "saved_object:ingest-download-sources/close_point_in_time", + "saved_object:fleet-fleet-server-host/bulk_get", + "saved_object:fleet-fleet-server-host/get", + "saved_object:fleet-fleet-server-host/find", + "saved_object:fleet-fleet-server-host/open_point_in_time", + "saved_object:fleet-fleet-server-host/close_point_in_time", + "saved_object:fleet-proxy/bulk_get", + "saved_object:fleet-proxy/get", + "saved_object:fleet-proxy/find", + "saved_object:fleet-proxy/open_point_in_time", + "saved_object:fleet-proxy/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:fleetv2/read", + "api:infra", + "api:rac", + "app:infra", + "app:logs", + "app:kibana", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/logs", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + ], + }, + "infrastructure": Object { + "all": Array [ + "login:", + "api:infra", + "api:rac", + "app:infra", + "app:metrics", + "app:kibana", + "ui:catalogue/infraops", + "ui:catalogue/metrics", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/metrics", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:metrics-data-source/bulk_get", + "saved_object:metrics-data-source/get", + "saved_object:metrics-data-source/find", + "saved_object:metrics-data-source/open_point_in_time", + "saved_object:metrics-data-source/close_point_in_time", + "saved_object:metrics-data-source/create", + "saved_object:metrics-data-source/bulk_create", + "saved_object:metrics-data-source/update", + "saved_object:metrics-data-source/bulk_update", + "saved_object:metrics-data-source/delete", + "saved_object:metrics-data-source/bulk_delete", + "saved_object:metrics-data-source/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:infrastructure/show", + "ui:infrastructure/configureSource", + "ui:infrastructure/save", + "alerting:metrics.alert.threshold/infrastructure/rule/get", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.threshold/infrastructure/rule/find", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/create", + "alerting:metrics.alert.threshold/infrastructure/rule/delete", + "alerting:metrics.alert.threshold/infrastructure/rule/update", + "alerting:metrics.alert.threshold/infrastructure/rule/updateApiKey", + "alerting:metrics.alert.threshold/infrastructure/rule/enable", + "alerting:metrics.alert.threshold/infrastructure/rule/disable", + "alerting:metrics.alert.threshold/infrastructure/rule/muteAll", + "alerting:metrics.alert.threshold/infrastructure/rule/unmuteAll", + "alerting:metrics.alert.threshold/infrastructure/rule/muteAlert", + "alerting:metrics.alert.threshold/infrastructure/rule/unmuteAlert", + "alerting:metrics.alert.threshold/infrastructure/rule/snooze", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkEdit", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkDelete", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkEnable", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkDisable", + "alerting:metrics.alert.threshold/infrastructure/rule/unsnooze", + "alerting:metrics.alert.threshold/infrastructure/rule/runSoon", + "alerting:metrics.alert.threshold/infrastructure/rule/scheduleBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/create", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/delete", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/update", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/enable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/disable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/snooze", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/deleteBackfill", + "alerting:.es-query/infrastructure/rule/get", + "alerting:.es-query/infrastructure/rule/getRuleState", + "alerting:.es-query/infrastructure/rule/getAlertSummary", + "alerting:.es-query/infrastructure/rule/getExecutionLog", + "alerting:.es-query/infrastructure/rule/getActionErrorLog", + "alerting:.es-query/infrastructure/rule/find", + "alerting:.es-query/infrastructure/rule/getRuleExecutionKPI", + "alerting:.es-query/infrastructure/rule/getBackfill", + "alerting:.es-query/infrastructure/rule/findBackfill", + "alerting:.es-query/infrastructure/rule/create", + "alerting:.es-query/infrastructure/rule/delete", + "alerting:.es-query/infrastructure/rule/update", + "alerting:.es-query/infrastructure/rule/updateApiKey", + "alerting:.es-query/infrastructure/rule/enable", + "alerting:.es-query/infrastructure/rule/disable", + "alerting:.es-query/infrastructure/rule/muteAll", + "alerting:.es-query/infrastructure/rule/unmuteAll", + "alerting:.es-query/infrastructure/rule/muteAlert", + "alerting:.es-query/infrastructure/rule/unmuteAlert", + "alerting:.es-query/infrastructure/rule/snooze", + "alerting:.es-query/infrastructure/rule/bulkEdit", + "alerting:.es-query/infrastructure/rule/bulkDelete", + "alerting:.es-query/infrastructure/rule/bulkEnable", + "alerting:.es-query/infrastructure/rule/bulkDisable", + "alerting:.es-query/infrastructure/rule/unsnooze", + "alerting:.es-query/infrastructure/rule/runSoon", + "alerting:.es-query/infrastructure/rule/scheduleBackfill", + "alerting:.es-query/infrastructure/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/get", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleState", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/find", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/findBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/create", + "alerting:observability.rules.custom_threshold/infrastructure/rule/delete", + "alerting:observability.rules.custom_threshold/infrastructure/rule/update", + "alerting:observability.rules.custom_threshold/infrastructure/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/infrastructure/rule/enable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/disable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/muteAll", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/infrastructure/rule/muteAlert", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/infrastructure/rule/snooze", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unsnooze", + "alerting:observability.rules.custom_threshold/infrastructure/rule/runSoon", + "alerting:observability.rules.custom_threshold/infrastructure/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/deleteBackfill", + "alerting:metrics.alert.threshold/infrastructure/alert/get", + "alerting:metrics.alert.threshold/infrastructure/alert/find", + "alerting:metrics.alert.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/alert/update", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/update", + "alerting:.es-query/infrastructure/alert/get", + "alerting:.es-query/infrastructure/alert/find", + "alerting:.es-query/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/infrastructure/alert/getAlertSummary", + "alerting:.es-query/infrastructure/alert/update", + "alerting:observability.rules.custom_threshold/infrastructure/alert/get", + "alerting:observability.rules.custom_threshold/infrastructure/alert/find", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/update", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/logs", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_all": Array [ + "login:", + "api:infra", + "api:rac", + "app:infra", + "app:metrics", + "app:kibana", + "ui:catalogue/infraops", + "ui:catalogue/metrics", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/metrics", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:infrastructure-ui-source/create", + "saved_object:infrastructure-ui-source/bulk_create", + "saved_object:infrastructure-ui-source/update", + "saved_object:infrastructure-ui-source/bulk_update", + "saved_object:infrastructure-ui-source/delete", + "saved_object:infrastructure-ui-source/bulk_delete", + "saved_object:infrastructure-ui-source/share_to_space", + "saved_object:metrics-data-source/bulk_get", + "saved_object:metrics-data-source/get", + "saved_object:metrics-data-source/find", + "saved_object:metrics-data-source/open_point_in_time", + "saved_object:metrics-data-source/close_point_in_time", + "saved_object:metrics-data-source/create", + "saved_object:metrics-data-source/bulk_create", + "saved_object:metrics-data-source/update", + "saved_object:metrics-data-source/bulk_update", + "saved_object:metrics-data-source/delete", + "saved_object:metrics-data-source/bulk_delete", + "saved_object:metrics-data-source/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:infrastructure/show", + "ui:infrastructure/configureSource", + "ui:infrastructure/save", + "alerting:metrics.alert.threshold/infrastructure/rule/get", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.threshold/infrastructure/rule/find", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/create", + "alerting:metrics.alert.threshold/infrastructure/rule/delete", + "alerting:metrics.alert.threshold/infrastructure/rule/update", + "alerting:metrics.alert.threshold/infrastructure/rule/updateApiKey", + "alerting:metrics.alert.threshold/infrastructure/rule/enable", + "alerting:metrics.alert.threshold/infrastructure/rule/disable", + "alerting:metrics.alert.threshold/infrastructure/rule/muteAll", + "alerting:metrics.alert.threshold/infrastructure/rule/unmuteAll", + "alerting:metrics.alert.threshold/infrastructure/rule/muteAlert", + "alerting:metrics.alert.threshold/infrastructure/rule/unmuteAlert", + "alerting:metrics.alert.threshold/infrastructure/rule/snooze", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkEdit", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkDelete", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkEnable", + "alerting:metrics.alert.threshold/infrastructure/rule/bulkDisable", + "alerting:metrics.alert.threshold/infrastructure/rule/unsnooze", + "alerting:metrics.alert.threshold/infrastructure/rule/runSoon", + "alerting:metrics.alert.threshold/infrastructure/rule/scheduleBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/create", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/delete", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/update", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/enable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/disable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/snooze", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/deleteBackfill", + "alerting:.es-query/infrastructure/rule/get", + "alerting:.es-query/infrastructure/rule/getRuleState", + "alerting:.es-query/infrastructure/rule/getAlertSummary", + "alerting:.es-query/infrastructure/rule/getExecutionLog", + "alerting:.es-query/infrastructure/rule/getActionErrorLog", + "alerting:.es-query/infrastructure/rule/find", + "alerting:.es-query/infrastructure/rule/getRuleExecutionKPI", + "alerting:.es-query/infrastructure/rule/getBackfill", + "alerting:.es-query/infrastructure/rule/findBackfill", + "alerting:.es-query/infrastructure/rule/create", + "alerting:.es-query/infrastructure/rule/delete", + "alerting:.es-query/infrastructure/rule/update", + "alerting:.es-query/infrastructure/rule/updateApiKey", + "alerting:.es-query/infrastructure/rule/enable", + "alerting:.es-query/infrastructure/rule/disable", + "alerting:.es-query/infrastructure/rule/muteAll", + "alerting:.es-query/infrastructure/rule/unmuteAll", + "alerting:.es-query/infrastructure/rule/muteAlert", + "alerting:.es-query/infrastructure/rule/unmuteAlert", + "alerting:.es-query/infrastructure/rule/snooze", + "alerting:.es-query/infrastructure/rule/bulkEdit", + "alerting:.es-query/infrastructure/rule/bulkDelete", + "alerting:.es-query/infrastructure/rule/bulkEnable", + "alerting:.es-query/infrastructure/rule/bulkDisable", + "alerting:.es-query/infrastructure/rule/unsnooze", + "alerting:.es-query/infrastructure/rule/runSoon", + "alerting:.es-query/infrastructure/rule/scheduleBackfill", + "alerting:.es-query/infrastructure/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/get", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleState", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/find", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/findBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/create", + "alerting:observability.rules.custom_threshold/infrastructure/rule/delete", + "alerting:observability.rules.custom_threshold/infrastructure/rule/update", + "alerting:observability.rules.custom_threshold/infrastructure/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/infrastructure/rule/enable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/disable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/muteAll", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/infrastructure/rule/muteAlert", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/infrastructure/rule/snooze", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/infrastructure/rule/unsnooze", + "alerting:observability.rules.custom_threshold/infrastructure/rule/runSoon", + "alerting:observability.rules.custom_threshold/infrastructure/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/deleteBackfill", + "alerting:metrics.alert.threshold/infrastructure/alert/get", + "alerting:metrics.alert.threshold/infrastructure/alert/find", + "alerting:metrics.alert.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/alert/update", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/update", + "alerting:.es-query/infrastructure/alert/get", + "alerting:.es-query/infrastructure/alert/find", + "alerting:.es-query/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/infrastructure/alert/getAlertSummary", + "alerting:.es-query/infrastructure/alert/update", + "alerting:observability.rules.custom_threshold/infrastructure/alert/get", + "alerting:observability.rules.custom_threshold/infrastructure/alert/find", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/update", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/logs", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "saved_object:infrastructure-monitoring-log-view/create", + "saved_object:infrastructure-monitoring-log-view/bulk_create", + "saved_object:infrastructure-monitoring-log-view/update", + "saved_object:infrastructure-monitoring-log-view/bulk_update", + "saved_object:infrastructure-monitoring-log-view/delete", + "saved_object:infrastructure-monitoring-log-view/bulk_delete", + "saved_object:infrastructure-monitoring-log-view/share_to_space", + "ui:logs/show", + "ui:logs/configureSource", + "ui:logs/save", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/rule/create", + "alerting:logs.alert.document.count/logs/rule/delete", + "alerting:logs.alert.document.count/logs/rule/update", + "alerting:logs.alert.document.count/logs/rule/updateApiKey", + "alerting:logs.alert.document.count/logs/rule/enable", + "alerting:logs.alert.document.count/logs/rule/disable", + "alerting:logs.alert.document.count/logs/rule/muteAll", + "alerting:logs.alert.document.count/logs/rule/unmuteAll", + "alerting:logs.alert.document.count/logs/rule/muteAlert", + "alerting:logs.alert.document.count/logs/rule/unmuteAlert", + "alerting:logs.alert.document.count/logs/rule/snooze", + "alerting:logs.alert.document.count/logs/rule/bulkEdit", + "alerting:logs.alert.document.count/logs/rule/bulkDelete", + "alerting:logs.alert.document.count/logs/rule/bulkEnable", + "alerting:logs.alert.document.count/logs/rule/bulkDisable", + "alerting:logs.alert.document.count/logs/rule/unsnooze", + "alerting:logs.alert.document.count/logs/rule/runSoon", + "alerting:logs.alert.document.count/logs/rule/scheduleBackfill", + "alerting:logs.alert.document.count/logs/rule/deleteBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/create", + "alerting:.es-query/logs/rule/delete", + "alerting:.es-query/logs/rule/update", + "alerting:.es-query/logs/rule/updateApiKey", + "alerting:.es-query/logs/rule/enable", + "alerting:.es-query/logs/rule/disable", + "alerting:.es-query/logs/rule/muteAll", + "alerting:.es-query/logs/rule/unmuteAll", + "alerting:.es-query/logs/rule/muteAlert", + "alerting:.es-query/logs/rule/unmuteAlert", + "alerting:.es-query/logs/rule/snooze", + "alerting:.es-query/logs/rule/bulkEdit", + "alerting:.es-query/logs/rule/bulkDelete", + "alerting:.es-query/logs/rule/bulkEnable", + "alerting:.es-query/logs/rule/bulkDisable", + "alerting:.es-query/logs/rule/unsnooze", + "alerting:.es-query/logs/rule/runSoon", + "alerting:.es-query/logs/rule/scheduleBackfill", + "alerting:.es-query/logs/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/create", + "alerting:observability.rules.custom_threshold/logs/rule/delete", + "alerting:observability.rules.custom_threshold/logs/rule/update", + "alerting:observability.rules.custom_threshold/logs/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/logs/rule/enable", + "alerting:observability.rules.custom_threshold/logs/rule/disable", + "alerting:observability.rules.custom_threshold/logs/rule/muteAll", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/logs/rule/muteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/logs/rule/snooze", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/logs/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/logs/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/logs/rule/unsnooze", + "alerting:observability.rules.custom_threshold/logs/rule/runSoon", + "alerting:observability.rules.custom_threshold/logs/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/deleteBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:logs.alert.document.count/logs/alert/update", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/update", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_read": Array [ + "login:", + "api:infra", + "api:rac", + "app:infra", + "app:metrics", + "app:kibana", + "ui:catalogue/infraops", + "ui:catalogue/metrics", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/metrics", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:metrics-data-source/bulk_get", + "saved_object:metrics-data-source/get", + "saved_object:metrics-data-source/find", + "saved_object:metrics-data-source/open_point_in_time", + "saved_object:metrics-data-source/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:infrastructure/show", + "alerting:metrics.alert.threshold/infrastructure/rule/get", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.threshold/infrastructure/rule/find", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/findBackfill", + "alerting:.es-query/infrastructure/rule/get", + "alerting:.es-query/infrastructure/rule/getRuleState", + "alerting:.es-query/infrastructure/rule/getAlertSummary", + "alerting:.es-query/infrastructure/rule/getExecutionLog", + "alerting:.es-query/infrastructure/rule/getActionErrorLog", + "alerting:.es-query/infrastructure/rule/find", + "alerting:.es-query/infrastructure/rule/getRuleExecutionKPI", + "alerting:.es-query/infrastructure/rule/getBackfill", + "alerting:.es-query/infrastructure/rule/findBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/get", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleState", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/find", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/findBackfill", + "alerting:metrics.alert.threshold/infrastructure/alert/get", + "alerting:metrics.alert.threshold/infrastructure/alert/find", + "alerting:metrics.alert.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAlertSummary", + "alerting:.es-query/infrastructure/alert/get", + "alerting:.es-query/infrastructure/alert/find", + "alerting:.es-query/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/infrastructure/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/alert/get", + "alerting:observability.rules.custom_threshold/infrastructure/alert/find", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAlertSummary", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/logs", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "api:infra", + "api:rac", + "app:infra", + "app:metrics", + "app:kibana", + "ui:catalogue/infraops", + "ui:catalogue/metrics", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/infra", + "ui:navLinks/metrics", + "ui:navLinks/kibana", + "saved_object:infrastructure-ui-source/bulk_get", + "saved_object:infrastructure-ui-source/get", + "saved_object:infrastructure-ui-source/find", + "saved_object:infrastructure-ui-source/open_point_in_time", + "saved_object:infrastructure-ui-source/close_point_in_time", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:metrics-data-source/bulk_get", + "saved_object:metrics-data-source/get", + "saved_object:metrics-data-source/find", + "saved_object:metrics-data-source/open_point_in_time", + "saved_object:metrics-data-source/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:infrastructure/show", + "alerting:metrics.alert.threshold/infrastructure/rule/get", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.threshold/infrastructure/rule/find", + "alerting:metrics.alert.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.threshold/infrastructure/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/infrastructure/rule/findBackfill", + "alerting:.es-query/infrastructure/rule/get", + "alerting:.es-query/infrastructure/rule/getRuleState", + "alerting:.es-query/infrastructure/rule/getAlertSummary", + "alerting:.es-query/infrastructure/rule/getExecutionLog", + "alerting:.es-query/infrastructure/rule/getActionErrorLog", + "alerting:.es-query/infrastructure/rule/find", + "alerting:.es-query/infrastructure/rule/getRuleExecutionKPI", + "alerting:.es-query/infrastructure/rule/getBackfill", + "alerting:.es-query/infrastructure/rule/findBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/get", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleState", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/infrastructure/rule/find", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/infrastructure/rule/getBackfill", + "alerting:observability.rules.custom_threshold/infrastructure/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/rule/findBackfill", + "alerting:metrics.alert.threshold/infrastructure/alert/get", + "alerting:metrics.alert.threshold/infrastructure/alert/find", + "alerting:metrics.alert.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.threshold/infrastructure/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/get", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/find", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/infrastructure/alert/getAlertSummary", + "alerting:.es-query/infrastructure/alert/get", + "alerting:.es-query/infrastructure/alert/find", + "alerting:.es-query/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/infrastructure/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/infrastructure/alert/get", + "alerting:observability.rules.custom_threshold/infrastructure/alert/find", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/infrastructure/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/infrastructure/alert/getAlertSummary", + "app:logs", + "ui:catalogue/infralogging", + "ui:catalogue/logs", + "ui:navLinks/logs", + "saved_object:infrastructure-monitoring-log-view/bulk_get", + "saved_object:infrastructure-monitoring-log-view/get", + "saved_object:infrastructure-monitoring-log-view/find", + "saved_object:infrastructure-monitoring-log-view/open_point_in_time", + "saved_object:infrastructure-monitoring-log-view/close_point_in_time", + "ui:logs/show", + "alerting:logs.alert.document.count/logs/rule/get", + "alerting:logs.alert.document.count/logs/rule/getRuleState", + "alerting:logs.alert.document.count/logs/rule/getAlertSummary", + "alerting:logs.alert.document.count/logs/rule/getExecutionLog", + "alerting:logs.alert.document.count/logs/rule/getActionErrorLog", + "alerting:logs.alert.document.count/logs/rule/find", + "alerting:logs.alert.document.count/logs/rule/getRuleExecutionKPI", + "alerting:logs.alert.document.count/logs/rule/getBackfill", + "alerting:logs.alert.document.count/logs/rule/findBackfill", + "alerting:.es-query/logs/rule/get", + "alerting:.es-query/logs/rule/getRuleState", + "alerting:.es-query/logs/rule/getAlertSummary", + "alerting:.es-query/logs/rule/getExecutionLog", + "alerting:.es-query/logs/rule/getActionErrorLog", + "alerting:.es-query/logs/rule/find", + "alerting:.es-query/logs/rule/getRuleExecutionKPI", + "alerting:.es-query/logs/rule/getBackfill", + "alerting:.es-query/logs/rule/findBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/get", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleState", + "alerting:observability.rules.custom_threshold/logs/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/logs/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/logs/rule/find", + "alerting:observability.rules.custom_threshold/logs/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/logs/rule/getBackfill", + "alerting:observability.rules.custom_threshold/logs/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/logs/rule/findBackfill", + "alerting:logs.alert.document.count/logs/alert/get", + "alerting:logs.alert.document.count/logs/alert/find", + "alerting:logs.alert.document.count/logs/alert/getAuthorizedAlertsIndices", + "alerting:logs.alert.document.count/logs/alert/getAlertSummary", + "alerting:.es-query/logs/alert/get", + "alerting:.es-query/logs/alert/find", + "alerting:.es-query/logs/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/logs/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/logs/alert/get", + "alerting:observability.rules.custom_threshold/logs/alert/find", + "alerting:observability.rules.custom_threshold/logs/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/logs/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/logs/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + }, + "reporting": Object { + "all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + "read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + }, + "slo": Object { + "all": Array [ + "login:", + "api:slo_write", + "api:slo_read", + "api:rac", + "app:slo", + "app:kibana", + "ui:catalogue/slo", + "ui:catalogue/observability", + "ui:navLinks/slo", + "ui:navLinks/kibana", + "saved_object:slo/bulk_get", + "saved_object:slo/get", + "saved_object:slo/find", + "saved_object:slo/open_point_in_time", + "saved_object:slo/close_point_in_time", + "saved_object:slo/create", + "saved_object:slo/bulk_create", + "saved_object:slo/update", + "saved_object:slo/bulk_update", + "saved_object:slo/delete", + "saved_object:slo/bulk_delete", + "saved_object:slo/share_to_space", + "saved_object:slo-settings/bulk_get", + "saved_object:slo-settings/get", + "saved_object:slo-settings/find", + "saved_object:slo-settings/open_point_in_time", + "saved_object:slo-settings/close_point_in_time", + "saved_object:slo-settings/create", + "saved_object:slo-settings/bulk_create", + "saved_object:slo-settings/update", + "saved_object:slo-settings/bulk_update", + "saved_object:slo-settings/delete", + "saved_object:slo-settings/bulk_delete", + "saved_object:slo-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:slo/read", + "ui:slo/write", + "alerting:slo.rules.burnRate/slo/rule/get", + "alerting:slo.rules.burnRate/slo/rule/getRuleState", + "alerting:slo.rules.burnRate/slo/rule/getAlertSummary", + "alerting:slo.rules.burnRate/slo/rule/getExecutionLog", + "alerting:slo.rules.burnRate/slo/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/slo/rule/find", + "alerting:slo.rules.burnRate/slo/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/slo/rule/getBackfill", + "alerting:slo.rules.burnRate/slo/rule/findBackfill", + "alerting:slo.rules.burnRate/slo/rule/create", + "alerting:slo.rules.burnRate/slo/rule/delete", + "alerting:slo.rules.burnRate/slo/rule/update", + "alerting:slo.rules.burnRate/slo/rule/updateApiKey", + "alerting:slo.rules.burnRate/slo/rule/enable", + "alerting:slo.rules.burnRate/slo/rule/disable", + "alerting:slo.rules.burnRate/slo/rule/muteAll", + "alerting:slo.rules.burnRate/slo/rule/unmuteAll", + "alerting:slo.rules.burnRate/slo/rule/muteAlert", + "alerting:slo.rules.burnRate/slo/rule/unmuteAlert", + "alerting:slo.rules.burnRate/slo/rule/snooze", + "alerting:slo.rules.burnRate/slo/rule/bulkEdit", + "alerting:slo.rules.burnRate/slo/rule/bulkDelete", + "alerting:slo.rules.burnRate/slo/rule/bulkEnable", + "alerting:slo.rules.burnRate/slo/rule/bulkDisable", + "alerting:slo.rules.burnRate/slo/rule/unsnooze", + "alerting:slo.rules.burnRate/slo/rule/runSoon", + "alerting:slo.rules.burnRate/slo/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/slo/rule/deleteBackfill", + "alerting:slo.rules.burnRate/slo/alert/get", + "alerting:slo.rules.burnRate/slo/alert/find", + "alerting:slo.rules.burnRate/slo/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/slo/alert/getAlertSummary", + "alerting:slo.rules.burnRate/slo/alert/update", + "app:observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_all": Array [ + "login:", + "api:slo_write", + "api:slo_read", + "api:rac", + "app:slo", + "app:kibana", + "ui:catalogue/slo", + "ui:catalogue/observability", + "ui:navLinks/slo", + "ui:navLinks/kibana", + "saved_object:slo/bulk_get", + "saved_object:slo/get", + "saved_object:slo/find", + "saved_object:slo/open_point_in_time", + "saved_object:slo/close_point_in_time", + "saved_object:slo/create", + "saved_object:slo/bulk_create", + "saved_object:slo/update", + "saved_object:slo/bulk_update", + "saved_object:slo/delete", + "saved_object:slo/bulk_delete", + "saved_object:slo/share_to_space", + "saved_object:slo-settings/bulk_get", + "saved_object:slo-settings/get", + "saved_object:slo-settings/find", + "saved_object:slo-settings/open_point_in_time", + "saved_object:slo-settings/close_point_in_time", + "saved_object:slo-settings/create", + "saved_object:slo-settings/bulk_create", + "saved_object:slo-settings/update", + "saved_object:slo-settings/bulk_update", + "saved_object:slo-settings/delete", + "saved_object:slo-settings/bulk_delete", + "saved_object:slo-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:slo/read", + "ui:slo/write", + "alerting:slo.rules.burnRate/slo/rule/get", + "alerting:slo.rules.burnRate/slo/rule/getRuleState", + "alerting:slo.rules.burnRate/slo/rule/getAlertSummary", + "alerting:slo.rules.burnRate/slo/rule/getExecutionLog", + "alerting:slo.rules.burnRate/slo/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/slo/rule/find", + "alerting:slo.rules.burnRate/slo/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/slo/rule/getBackfill", + "alerting:slo.rules.burnRate/slo/rule/findBackfill", + "alerting:slo.rules.burnRate/slo/rule/create", + "alerting:slo.rules.burnRate/slo/rule/delete", + "alerting:slo.rules.burnRate/slo/rule/update", + "alerting:slo.rules.burnRate/slo/rule/updateApiKey", + "alerting:slo.rules.burnRate/slo/rule/enable", + "alerting:slo.rules.burnRate/slo/rule/disable", + "alerting:slo.rules.burnRate/slo/rule/muteAll", + "alerting:slo.rules.burnRate/slo/rule/unmuteAll", + "alerting:slo.rules.burnRate/slo/rule/muteAlert", + "alerting:slo.rules.burnRate/slo/rule/unmuteAlert", + "alerting:slo.rules.burnRate/slo/rule/snooze", + "alerting:slo.rules.burnRate/slo/rule/bulkEdit", + "alerting:slo.rules.burnRate/slo/rule/bulkDelete", + "alerting:slo.rules.burnRate/slo/rule/bulkEnable", + "alerting:slo.rules.burnRate/slo/rule/bulkDisable", + "alerting:slo.rules.burnRate/slo/rule/unsnooze", + "alerting:slo.rules.burnRate/slo/rule/runSoon", + "alerting:slo.rules.burnRate/slo/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/slo/rule/deleteBackfill", + "alerting:slo.rules.burnRate/slo/alert/get", + "alerting:slo.rules.burnRate/slo/alert/find", + "alerting:slo.rules.burnRate/slo/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/slo/alert/getAlertSummary", + "alerting:slo.rules.burnRate/slo/alert/update", + "app:observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_read": Array [ + "login:", + "api:slo_read", + "api:rac", + "app:slo", + "app:kibana", + "ui:catalogue/slo", + "ui:catalogue/observability", + "ui:navLinks/slo", + "ui:navLinks/kibana", + "saved_object:slo/bulk_get", + "saved_object:slo/get", + "saved_object:slo/find", + "saved_object:slo/open_point_in_time", + "saved_object:slo/close_point_in_time", + "saved_object:slo-settings/bulk_get", + "saved_object:slo-settings/get", + "saved_object:slo-settings/find", + "saved_object:slo-settings/open_point_in_time", + "saved_object:slo-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:slo/read", + "alerting:slo.rules.burnRate/slo/rule/get", + "alerting:slo.rules.burnRate/slo/rule/getRuleState", + "alerting:slo.rules.burnRate/slo/rule/getAlertSummary", + "alerting:slo.rules.burnRate/slo/rule/getExecutionLog", + "alerting:slo.rules.burnRate/slo/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/slo/rule/find", + "alerting:slo.rules.burnRate/slo/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/slo/rule/getBackfill", + "alerting:slo.rules.burnRate/slo/rule/findBackfill", + "alerting:slo.rules.burnRate/slo/alert/get", + "alerting:slo.rules.burnRate/slo/alert/find", + "alerting:slo.rules.burnRate/slo/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/slo/alert/getAlertSummary", + "app:observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "api:slo_read", + "api:rac", + "app:slo", + "app:kibana", + "ui:catalogue/slo", + "ui:catalogue/observability", + "ui:navLinks/slo", + "ui:navLinks/kibana", + "saved_object:slo/bulk_get", + "saved_object:slo/get", + "saved_object:slo/find", + "saved_object:slo/open_point_in_time", + "saved_object:slo/close_point_in_time", + "saved_object:slo-settings/bulk_get", + "saved_object:slo-settings/get", + "saved_object:slo-settings/find", + "saved_object:slo-settings/open_point_in_time", + "saved_object:slo-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:slo/read", + "alerting:slo.rules.burnRate/slo/rule/get", + "alerting:slo.rules.burnRate/slo/rule/getRuleState", + "alerting:slo.rules.burnRate/slo/rule/getAlertSummary", + "alerting:slo.rules.burnRate/slo/rule/getExecutionLog", + "alerting:slo.rules.burnRate/slo/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/slo/rule/find", + "alerting:slo.rules.burnRate/slo/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/slo/rule/getBackfill", + "alerting:slo.rules.burnRate/slo/rule/findBackfill", + "alerting:slo.rules.burnRate/slo/alert/get", + "alerting:slo.rules.burnRate/slo/alert/find", + "alerting:slo.rules.burnRate/slo/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/slo/alert/getAlertSummary", + "app:observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + }, + "uptime": Object { + "all": Array [ + "login:", + "api:uptime-read", + "api:uptime-write", + "api:lists-all", + "api:rac", + "app:uptime", + "app:kibana", + "app:synthetics", + "ui:catalogue/uptime", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/uptime", + "ui:navLinks/kibana", + "ui:navLinks/synthetics", + "saved_object:synthetics-dynamic-settings/bulk_get", + "saved_object:synthetics-dynamic-settings/get", + "saved_object:synthetics-dynamic-settings/find", + "saved_object:synthetics-dynamic-settings/open_point_in_time", + "saved_object:synthetics-dynamic-settings/close_point_in_time", + "saved_object:synthetics-dynamic-settings/create", + "saved_object:synthetics-dynamic-settings/bulk_create", + "saved_object:synthetics-dynamic-settings/update", + "saved_object:synthetics-dynamic-settings/bulk_update", + "saved_object:synthetics-dynamic-settings/delete", + "saved_object:synthetics-dynamic-settings/bulk_delete", + "saved_object:synthetics-dynamic-settings/share_to_space", + "saved_object:synthetics-monitor/bulk_get", + "saved_object:synthetics-monitor/get", + "saved_object:synthetics-monitor/find", + "saved_object:synthetics-monitor/open_point_in_time", + "saved_object:synthetics-monitor/close_point_in_time", + "saved_object:synthetics-monitor/create", + "saved_object:synthetics-monitor/bulk_create", + "saved_object:synthetics-monitor/update", + "saved_object:synthetics-monitor/bulk_update", + "saved_object:synthetics-monitor/delete", + "saved_object:synthetics-monitor/bulk_delete", + "saved_object:synthetics-monitor/share_to_space", + "saved_object:uptime-synthetics-api-key/bulk_get", + "saved_object:uptime-synthetics-api-key/get", + "saved_object:uptime-synthetics-api-key/find", + "saved_object:uptime-synthetics-api-key/open_point_in_time", + "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:uptime-synthetics-api-key/create", + "saved_object:uptime-synthetics-api-key/bulk_create", + "saved_object:uptime-synthetics-api-key/update", + "saved_object:uptime-synthetics-api-key/bulk_update", + "saved_object:uptime-synthetics-api-key/delete", + "saved_object:uptime-synthetics-api-key/bulk_delete", + "saved_object:uptime-synthetics-api-key/share_to_space", + "saved_object:synthetics-privates-locations/bulk_get", + "saved_object:synthetics-privates-locations/get", + "saved_object:synthetics-privates-locations/find", + "saved_object:synthetics-privates-locations/open_point_in_time", + "saved_object:synthetics-privates-locations/close_point_in_time", + "saved_object:synthetics-privates-locations/create", + "saved_object:synthetics-privates-locations/bulk_create", + "saved_object:synthetics-privates-locations/update", + "saved_object:synthetics-privates-locations/bulk_update", + "saved_object:synthetics-privates-locations/delete", + "saved_object:synthetics-privates-locations/bulk_delete", + "saved_object:synthetics-privates-locations/share_to_space", + "saved_object:synthetics-param/bulk_get", + "saved_object:synthetics-param/get", + "saved_object:synthetics-param/find", + "saved_object:synthetics-param/open_point_in_time", + "saved_object:synthetics-param/close_point_in_time", + "saved_object:synthetics-param/create", + "saved_object:synthetics-param/bulk_create", + "saved_object:synthetics-param/update", + "saved_object:synthetics-param/bulk_update", + "saved_object:synthetics-param/delete", + "saved_object:synthetics-param/bulk_delete", + "saved_object:synthetics-param/share_to_space", + "saved_object:uptime-dynamic-settings/bulk_get", + "saved_object:uptime-dynamic-settings/get", + "saved_object:uptime-dynamic-settings/find", + "saved_object:uptime-dynamic-settings/open_point_in_time", + "saved_object:uptime-dynamic-settings/close_point_in_time", + "saved_object:uptime-dynamic-settings/create", + "saved_object:uptime-dynamic-settings/bulk_create", + "saved_object:uptime-dynamic-settings/update", + "saved_object:uptime-dynamic-settings/bulk_update", + "saved_object:uptime-dynamic-settings/delete", + "saved_object:uptime-dynamic-settings/bulk_delete", + "saved_object:uptime-dynamic-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:uptime/save", + "ui:uptime/configureSettings", + "ui:uptime/show", + "ui:uptime/alerting:save", + "ui:uptime/elasticManagedLocationsEnabled", + "alerting:xpack.uptime.alerts.tls/uptime/rule/get", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/find", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/create", + "alerting:xpack.uptime.alerts.tls/uptime/rule/delete", + "alerting:xpack.uptime.alerts.tls/uptime/rule/update", + "alerting:xpack.uptime.alerts.tls/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.tls/uptime/rule/enable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/disable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.tls/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.tls/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.tls/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.tls/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/create", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/delete", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/update", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/enable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/disable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/create", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/delete", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/update", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/enable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/disable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/create", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/delete", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/update", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/enable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/disable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/get", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/find", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/create", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/delete", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/update", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/enable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/disable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/alert/get", + "alerting:xpack.uptime.alerts.tls/uptime/alert/find", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/alert/update", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/update", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/update", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/update", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/get", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/find", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "elastic_managed_locations_enabled": Array [ + "login:", + "ui:uptime/elasticManagedLocationsEnabled", + ], + "minimal_all": Array [ + "login:", + "api:uptime-read", + "api:uptime-write", + "api:lists-all", + "api:rac", + "app:uptime", + "app:kibana", + "app:synthetics", + "ui:catalogue/uptime", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/uptime", + "ui:navLinks/kibana", + "ui:navLinks/synthetics", + "saved_object:synthetics-dynamic-settings/bulk_get", + "saved_object:synthetics-dynamic-settings/get", + "saved_object:synthetics-dynamic-settings/find", + "saved_object:synthetics-dynamic-settings/open_point_in_time", + "saved_object:synthetics-dynamic-settings/close_point_in_time", + "saved_object:synthetics-dynamic-settings/create", + "saved_object:synthetics-dynamic-settings/bulk_create", + "saved_object:synthetics-dynamic-settings/update", + "saved_object:synthetics-dynamic-settings/bulk_update", + "saved_object:synthetics-dynamic-settings/delete", + "saved_object:synthetics-dynamic-settings/bulk_delete", + "saved_object:synthetics-dynamic-settings/share_to_space", + "saved_object:synthetics-monitor/bulk_get", + "saved_object:synthetics-monitor/get", + "saved_object:synthetics-monitor/find", + "saved_object:synthetics-monitor/open_point_in_time", + "saved_object:synthetics-monitor/close_point_in_time", + "saved_object:synthetics-monitor/create", + "saved_object:synthetics-monitor/bulk_create", + "saved_object:synthetics-monitor/update", + "saved_object:synthetics-monitor/bulk_update", + "saved_object:synthetics-monitor/delete", + "saved_object:synthetics-monitor/bulk_delete", + "saved_object:synthetics-monitor/share_to_space", + "saved_object:uptime-synthetics-api-key/bulk_get", + "saved_object:uptime-synthetics-api-key/get", + "saved_object:uptime-synthetics-api-key/find", + "saved_object:uptime-synthetics-api-key/open_point_in_time", + "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:uptime-synthetics-api-key/create", + "saved_object:uptime-synthetics-api-key/bulk_create", + "saved_object:uptime-synthetics-api-key/update", + "saved_object:uptime-synthetics-api-key/bulk_update", + "saved_object:uptime-synthetics-api-key/delete", + "saved_object:uptime-synthetics-api-key/bulk_delete", + "saved_object:uptime-synthetics-api-key/share_to_space", + "saved_object:synthetics-privates-locations/bulk_get", + "saved_object:synthetics-privates-locations/get", + "saved_object:synthetics-privates-locations/find", + "saved_object:synthetics-privates-locations/open_point_in_time", + "saved_object:synthetics-privates-locations/close_point_in_time", + "saved_object:synthetics-privates-locations/create", + "saved_object:synthetics-privates-locations/bulk_create", + "saved_object:synthetics-privates-locations/update", + "saved_object:synthetics-privates-locations/bulk_update", + "saved_object:synthetics-privates-locations/delete", + "saved_object:synthetics-privates-locations/bulk_delete", + "saved_object:synthetics-privates-locations/share_to_space", + "saved_object:synthetics-param/bulk_get", + "saved_object:synthetics-param/get", + "saved_object:synthetics-param/find", + "saved_object:synthetics-param/open_point_in_time", + "saved_object:synthetics-param/close_point_in_time", + "saved_object:synthetics-param/create", + "saved_object:synthetics-param/bulk_create", + "saved_object:synthetics-param/update", + "saved_object:synthetics-param/bulk_update", + "saved_object:synthetics-param/delete", + "saved_object:synthetics-param/bulk_delete", + "saved_object:synthetics-param/share_to_space", + "saved_object:uptime-dynamic-settings/bulk_get", + "saved_object:uptime-dynamic-settings/get", + "saved_object:uptime-dynamic-settings/find", + "saved_object:uptime-dynamic-settings/open_point_in_time", + "saved_object:uptime-dynamic-settings/close_point_in_time", + "saved_object:uptime-dynamic-settings/create", + "saved_object:uptime-dynamic-settings/bulk_create", + "saved_object:uptime-dynamic-settings/update", + "saved_object:uptime-dynamic-settings/bulk_update", + "saved_object:uptime-dynamic-settings/delete", + "saved_object:uptime-dynamic-settings/bulk_delete", + "saved_object:uptime-dynamic-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:uptime/save", + "ui:uptime/configureSettings", + "ui:uptime/show", + "ui:uptime/alerting:save", + "alerting:xpack.uptime.alerts.tls/uptime/rule/get", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/find", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/create", + "alerting:xpack.uptime.alerts.tls/uptime/rule/delete", + "alerting:xpack.uptime.alerts.tls/uptime/rule/update", + "alerting:xpack.uptime.alerts.tls/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.tls/uptime/rule/enable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/disable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.tls/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.tls/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.tls/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.tls/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.tls/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/create", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/delete", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/update", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/enable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/disable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/create", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/delete", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/update", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/enable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/disable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/create", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/delete", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/update", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/updateApiKey", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/enable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/disable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/muteAll", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unmuteAll", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/muteAlert", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unmuteAlert", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/snooze", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkEdit", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkDelete", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkEnable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/bulkDisable", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/unsnooze", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/runSoon", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/scheduleBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/create", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/delete", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/update", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/enable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/disable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/muteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/muteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/snooze", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/unsnooze", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/runSoon", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/deleteBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/get", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/find", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/create", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/delete", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/update", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/updateApiKey", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/enable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/disable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/muteAll", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unmuteAll", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/muteAlert", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unmuteAlert", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/snooze", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkEdit", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkDelete", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkEnable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/bulkDisable", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/unsnooze", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/runSoon", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/scheduleBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/deleteBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/alert/get", + "alerting:xpack.uptime.alerts.tls/uptime/alert/find", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/alert/update", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/update", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/update", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/update", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/update", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/get", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/find", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/update", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "ui:observability/write", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/rule/create", + "alerting:slo.rules.burnRate/observability/rule/delete", + "alerting:slo.rules.burnRate/observability/rule/update", + "alerting:slo.rules.burnRate/observability/rule/updateApiKey", + "alerting:slo.rules.burnRate/observability/rule/enable", + "alerting:slo.rules.burnRate/observability/rule/disable", + "alerting:slo.rules.burnRate/observability/rule/muteAll", + "alerting:slo.rules.burnRate/observability/rule/unmuteAll", + "alerting:slo.rules.burnRate/observability/rule/muteAlert", + "alerting:slo.rules.burnRate/observability/rule/unmuteAlert", + "alerting:slo.rules.burnRate/observability/rule/snooze", + "alerting:slo.rules.burnRate/observability/rule/bulkEdit", + "alerting:slo.rules.burnRate/observability/rule/bulkDelete", + "alerting:slo.rules.burnRate/observability/rule/bulkEnable", + "alerting:slo.rules.burnRate/observability/rule/bulkDisable", + "alerting:slo.rules.burnRate/observability/rule/unsnooze", + "alerting:slo.rules.burnRate/observability/rule/runSoon", + "alerting:slo.rules.burnRate/observability/rule/scheduleBackfill", + "alerting:slo.rules.burnRate/observability/rule/deleteBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/create", + "alerting:observability.rules.custom_threshold/observability/rule/delete", + "alerting:observability.rules.custom_threshold/observability/rule/update", + "alerting:observability.rules.custom_threshold/observability/rule/updateApiKey", + "alerting:observability.rules.custom_threshold/observability/rule/enable", + "alerting:observability.rules.custom_threshold/observability/rule/disable", + "alerting:observability.rules.custom_threshold/observability/rule/muteAll", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAll", + "alerting:observability.rules.custom_threshold/observability/rule/muteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/unmuteAlert", + "alerting:observability.rules.custom_threshold/observability/rule/snooze", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEdit", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDelete", + "alerting:observability.rules.custom_threshold/observability/rule/bulkEnable", + "alerting:observability.rules.custom_threshold/observability/rule/bulkDisable", + "alerting:observability.rules.custom_threshold/observability/rule/unsnooze", + "alerting:observability.rules.custom_threshold/observability/rule/runSoon", + "alerting:observability.rules.custom_threshold/observability/rule/scheduleBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/deleteBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/create", + "alerting:.es-query/observability/rule/delete", + "alerting:.es-query/observability/rule/update", + "alerting:.es-query/observability/rule/updateApiKey", + "alerting:.es-query/observability/rule/enable", + "alerting:.es-query/observability/rule/disable", + "alerting:.es-query/observability/rule/muteAll", + "alerting:.es-query/observability/rule/unmuteAll", + "alerting:.es-query/observability/rule/muteAlert", + "alerting:.es-query/observability/rule/unmuteAlert", + "alerting:.es-query/observability/rule/snooze", + "alerting:.es-query/observability/rule/bulkEdit", + "alerting:.es-query/observability/rule/bulkDelete", + "alerting:.es-query/observability/rule/bulkEnable", + "alerting:.es-query/observability/rule/bulkDisable", + "alerting:.es-query/observability/rule/unsnooze", + "alerting:.es-query/observability/rule/runSoon", + "alerting:.es-query/observability/rule/scheduleBackfill", + "alerting:.es-query/observability/rule/deleteBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/create", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/delete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/updateApiKey", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/enable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/disable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAll", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/muteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unmuteAlert", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/snooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEdit", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDelete", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkEnable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/bulkDisable", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/unsnooze", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/runSoon", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/scheduleBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/deleteBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/create", + "alerting:metrics.alert.inventory.threshold/observability/rule/delete", + "alerting:metrics.alert.inventory.threshold/observability/rule/update", + "alerting:metrics.alert.inventory.threshold/observability/rule/updateApiKey", + "alerting:metrics.alert.inventory.threshold/observability/rule/enable", + "alerting:metrics.alert.inventory.threshold/observability/rule/disable", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAll", + "alerting:metrics.alert.inventory.threshold/observability/rule/muteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/unmuteAlert", + "alerting:metrics.alert.inventory.threshold/observability/rule/snooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEdit", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDelete", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkEnable", + "alerting:metrics.alert.inventory.threshold/observability/rule/bulkDisable", + "alerting:metrics.alert.inventory.threshold/observability/rule/unsnooze", + "alerting:metrics.alert.inventory.threshold/observability/rule/runSoon", + "alerting:metrics.alert.inventory.threshold/observability/rule/scheduleBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/deleteBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/create", + "alerting:apm.error_rate/observability/rule/delete", + "alerting:apm.error_rate/observability/rule/update", + "alerting:apm.error_rate/observability/rule/updateApiKey", + "alerting:apm.error_rate/observability/rule/enable", + "alerting:apm.error_rate/observability/rule/disable", + "alerting:apm.error_rate/observability/rule/muteAll", + "alerting:apm.error_rate/observability/rule/unmuteAll", + "alerting:apm.error_rate/observability/rule/muteAlert", + "alerting:apm.error_rate/observability/rule/unmuteAlert", + "alerting:apm.error_rate/observability/rule/snooze", + "alerting:apm.error_rate/observability/rule/bulkEdit", + "alerting:apm.error_rate/observability/rule/bulkDelete", + "alerting:apm.error_rate/observability/rule/bulkEnable", + "alerting:apm.error_rate/observability/rule/bulkDisable", + "alerting:apm.error_rate/observability/rule/unsnooze", + "alerting:apm.error_rate/observability/rule/runSoon", + "alerting:apm.error_rate/observability/rule/scheduleBackfill", + "alerting:apm.error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/create", + "alerting:apm.transaction_error_rate/observability/rule/delete", + "alerting:apm.transaction_error_rate/observability/rule/update", + "alerting:apm.transaction_error_rate/observability/rule/updateApiKey", + "alerting:apm.transaction_error_rate/observability/rule/enable", + "alerting:apm.transaction_error_rate/observability/rule/disable", + "alerting:apm.transaction_error_rate/observability/rule/muteAll", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAll", + "alerting:apm.transaction_error_rate/observability/rule/muteAlert", + "alerting:apm.transaction_error_rate/observability/rule/unmuteAlert", + "alerting:apm.transaction_error_rate/observability/rule/snooze", + "alerting:apm.transaction_error_rate/observability/rule/bulkEdit", + "alerting:apm.transaction_error_rate/observability/rule/bulkDelete", + "alerting:apm.transaction_error_rate/observability/rule/bulkEnable", + "alerting:apm.transaction_error_rate/observability/rule/bulkDisable", + "alerting:apm.transaction_error_rate/observability/rule/unsnooze", + "alerting:apm.transaction_error_rate/observability/rule/runSoon", + "alerting:apm.transaction_error_rate/observability/rule/scheduleBackfill", + "alerting:apm.transaction_error_rate/observability/rule/deleteBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/create", + "alerting:apm.transaction_duration/observability/rule/delete", + "alerting:apm.transaction_duration/observability/rule/update", + "alerting:apm.transaction_duration/observability/rule/updateApiKey", + "alerting:apm.transaction_duration/observability/rule/enable", + "alerting:apm.transaction_duration/observability/rule/disable", + "alerting:apm.transaction_duration/observability/rule/muteAll", + "alerting:apm.transaction_duration/observability/rule/unmuteAll", + "alerting:apm.transaction_duration/observability/rule/muteAlert", + "alerting:apm.transaction_duration/observability/rule/unmuteAlert", + "alerting:apm.transaction_duration/observability/rule/snooze", + "alerting:apm.transaction_duration/observability/rule/bulkEdit", + "alerting:apm.transaction_duration/observability/rule/bulkDelete", + "alerting:apm.transaction_duration/observability/rule/bulkEnable", + "alerting:apm.transaction_duration/observability/rule/bulkDisable", + "alerting:apm.transaction_duration/observability/rule/unsnooze", + "alerting:apm.transaction_duration/observability/rule/runSoon", + "alerting:apm.transaction_duration/observability/rule/scheduleBackfill", + "alerting:apm.transaction_duration/observability/rule/deleteBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/create", + "alerting:apm.anomaly/observability/rule/delete", + "alerting:apm.anomaly/observability/rule/update", + "alerting:apm.anomaly/observability/rule/updateApiKey", + "alerting:apm.anomaly/observability/rule/enable", + "alerting:apm.anomaly/observability/rule/disable", + "alerting:apm.anomaly/observability/rule/muteAll", + "alerting:apm.anomaly/observability/rule/unmuteAll", + "alerting:apm.anomaly/observability/rule/muteAlert", + "alerting:apm.anomaly/observability/rule/unmuteAlert", + "alerting:apm.anomaly/observability/rule/snooze", + "alerting:apm.anomaly/observability/rule/bulkEdit", + "alerting:apm.anomaly/observability/rule/bulkDelete", + "alerting:apm.anomaly/observability/rule/bulkEnable", + "alerting:apm.anomaly/observability/rule/bulkDisable", + "alerting:apm.anomaly/observability/rule/unsnooze", + "alerting:apm.anomaly/observability/rule/runSoon", + "alerting:apm.anomaly/observability/rule/scheduleBackfill", + "alerting:apm.anomaly/observability/rule/deleteBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:slo.rules.burnRate/observability/alert/update", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/update", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/update", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/update", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/update", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/update", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/update", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/update", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/update", + ], + "minimal_read": Array [ + "login:", + "api:uptime-read", + "api:lists-read", + "api:rac", + "app:uptime", + "app:kibana", + "app:synthetics", + "ui:catalogue/uptime", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/uptime", + "ui:navLinks/kibana", + "ui:navLinks/synthetics", + "saved_object:synthetics-param/bulk_get", + "saved_object:synthetics-param/get", + "saved_object:synthetics-param/find", + "saved_object:synthetics-param/open_point_in_time", + "saved_object:synthetics-param/close_point_in_time", + "saved_object:synthetics-dynamic-settings/bulk_get", + "saved_object:synthetics-dynamic-settings/get", + "saved_object:synthetics-dynamic-settings/find", + "saved_object:synthetics-dynamic-settings/open_point_in_time", + "saved_object:synthetics-dynamic-settings/close_point_in_time", + "saved_object:synthetics-monitor/bulk_get", + "saved_object:synthetics-monitor/get", + "saved_object:synthetics-monitor/find", + "saved_object:synthetics-monitor/open_point_in_time", + "saved_object:synthetics-monitor/close_point_in_time", + "saved_object:uptime-synthetics-api-key/bulk_get", + "saved_object:uptime-synthetics-api-key/get", + "saved_object:uptime-synthetics-api-key/find", + "saved_object:uptime-synthetics-api-key/open_point_in_time", + "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:synthetics-privates-locations/bulk_get", + "saved_object:synthetics-privates-locations/get", + "saved_object:synthetics-privates-locations/find", + "saved_object:synthetics-privates-locations/open_point_in_time", + "saved_object:synthetics-privates-locations/close_point_in_time", + "saved_object:uptime-dynamic-settings/bulk_get", + "saved_object:uptime-dynamic-settings/get", + "saved_object:uptime-dynamic-settings/find", + "saved_object:uptime-dynamic-settings/open_point_in_time", + "saved_object:uptime-dynamic-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:uptime/show", + "ui:uptime/alerting:save", + "alerting:xpack.uptime.alerts.tls/uptime/rule/get", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/find", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/get", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/find", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/alert/get", + "alerting:xpack.uptime.alerts.tls/uptime/alert/find", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/get", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/find", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + "read": Array [ + "login:", + "api:uptime-read", + "api:lists-read", + "api:rac", + "app:uptime", + "app:kibana", + "app:synthetics", + "ui:catalogue/uptime", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/uptime", + "ui:navLinks/kibana", + "ui:navLinks/synthetics", + "saved_object:synthetics-param/bulk_get", + "saved_object:synthetics-param/get", + "saved_object:synthetics-param/find", + "saved_object:synthetics-param/open_point_in_time", + "saved_object:synthetics-param/close_point_in_time", + "saved_object:synthetics-dynamic-settings/bulk_get", + "saved_object:synthetics-dynamic-settings/get", + "saved_object:synthetics-dynamic-settings/find", + "saved_object:synthetics-dynamic-settings/open_point_in_time", + "saved_object:synthetics-dynamic-settings/close_point_in_time", + "saved_object:synthetics-monitor/bulk_get", + "saved_object:synthetics-monitor/get", + "saved_object:synthetics-monitor/find", + "saved_object:synthetics-monitor/open_point_in_time", + "saved_object:synthetics-monitor/close_point_in_time", + "saved_object:uptime-synthetics-api-key/bulk_get", + "saved_object:uptime-synthetics-api-key/get", + "saved_object:uptime-synthetics-api-key/find", + "saved_object:uptime-synthetics-api-key/open_point_in_time", + "saved_object:uptime-synthetics-api-key/close_point_in_time", + "saved_object:synthetics-privates-locations/bulk_get", + "saved_object:synthetics-privates-locations/get", + "saved_object:synthetics-privates-locations/find", + "saved_object:synthetics-privates-locations/open_point_in_time", + "saved_object:synthetics-privates-locations/close_point_in_time", + "saved_object:uptime-dynamic-settings/bulk_get", + "saved_object:uptime-dynamic-settings/get", + "saved_object:uptime-dynamic-settings/find", + "saved_object:uptime-dynamic-settings/open_point_in_time", + "saved_object:uptime-dynamic-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:uptime/show", + "ui:uptime/alerting:save", + "alerting:xpack.uptime.alerts.tls/uptime/rule/get", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tls/uptime/rule/find", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleState", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getExecutionLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getActionErrorLog", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/getBackfill", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/rule/findBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/get", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleState", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getExecutionLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getActionErrorLog", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/find", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getRuleExecutionKPI", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/getBackfill", + "alerting:xpack.synthetics.alerts.tls/uptime/rule/findBackfill", + "alerting:xpack.uptime.alerts.tls/uptime/alert/get", + "alerting:xpack.uptime.alerts.tls/uptime/alert/find", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tls/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/get", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/find", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.tlsCertificate/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/get", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/find", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.uptime.alerts.durationAnomaly/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/get", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/find", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.monitorStatus/uptime/alert/getAlertSummary", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/get", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/find", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAuthorizedAlertsIndices", + "alerting:xpack.synthetics.alerts.tls/uptime/alert/getAlertSummary", + "app:observability", + "ui:catalogue/observability", + "ui:navLinks/observability", + "ui:observability/read", + "alerting:slo.rules.burnRate/observability/rule/get", + "alerting:slo.rules.burnRate/observability/rule/getRuleState", + "alerting:slo.rules.burnRate/observability/rule/getAlertSummary", + "alerting:slo.rules.burnRate/observability/rule/getExecutionLog", + "alerting:slo.rules.burnRate/observability/rule/getActionErrorLog", + "alerting:slo.rules.burnRate/observability/rule/find", + "alerting:slo.rules.burnRate/observability/rule/getRuleExecutionKPI", + "alerting:slo.rules.burnRate/observability/rule/getBackfill", + "alerting:slo.rules.burnRate/observability/rule/findBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/get", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleState", + "alerting:observability.rules.custom_threshold/observability/rule/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/rule/getExecutionLog", + "alerting:observability.rules.custom_threshold/observability/rule/getActionErrorLog", + "alerting:observability.rules.custom_threshold/observability/rule/find", + "alerting:observability.rules.custom_threshold/observability/rule/getRuleExecutionKPI", + "alerting:observability.rules.custom_threshold/observability/rule/getBackfill", + "alerting:observability.rules.custom_threshold/observability/rule/findBackfill", + "alerting:.es-query/observability/rule/get", + "alerting:.es-query/observability/rule/getRuleState", + "alerting:.es-query/observability/rule/getAlertSummary", + "alerting:.es-query/observability/rule/getExecutionLog", + "alerting:.es-query/observability/rule/getActionErrorLog", + "alerting:.es-query/observability/rule/find", + "alerting:.es-query/observability/rule/getRuleExecutionKPI", + "alerting:.es-query/observability/rule/getBackfill", + "alerting:.es-query/observability/rule/findBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleState", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getExecutionLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getActionErrorLog", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getRuleExecutionKPI", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/getBackfill", + "alerting:xpack.ml.anomaly_detection_alert/observability/rule/findBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/get", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleState", + "alerting:metrics.alert.inventory.threshold/observability/rule/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/rule/getExecutionLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/getActionErrorLog", + "alerting:metrics.alert.inventory.threshold/observability/rule/find", + "alerting:metrics.alert.inventory.threshold/observability/rule/getRuleExecutionKPI", + "alerting:metrics.alert.inventory.threshold/observability/rule/getBackfill", + "alerting:metrics.alert.inventory.threshold/observability/rule/findBackfill", + "alerting:apm.error_rate/observability/rule/get", + "alerting:apm.error_rate/observability/rule/getRuleState", + "alerting:apm.error_rate/observability/rule/getAlertSummary", + "alerting:apm.error_rate/observability/rule/getExecutionLog", + "alerting:apm.error_rate/observability/rule/getActionErrorLog", + "alerting:apm.error_rate/observability/rule/find", + "alerting:apm.error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.error_rate/observability/rule/getBackfill", + "alerting:apm.error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_error_rate/observability/rule/get", + "alerting:apm.transaction_error_rate/observability/rule/getRuleState", + "alerting:apm.transaction_error_rate/observability/rule/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/rule/getExecutionLog", + "alerting:apm.transaction_error_rate/observability/rule/getActionErrorLog", + "alerting:apm.transaction_error_rate/observability/rule/find", + "alerting:apm.transaction_error_rate/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_error_rate/observability/rule/getBackfill", + "alerting:apm.transaction_error_rate/observability/rule/findBackfill", + "alerting:apm.transaction_duration/observability/rule/get", + "alerting:apm.transaction_duration/observability/rule/getRuleState", + "alerting:apm.transaction_duration/observability/rule/getAlertSummary", + "alerting:apm.transaction_duration/observability/rule/getExecutionLog", + "alerting:apm.transaction_duration/observability/rule/getActionErrorLog", + "alerting:apm.transaction_duration/observability/rule/find", + "alerting:apm.transaction_duration/observability/rule/getRuleExecutionKPI", + "alerting:apm.transaction_duration/observability/rule/getBackfill", + "alerting:apm.transaction_duration/observability/rule/findBackfill", + "alerting:apm.anomaly/observability/rule/get", + "alerting:apm.anomaly/observability/rule/getRuleState", + "alerting:apm.anomaly/observability/rule/getAlertSummary", + "alerting:apm.anomaly/observability/rule/getExecutionLog", + "alerting:apm.anomaly/observability/rule/getActionErrorLog", + "alerting:apm.anomaly/observability/rule/find", + "alerting:apm.anomaly/observability/rule/getRuleExecutionKPI", + "alerting:apm.anomaly/observability/rule/getBackfill", + "alerting:apm.anomaly/observability/rule/findBackfill", + "alerting:slo.rules.burnRate/observability/alert/get", + "alerting:slo.rules.burnRate/observability/alert/find", + "alerting:slo.rules.burnRate/observability/alert/getAuthorizedAlertsIndices", + "alerting:slo.rules.burnRate/observability/alert/getAlertSummary", + "alerting:observability.rules.custom_threshold/observability/alert/get", + "alerting:observability.rules.custom_threshold/observability/alert/find", + "alerting:observability.rules.custom_threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:observability.rules.custom_threshold/observability/alert/getAlertSummary", + "alerting:.es-query/observability/alert/get", + "alerting:.es-query/observability/alert/find", + "alerting:.es-query/observability/alert/getAuthorizedAlertsIndices", + "alerting:.es-query/observability/alert/getAlertSummary", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/get", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/find", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAuthorizedAlertsIndices", + "alerting:xpack.ml.anomaly_detection_alert/observability/alert/getAlertSummary", + "alerting:metrics.alert.inventory.threshold/observability/alert/get", + "alerting:metrics.alert.inventory.threshold/observability/alert/find", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAuthorizedAlertsIndices", + "alerting:metrics.alert.inventory.threshold/observability/alert/getAlertSummary", + "alerting:apm.error_rate/observability/alert/get", + "alerting:apm.error_rate/observability/alert/find", + "alerting:apm.error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_error_rate/observability/alert/get", + "alerting:apm.transaction_error_rate/observability/alert/find", + "alerting:apm.transaction_error_rate/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_error_rate/observability/alert/getAlertSummary", + "alerting:apm.transaction_duration/observability/alert/get", + "alerting:apm.transaction_duration/observability/alert/find", + "alerting:apm.transaction_duration/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.transaction_duration/observability/alert/getAlertSummary", + "alerting:apm.anomaly/observability/alert/get", + "alerting:apm.anomaly/observability/alert/find", + "alerting:apm.anomaly/observability/alert/getAuthorizedAlertsIndices", + "alerting:apm.anomaly/observability/alert/getAlertSummary", + ], + }, + } + `); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/index.ts new file mode 100644 index 00000000000000..5271f15b683f13 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/platform_security/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Platform security APIs', function () { + loadTestFile(require.resolve('./authorization')); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts index d8caf935906d0d..02ac42ad6e81ae 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/slos/create_slo.ts @@ -15,6 +15,7 @@ import { getSLOSummaryPipelineId, SLO_SUMMARY_TEMP_INDEX_NAME, } from '@kbn/slo-plugin/common/constants'; +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; interface ExpectedTransforms { @@ -50,6 +51,8 @@ export default function ({ getService }: FtrProviderContext) { const sloApi = getService('sloApi'); const kibanaServer = getService('kibanaServer'); const transform = getService('transform'); + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); describe('create_slo', () => { // DATE_VIEW should match the index template: @@ -57,6 +60,7 @@ export default function ({ getService }: FtrProviderContext) { const DATE_VIEW = 'kbn-data-forge-fake_hosts'; const DATA_VIEW_ID = 'data-view-id'; let infraDataIndex: string; + let roleAuthc: RoleCredentials; before(async () => { infraDataIndex = await generate({ @@ -70,6 +74,7 @@ export default function ({ getService }: FtrProviderContext) { title: DATE_VIEW, }); await kibanaServer.savedObjects.cleanStandardList(); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); }); after(async () => { @@ -78,57 +83,57 @@ export default function ({ getService }: FtrProviderContext) { }); await supertest .delete('/api/observability/slos/my-custom-id1') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()); await supertest .delete('/api/observability/slos/my-custom-id2') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()); await supertest .delete('/api/observability/slos/my-custom-id3') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()); await supertest .delete('/api/observability/slos/my-custom-id4') - .set('kbn-xsrf', 'foo') - .set('x-elastic-internal-origin', 'foo'); + .set(svlCommonApi.getInternalRequestHeader()); await esDeleteAllIndices([infraDataIndex]); await cleanup({ esClient, logger }); await kibanaServer.savedObjects.clean({ types: [SO_SLO_TYPE] }); await transform.api.cleanTransformIndices(); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('non partition by SLO', () => { const sloId = 'my-custom-id1'; before(async () => { - await sloApi.create({ - id: sloId, - name: 'my custom name', - description: 'my custom description', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + await sloApi.create( + { + id: sloId, + name: 'my custom name', + description: 'my custom description', + indicator: { + type: 'sli.kql.custom', + params: { + index: infraDataIndex, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: ALL_VALUE, }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: ALL_VALUE, - }); + roleAuthc + ); }); it('saves the SLO definition', async () => { @@ -158,6 +163,7 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'foo') .set('x-elastic-internal-origin', 'foo') .set('elastic-api-version', '1') + .set(roleAuthc.apiKeyHeader) .send(); transform.api.assertResponseStatusCode(200, status, body); assertTransformsResponseBody(body, expectedTransforms); @@ -182,7 +188,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('finds the created SLO', async () => { - const createdSlo = await sloApi.waitForSloCreated({ sloId }); + const createdSlo = await sloApi.waitForSloCreated({ + sloId, + roleAuthc, + }); expect(createdSlo.id).to.be(sloId); expect(createdSlo.groupBy).to.be(ALL_VALUE); }); @@ -191,32 +200,38 @@ export default function ({ getService }: FtrProviderContext) { describe('SLO with long description', () => { it('creates an SLO with description over 256 characters', async () => { const sloId = 'my-custom-id2'; - await sloApi.create({ - id: sloId, - name: 'my super long SLO name and description', - description: - 'Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. ', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + await sloApi.create( + { + id: sloId, + name: 'my super long SLO name and description', + description: + 'Lorem Ipsum has been the industry standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. ', + indicator: { + type: 'sli.kql.custom', + params: { + index: infraDataIndex, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: '*', }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: '*', - }); + roleAuthc + ); - const createdSlo = await sloApi.waitForSloCreated({ sloId }); + const createdSlo = await sloApi.waitForSloCreated({ + sloId, + roleAuthc, + }); expect(createdSlo.id).to.be(sloId); }); }); @@ -224,31 +239,37 @@ export default function ({ getService }: FtrProviderContext) { describe('SLO with special characters in the description', () => { it("creates an SLO that has ' character in the description", async () => { const sloId = 'my-custom-id3'; - await sloApi.create({ - id: sloId, - name: 'my SLO with weird characters in the description', - description: - "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.", - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + await sloApi.create( + { + id: sloId, + name: 'my SLO with weird characters in the description', + description: + "Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged.", + indicator: { + type: 'sli.kql.custom', + params: { + index: infraDataIndex, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: '*', }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: '*', + roleAuthc + ); + const createdSlo = await sloApi.waitForSloCreated({ + sloId, + roleAuthc, }); - const createdSlo = await sloApi.waitForSloCreated({ sloId }); expect(createdSlo.id).to.be(sloId); }); }); @@ -256,30 +277,36 @@ export default function ({ getService }: FtrProviderContext) { describe('partition by SLO', () => { it('creates a partition by SLO', async () => { const sloId = 'my-custom-id4'; - await sloApi.create({ - id: sloId, - name: 'Group by SLO', - description: 'This is a group by SLO.', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + await sloApi.create( + { + id: sloId, + name: 'Group by SLO', + description: 'This is a group by SLO.', + indicator: { + type: 'sli.kql.custom', + params: { + index: infraDataIndex, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: 'host.name', }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: 'host.name', + roleAuthc + ); + const createdSlo = await sloApi.waitForSloCreated({ + sloId, + roleAuthc, }); - const createdSlo = await sloApi.waitForSloCreated({ sloId }); expect(createdSlo.id).to.be(sloId); expect(createdSlo.groupBy).not.to.be(ALL_VALUE); expect(createdSlo.groupBy).to.be('host.name'); @@ -320,6 +347,7 @@ export default function ({ getService }: FtrProviderContext) { .set('kbn-xsrf', 'foo') .set('x-elastic-internal-origin', 'foo') .set('elastic-api-version', '1') + .set(roleAuthc.apiKeyHeader) .send(); transform.api.assertResponseStatusCode(200, status, body); assertTransformsResponseBody(body, expectedTransforms); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts index f49cd75a23edc0..6546fc585fb3e6 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/slos/delete_slo.ts @@ -18,9 +18,9 @@ import { SLO_DESTINATION_INDEX_PATTERN, SLO_SUMMARY_DESTINATION_INDEX_PATTERN, } from '@kbn/slo-plugin/common/constants'; -import { ElasticsearchClient } from '@kbn/core/server'; - +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; + export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const logger = getService('log'); @@ -31,12 +31,9 @@ export default function ({ getService }: FtrProviderContext) { const esDeleteAllIndices = getService('esDeleteAllIndices'); const dataViewApi = getService('dataViewApi'); + const svlUserManager = getService('svlUserManager'); - const fetchSloSummaryPipeline = async ( - client: ElasticsearchClient, - sloId: string, - sloRevision: number - ) => { + const fetchSloSummaryPipeline = async (sloId: string, sloRevision: number) => { try { return await esClient.ingest.getPipeline({ id: getSLOSummaryPipelineId(sloId, sloRevision), @@ -55,6 +52,7 @@ export default function ({ getService }: FtrProviderContext) { const DATA_VIEW_ID = 'data-view-id'; let infraDataIndex: string; let sloId: string; + let roleAuthc: RoleCredentials; before(async () => { await sloApi.deleteAllSLOs(); @@ -70,6 +68,7 @@ export default function ({ getService }: FtrProviderContext) { title: DATE_VIEW, }); await kibanaServer.savedObjects.cleanStandardList(); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); }); after(async () => { @@ -79,34 +78,38 @@ export default function ({ getService }: FtrProviderContext) { await sloApi.deleteAllSLOs(); await esDeleteAllIndices([infraDataIndex]); await cleanup({ esClient, logger }); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); describe('non partition by SLO', () => { it('deletes the SLO definition, transforms, ingest pipeline and data', async () => { - const createdSlo = await sloApi.create({ - name: 'my custom name', - description: 'my custom description', - indicator: { - type: 'sli.kql.custom', - params: { - index: infraDataIndex, - good: 'system.cpu.total.norm.pct > 1', - total: 'system.cpu.total.norm.pct: *', - timestampField: '@timestamp', + const createdSlo = await sloApi.create( + { + name: 'my custom name', + description: 'my custom description', + indicator: { + type: 'sli.kql.custom', + params: { + index: infraDataIndex, + good: 'system.cpu.total.norm.pct > 1', + total: 'system.cpu.total.norm.pct: *', + timestampField: '@timestamp', + }, }, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.999, + }, + groupBy: ALL_VALUE, }, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.999, - }, - groupBy: ALL_VALUE, - }); + roleAuthc + ); sloId = createdSlo.id; - await sloApi.waitForSloCreated({ sloId }); + await sloApi.waitForSloCreated({ sloId, roleAuthc }); // Saved Object const savedObject = await kibanaServer.savedObjects.find({ @@ -123,7 +126,7 @@ export default function ({ getService }: FtrProviderContext) { await transform.api.waitForTransformToExist(sloSummaryTransformId); // Ingest pipeline - const pipelineResponse = await fetchSloSummaryPipeline(esClient, sloId, sloRevision); + const pipelineResponse = await fetchSloSummaryPipeline(sloId, sloRevision); expect(pipelineResponse[getSLOSummaryPipelineId(sloId, sloRevision)]).not.to.be(undefined); // RollUp and Summary data @@ -140,7 +143,10 @@ export default function ({ getService }: FtrProviderContext) { expect(sloSummaryData.hits.hits.length > 0).to.be(true); // Delete the SLO - const response = await sloApi.waitForSloToBeDeleted(sloId); + const response = await sloApi.waitForSloToBeDeleted({ + sloId, + roleAuthc, + }); expect(response.status).to.be(204); // Saved object definition diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts b/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts index 75d8ae3af1f3c0..7ce23be8fb4fca 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/slos/fetch_historical_summary.ts @@ -13,22 +13,26 @@ import { import { ALL_VALUE } from '@kbn/slo-schema'; import moment from 'moment'; +import { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getService }: FtrProviderContext) { const esClient = getService('es'); const esDeleteAllIndices = getService('esDeleteAllIndices'); const sloApi = getService('sloApi'); + const svlUserManager = getService('svlUserManager'); const SLO_ID = 'slo-fake-1'; - // Failing: See https://github.com/elastic/kibana/issues/183748 - describe.skip('fetch historical summary', () => { + describe('fetch historical summary', () => { + let roleAuthc: RoleCredentials; + before(async () => { const now = moment().startOf('minute'); const curr = now.clone().subtract(30, 'days'); const end = now.clone().add(5, 'minutes'); const batchOperations = []; + while (curr.isSameOrBefore(end)) { batchOperations.push([ { index: { _index: SLO_DESTINATION_INDEX_NAME } }, @@ -55,31 +59,36 @@ export default function ({ getService }: FtrProviderContext) { }); await esClient.indices.refresh({ index: SLO_DESTINATION_INDEX_NAME }); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); }); after(async () => { await esDeleteAllIndices(SLO_DESTINATION_INDEX_PATTERN); + await svlUserManager.invalidateApiKeyForRole(roleAuthc); }); it('computes the historical summary for a rolling occurrences SLO', async () => { - const response = await sloApi.fetchHistoricalSummary({ - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'occurrences', - objective: { - target: 0.9, + const response = await sloApi.fetchHistoricalSummary( + { + list: [ + { + sloId: SLO_ID, + instanceId: ALL_VALUE, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'occurrences', + objective: { + target: 0.9, + }, + groupBy: ALL_VALUE, + revision: 1, }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }); + ], + }, + roleAuthc + ); expect(response[0].sloId).to.eql(SLO_ID); expect(response[0].instanceId).to.eql(ALL_VALUE); const numberOfBuckets = response[0].data.length; @@ -96,26 +105,29 @@ export default function ({ getService }: FtrProviderContext) { }); it('computes the historical summary for a rolling timeslices SLO', async () => { - const response = await sloApi.fetchHistoricalSummary({ - list: [ - { - sloId: SLO_ID, - instanceId: ALL_VALUE, - timeWindow: { - duration: '7d', - type: 'rolling', - }, - budgetingMethod: 'timeslices', - objective: { - target: 0.9, - timesliceTarget: 0.8, - timesliceWindow: '1m', + const response = await sloApi.fetchHistoricalSummary( + { + list: [ + { + sloId: SLO_ID, + instanceId: ALL_VALUE, + timeWindow: { + duration: '7d', + type: 'rolling', + }, + budgetingMethod: 'timeslices', + objective: { + target: 0.9, + timesliceTarget: 0.8, + timesliceWindow: '1m', + }, + groupBy: ALL_VALUE, + revision: 1, }, - groupBy: ALL_VALUE, - revision: 1, - }, - ], - }); + ], + }, + roleAuthc + ); expect(response[0].sloId).to.eql(SLO_ID); expect(response[0].instanceId).to.eql(ALL_VALUE); const numberOfBuckets = response[0].data.length; diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/snapshot_telemetry.ts b/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/snapshot_telemetry.ts index f0fc2a357156e6..d0986e1b6d7ae9 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/snapshot_telemetry.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/snapshot_telemetry.ts @@ -12,19 +12,29 @@ import xpackRootTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/sch import ossPluginsTelemetrySchema from '@kbn/telemetry-plugin/schema/oss_plugins.json'; import xpackPluginsTelemetrySchema from '@kbn/telemetry-collection-xpack-plugin/schema/xpack_plugins.json'; import { assertTelemetryPayload } from '@kbn/telemetry-tools'; +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; import type { UsageStatsPayloadTestFriendly } from '../../../../../test/api_integration/services/usage_api'; export default function ({ getService }: FtrProviderContext) { const usageApi = getService('usageAPI'); + const svlUserManager = getService('svlUserManager'); describe('Snapshot telemetry', function () { let stats: UsageStatsPayloadTestFriendly; + let roleAuthc: RoleCredentials; before(async () => { - const [unencryptedPayload] = await usageApi.getTelemetryStats({ unencrypted: true }); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + const [unencryptedPayload] = await usageApi.getTelemetryStats( + { unencrypted: true }, + { authHeader: roleAuthc.apiKeyHeader } + ); stats = unencryptedPayload.stats; }); + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('should pass the schema validation (ensures BWC with Classic offering)', () => { const root = deepmerge(ossRootTelemetrySchema, xpackRootTelemetrySchema); @@ -39,7 +49,10 @@ export default function ({ getService }: FtrProviderContext) { }); it('includes the serverless info in the body', async () => { - const [unencryptedPayload] = await usageApi.getTelemetryStats({ unencrypted: true }); + const [unencryptedPayload] = await usageApi.getTelemetryStats( + { unencrypted: true }, + { authHeader: roleAuthc.apiKeyHeader } + ); expect( unencryptedPayload.stats.stack_stats.kibana?.plugins?.telemetry?.labels?.serverless diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/telemetry_config.ts b/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/telemetry_config.ts index 8fdeb64ac1c198..1d9b29ee48f10c 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/telemetry_config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/telemetry/telemetry_config.ts @@ -6,15 +6,15 @@ */ import { expect } from 'expect'; +import type { InternalRequestHeader, RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default function telemetryConfigTest({ getService }: FtrProviderContext) { const svlCommonApi = getService('svlCommonApi'); - const supertest = getService('supertest'); + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); - // failsOnMKI, see https://github.com/elastic/kibana/issues/180348 describe('/api/telemetry/v2/config API Telemetry config', function () { - this.tags(['failsOnMKI']); const baseConfig = { allowChangingOptInStatus: false, optIn: true, @@ -24,33 +24,49 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) serverless: 'observability', }, }; + let roleAuthc: RoleCredentials; + let internalReqHeader: InternalRequestHeader; + + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + internalReqHeader = svlCommonApi.getInternalRequestHeader(); + }); + + after(async () => { + await svlUserManager.invalidateApiKeyForRole(roleAuthc); + }); it('GET should get the default config', async () => { - const { body } = await supertest + const { body } = await supertestWithoutAuth .get('/api/telemetry/v2/config') - .set(svlCommonApi.getCommonRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .expect(200); expect(body).toMatchObject(baseConfig); }); - it('GET should get updated labels after dynamically updating them', async () => { - await supertest + it.skip('GET should get updated labels after dynamically updating them', async () => { + await supertestWithoutAuth .put('/internal/core/_settings') - .set(svlCommonApi.getInternalRequestHeader()) + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader) .set('elastic-api-version', '1') .send({ 'telemetry.labels.journeyName': 'my-ftr-test' }) .expect(200, { ok: true }); - await supertest + const response = await supertestWithoutAuth .get('/api/telemetry/v2/config') - .set(svlCommonApi.getCommonRequestHeader()) - .expect(200, { - ...baseConfig, - labels: { - ...baseConfig.labels, - journeyName: 'my-ftr-test', - }, - }); + .set(internalReqHeader) + .set(roleAuthc.apiKeyHeader); + + expect(response.status).toBe(200); + expect(response.body).toEqual({ + ...baseConfig, + labels: expect.objectContaining({ + ...baseConfig.labels, + journeyName: 'my-ftr-test', + }), + }); }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts index 90009b3b57dedf..a757df76f10f31 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/index.feature_flags.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Serverless search API - feature flags', function () { + loadTestFile(require.resolve('./platform_security')); loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts new file mode 100644 index 00000000000000..b05dd338c64ac3 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/authorization.ts @@ -0,0 +1,1029 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const svlCommonApi = getService('svlCommonApi'); + + describe('security/authorization', function () { + describe('available features', () => { + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let adminCredentials: { Cookie: string }; + + before(async () => { + // get auth header for Viewer role + adminCredentials = await svlUserManager.getApiCredentialsForRole('admin'); + }); + + it('composite features', async () => { + const { body } = await supertestWithoutAuth + .get('/api/security/privileges?includeActions=true') + .set(svlCommonApi.getInternalRequestHeader()) + .set(adminCredentials) + .expect(200); + + // The following features are composed of other features in a way that is + // specific to the search solution. + const compositeFeatureIds = ['dashboard', 'discover', 'reporting']; + + const features = Object.fromEntries( + Object.entries(body.features).filter(([key]) => compositeFeatureIds.includes(key)) + ); + expectSnapshot(features).toMatchInline(` + Object { + "dashboard": Object { + "all": Array [ + "login:", + "api:bulkGetUserProfiles", + "api:store_search_session", + "api:generateReport", + "api:downloadCsv", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "ui:dashboard/createShortUrl", + "ui:dashboard/storeSearchSession", + "ui:dashboard/generateScreenshot", + "ui:dashboard/downloadCsv", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + ], + "download_csv_report": Array [ + "login:", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + ], + "generate_report": Array [ + "login:", + "api:generateReport", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/generateScreenshot", + ], + "minimal_all": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + "api:generateReport", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + ], + "minimal_read": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:dashboard/show", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:visualize/show", + "ui:visualize/createShortUrl", + ], + "read": Array [ + "login:", + "api:bulkGetUserProfiles", + "app:dashboards", + "app:kibana", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "ui:navLinks/kibana", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "ui:dashboard/show", + "ui:dashboard/createShortUrl", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "ui:visualize/show", + "ui:visualize/createShortUrl", + ], + "store_search_session": Array [ + "login:", + "api:store_search_session", + "ui:management/kibana/search_sessions", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:dashboard/storeSearchSession", + ], + "url_create": Array [ + "login:", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:dashboard/createShortUrl", + ], + }, + "discover": Object { + "all": Array [ + "login:", + "api:fileUpload:analyzeFile", + "api:store_search_session", + "api:generateReport", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + "ui:discover/createShortUrl", + "ui:discover/storeSearchSession", + "ui:discover/generateCsv", + ], + "generate_report": Array [ + "login:", + "api:generateReport", + "ui:management/insightsAndAlerting/reporting", + "ui:discover/generateCsv", + ], + "minimal_all": Array [ + "login:", + "api:fileUpload:analyzeFile", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + ], + "minimal_read": Array [ + "login:", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:discover/show", + ], + "read": Array [ + "login:", + "app:discover", + "app:kibana", + "ui:catalogue/discover", + "ui:navLinks/discover", + "ui:navLinks/kibana", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "ui:discover/show", + "ui:discover/createShortUrl", + ], + "store_search_session": Array [ + "login:", + "api:store_search_session", + "ui:management/kibana/search_sessions", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:discover/storeSearchSession", + ], + "url_create": Array [ + "login:", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "ui:discover/createShortUrl", + ], + }, + "reporting": Object { + "all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + "read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + }, + } + `); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/search/platform_security/index.ts b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/index.ts new file mode 100644 index 00000000000000..5271f15b683f13 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/search/platform_security/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Platform security APIs', function () { + loadTestFile(require.resolve('./authorization')); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/search/telemetry/telemetry_config.ts b/x-pack/test_serverless/api_integration/test_suites/search/telemetry/telemetry_config.ts index ad523c6be982fd..c1533aad727da7 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/telemetry/telemetry_config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/telemetry/telemetry_config.ts @@ -32,7 +32,8 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) expect(body).toMatchObject(baseConfig); }); - it('GET should get updated labels after dynamically updating them', async () => { + // coreApp.allowDynamicConfigOverrides is disabled + it.skip('GET should get updated labels after dynamically updating them', async () => { const uniqueJourneyName = `my-ftr-test-${new Date().getMilliseconds()}`; await supertest .put('/internal/core/_settings') diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cases/find_cases.ts b/x-pack/test_serverless/api_integration/test_suites/security/cases/find_cases.ts index ee44874a67fac4..a42e3204c11d31 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cases/find_cases.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cases/find_cases.ts @@ -6,19 +6,23 @@ */ import expect from '@kbn/expect'; +import { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); let findCasesResp: any; let postCaseReq: any; describe('find_cases', () => { + let roleAuthc: RoleCredentials; describe('basic tests', () => { before(async () => { findCasesResp = svlCases.api.getFindCasesResp(); postCaseReq = svlCases.api.getPostCaseReq('securitySolution'); + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); }); afterEach(async () => { @@ -26,16 +30,16 @@ export default ({ getService }: FtrProviderContext): void => { }); it('should return empty response', async () => { - const cases = await svlCases.api.findCases({}); + const cases = await svlCases.api.findCases({}, roleAuthc); expect(cases).to.eql(findCasesResp); }); it('should return cases', async () => { - const a = await svlCases.api.createCase(postCaseReq); - const b = await svlCases.api.createCase(postCaseReq); - const c = await svlCases.api.createCase(postCaseReq); + const a = await svlCases.api.createCase(postCaseReq, roleAuthc); + const b = await svlCases.api.createCase(postCaseReq, roleAuthc); + const c = await svlCases.api.createCase(postCaseReq, roleAuthc); - const cases = await svlCases.api.findCases({}); + const cases = await svlCases.api.findCases({}, roleAuthc); expect(cases).to.eql({ ...findCasesResp, @@ -46,14 +50,17 @@ export default ({ getService }: FtrProviderContext): void => { }); it('returns empty response when trying to find cases with owner as cases', async () => { - const cases = await svlCases.api.findCases({ query: { owner: 'cases' } }); + const cases = await svlCases.api.findCases({ query: { owner: 'cases' } }, roleAuthc); expect(cases).to.eql(findCasesResp); }); it('returns empty response when trying to find cases with owner as observability', async () => { - const cases = await svlCases.api.findCases({ - query: { owner: 'observability' }, - }); + const cases = await svlCases.api.findCases( + { + query: { owner: 'observability' }, + }, + roleAuthc + ); expect(cases).to.eql(findCasesResp); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cases/get_case.ts b/x-pack/test_serverless/api_integration/test_suites/security/cases/get_case.ts index fe3c02a7342a9d..a5aaca18dae626 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cases/get_case.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cases/get_case.ts @@ -6,27 +6,41 @@ */ import expect from '@kbn/expect'; +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); describe('get_case', () => { + let roleAuthc: RoleCredentials; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + afterEach(async () => { await svlCases.api.deleteCases(); }); it('should return a case', async () => { const postedCase = await svlCases.api.createCase( - svlCases.api.getPostCaseRequest('securitySolution') + svlCases.api.getPostCaseRequest('securitySolution'), + roleAuthc + ); + const theCase = await svlCases.api.getCase( + { + caseId: postedCase.id, + includeComments: true, + }, + roleAuthc ); - const theCase = await svlCases.api.getCase({ - caseId: postedCase.id, - includeComments: true, - }); - const data = svlCases.omit.removeServerGeneratedPropertiesFromCase(theCase); - expect(data).to.eql(svlCases.api.postCaseResp('securitySolution')); + const { created_by: createdBy, ...data } = + svlCases.omit.removeServerGeneratedPropertiesFromCase(theCase); + const { created_by: _, ...expectedData } = svlCases.api.postCaseResp('securitySolution'); + expect(data).to.eql(expectedData); + expect(createdBy).to.have.keys('full_name', 'email', 'username'); expect(data.comments?.length).to.eql(0); }); }); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/cases/post_case.ts b/x-pack/test_serverless/api_integration/test_suites/security/cases/post_case.ts index db5967654de854..5b26ab4f3d3132 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/cases/post_case.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/cases/post_case.ts @@ -7,44 +7,44 @@ import expect from '@kbn/expect'; import { ConnectorTypes } from '@kbn/cases-plugin/common/types/domain'; - +import type { RoleCredentials } from '../../../../shared/services'; import { FtrProviderContext } from '../../../ftr_provider_context'; export default ({ getService }: FtrProviderContext): void => { const svlCases = getService('svlCases'); + const svlUserManager = getService('svlUserManager'); describe('post_case', () => { + let roleAuthc: RoleCredentials; + before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); + }); + afterEach(async () => { await svlCases.api.deleteCases(); }); it('should create a case', async () => { - const postedCase = await svlCases.api.createCase( - svlCases.api.getPostCaseRequest('securitySolution', { - connector: { - id: '123', - name: 'Jira', - type: ConnectorTypes.jira, - fields: { issueType: 'Task', priority: 'High', parent: null }, - }, - }) - ); - const data = svlCases.omit.removeServerGeneratedPropertiesFromCase(postedCase); + const payload = svlCases.api.getPostCaseRequest('securitySolution', { + connector: { + id: '123', + name: 'Jira', + type: ConnectorTypes.jira, + fields: { issueType: 'Task', priority: 'High', parent: null }, + }, + }); + const postedCase = await svlCases.api.createCase(payload, roleAuthc); - expect(data).to.eql( - svlCases.api.postCaseResp( - 'securitySolution', - null, - svlCases.api.getPostCaseRequest('securitySolution', { - connector: { - id: '123', - name: 'Jira', - type: ConnectorTypes.jira, - fields: { issueType: 'Task', priority: 'High', parent: null }, - }, - }) - ) + const { created_by: createdBy, ...data } = + svlCases.omit.removeServerGeneratedPropertiesFromCase(postedCase); + const { created_by: _, ...expected } = svlCases.api.postCaseResp( + 'securitySolution', + null, + payload ); + + expect(data).to.eql(expected); + expect(createdBy).to.have.keys('full_name', 'email', 'username'); }); it('should throw 403 when trying to create a case with observability as owner', async () => { @@ -53,6 +53,7 @@ export default ({ getService }: FtrProviderContext): void => { svlCases.api.getPostCaseRequest('securitySolution', { owner: 'observability', }), + roleAuthc, 403 ) ); @@ -64,6 +65,7 @@ export default ({ getService }: FtrProviderContext): void => { svlCases.api.getPostCaseRequest('securitySolution', { owner: 'cases', }), + roleAuthc, 403 ) ); diff --git a/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts b/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts index e3f61f3dde03cf..f929d3e64c6bca 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/index.feature_flags.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('Serverless security API - feature flags', function () { + loadTestFile(require.resolve('./platform_security')); loadTestFile(require.resolve('../common/platform_security/roles_routes_feature_flag.ts')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts new file mode 100644 index 00000000000000..54e9f5c1cbdf51 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/authorization.ts @@ -0,0 +1,2412 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService }: FtrProviderContext) { + const svlCommonApi = getService('svlCommonApi'); + + describe('security/authorization', function () { + describe('available features', () => { + const svlUserManager = getService('svlUserManager'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + let adminCredentials: { Cookie: string }; + + before(async () => { + // get auth header for Viewer role + adminCredentials = await svlUserManager.getApiCredentialsForRole('admin'); + }); + + it('composite features', async () => { + const { body } = await supertestWithoutAuth + .get('/api/security/privileges?includeActions=true') + .set(svlCommonApi.getInternalRequestHeader()) + .set(adminCredentials) + .expect(200); + + // The following features are composed of other features in a way that is + // specific to the security solution. + const compositeFeatureIds = ['dashboard', 'discover', 'reporting', 'siem']; + + const features = Object.fromEntries( + Object.entries(body.features).filter(([key]) => compositeFeatureIds.includes(key)) + ); + expectSnapshot(features).toMatchInline(` + Object { + "reporting": Object { + "all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_all": Array [ + "login:", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "api:downloadCsv", + "ui:management/insightsAndAlerting/reporting", + "ui:dashboard/downloadCsv", + "api:generateReport", + "ui:discover/generateCsv", + ], + "minimal_read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + "read": Array [ + "login:", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + ], + }, + "siem": Object { + "actions_log_management_all": Array [ + "login:", + "api:securitySolution-writeActionsLogManagement", + "api:securitySolution-readActionsLogManagement", + "ui:siem/writeActionsLogManagement", + "ui:siem/readActionsLogManagement", + ], + "actions_log_management_read": Array [ + "login:", + "api:securitySolution-readActionsLogManagement", + "ui:siem/readActionsLogManagement", + ], + "all": Array [ + "login:", + "api:securitySolution", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:rac", + "api:cloud-security-posture-all", + "api:cloud-security-posture-read", + "api:cloud-defend-all", + "api:cloud-defend-read", + "api:securitySolution-entity-analytics", + "api:securitySolution-threat-intelligence", + "api:securitySolution-showEndpointExceptions", + "api:securitySolution-crudEndpointExceptions", + "app:securitySolution", + "app:csp", + "app:cloudDefend", + "app:kibana", + "ui:catalogue/securitySolution", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/securitySolution", + "ui:navLinks/csp", + "ui:navLinks/cloudDefend", + "ui:navLinks/kibana", + "saved_object:alert/bulk_get", + "saved_object:alert/get", + "saved_object:alert/find", + "saved_object:alert/open_point_in_time", + "saved_object:alert/close_point_in_time", + "saved_object:alert/create", + "saved_object:alert/bulk_create", + "saved_object:alert/update", + "saved_object:alert/bulk_update", + "saved_object:alert/delete", + "saved_object:alert/bulk_delete", + "saved_object:alert/share_to_space", + "saved_object:exception-list/bulk_get", + "saved_object:exception-list/get", + "saved_object:exception-list/find", + "saved_object:exception-list/open_point_in_time", + "saved_object:exception-list/close_point_in_time", + "saved_object:exception-list/create", + "saved_object:exception-list/bulk_create", + "saved_object:exception-list/update", + "saved_object:exception-list/bulk_update", + "saved_object:exception-list/delete", + "saved_object:exception-list/bulk_delete", + "saved_object:exception-list/share_to_space", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:index-pattern/create", + "saved_object:index-pattern/bulk_create", + "saved_object:index-pattern/update", + "saved_object:index-pattern/bulk_update", + "saved_object:index-pattern/delete", + "saved_object:index-pattern/bulk_delete", + "saved_object:index-pattern/share_to_space", + "saved_object:siem-ui-timeline-note/bulk_get", + "saved_object:siem-ui-timeline-note/get", + "saved_object:siem-ui-timeline-note/find", + "saved_object:siem-ui-timeline-note/open_point_in_time", + "saved_object:siem-ui-timeline-note/close_point_in_time", + "saved_object:siem-ui-timeline-note/create", + "saved_object:siem-ui-timeline-note/bulk_create", + "saved_object:siem-ui-timeline-note/update", + "saved_object:siem-ui-timeline-note/bulk_update", + "saved_object:siem-ui-timeline-note/delete", + "saved_object:siem-ui-timeline-note/bulk_delete", + "saved_object:siem-ui-timeline-note/share_to_space", + "saved_object:siem-ui-timeline-pinned-event/bulk_get", + "saved_object:siem-ui-timeline-pinned-event/get", + "saved_object:siem-ui-timeline-pinned-event/find", + "saved_object:siem-ui-timeline-pinned-event/open_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/close_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/create", + "saved_object:siem-ui-timeline-pinned-event/bulk_create", + "saved_object:siem-ui-timeline-pinned-event/update", + "saved_object:siem-ui-timeline-pinned-event/bulk_update", + "saved_object:siem-ui-timeline-pinned-event/delete", + "saved_object:siem-ui-timeline-pinned-event/bulk_delete", + "saved_object:siem-ui-timeline-pinned-event/share_to_space", + "saved_object:siem-detection-engine-rule-actions/bulk_get", + "saved_object:siem-detection-engine-rule-actions/get", + "saved_object:siem-detection-engine-rule-actions/find", + "saved_object:siem-detection-engine-rule-actions/open_point_in_time", + "saved_object:siem-detection-engine-rule-actions/close_point_in_time", + "saved_object:siem-detection-engine-rule-actions/create", + "saved_object:siem-detection-engine-rule-actions/bulk_create", + "saved_object:siem-detection-engine-rule-actions/update", + "saved_object:siem-detection-engine-rule-actions/bulk_update", + "saved_object:siem-detection-engine-rule-actions/delete", + "saved_object:siem-detection-engine-rule-actions/bulk_delete", + "saved_object:siem-detection-engine-rule-actions/share_to_space", + "saved_object:security-rule/bulk_get", + "saved_object:security-rule/get", + "saved_object:security-rule/find", + "saved_object:security-rule/open_point_in_time", + "saved_object:security-rule/close_point_in_time", + "saved_object:security-rule/create", + "saved_object:security-rule/bulk_create", + "saved_object:security-rule/update", + "saved_object:security-rule/bulk_update", + "saved_object:security-rule/delete", + "saved_object:security-rule/bulk_delete", + "saved_object:security-rule/share_to_space", + "saved_object:siem-ui-timeline/bulk_get", + "saved_object:siem-ui-timeline/get", + "saved_object:siem-ui-timeline/find", + "saved_object:siem-ui-timeline/open_point_in_time", + "saved_object:siem-ui-timeline/close_point_in_time", + "saved_object:siem-ui-timeline/create", + "saved_object:siem-ui-timeline/bulk_create", + "saved_object:siem-ui-timeline/update", + "saved_object:siem-ui-timeline/bulk_update", + "saved_object:siem-ui-timeline/delete", + "saved_object:siem-ui-timeline/bulk_delete", + "saved_object:siem-ui-timeline/share_to_space", + "saved_object:endpoint:user-artifact-manifest/bulk_get", + "saved_object:endpoint:user-artifact-manifest/get", + "saved_object:endpoint:user-artifact-manifest/find", + "saved_object:endpoint:user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:user-artifact-manifest/create", + "saved_object:endpoint:user-artifact-manifest/bulk_create", + "saved_object:endpoint:user-artifact-manifest/update", + "saved_object:endpoint:user-artifact-manifest/bulk_update", + "saved_object:endpoint:user-artifact-manifest/delete", + "saved_object:endpoint:user-artifact-manifest/bulk_delete", + "saved_object:endpoint:user-artifact-manifest/share_to_space", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_get", + "saved_object:endpoint:unified-user-artifact-manifest/get", + "saved_object:endpoint:unified-user-artifact-manifest/find", + "saved_object:endpoint:unified-user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/create", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_create", + "saved_object:endpoint:unified-user-artifact-manifest/update", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_update", + "saved_object:endpoint:unified-user-artifact-manifest/delete", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_delete", + "saved_object:endpoint:unified-user-artifact-manifest/share_to_space", + "saved_object:security-solution-signals-migration/bulk_get", + "saved_object:security-solution-signals-migration/get", + "saved_object:security-solution-signals-migration/find", + "saved_object:security-solution-signals-migration/open_point_in_time", + "saved_object:security-solution-signals-migration/close_point_in_time", + "saved_object:security-solution-signals-migration/create", + "saved_object:security-solution-signals-migration/bulk_create", + "saved_object:security-solution-signals-migration/update", + "saved_object:security-solution-signals-migration/bulk_update", + "saved_object:security-solution-signals-migration/delete", + "saved_object:security-solution-signals-migration/bulk_delete", + "saved_object:security-solution-signals-migration/share_to_space", + "saved_object:risk-engine-configuration/bulk_get", + "saved_object:risk-engine-configuration/get", + "saved_object:risk-engine-configuration/find", + "saved_object:risk-engine-configuration/open_point_in_time", + "saved_object:risk-engine-configuration/close_point_in_time", + "saved_object:risk-engine-configuration/create", + "saved_object:risk-engine-configuration/bulk_create", + "saved_object:risk-engine-configuration/update", + "saved_object:risk-engine-configuration/bulk_update", + "saved_object:risk-engine-configuration/delete", + "saved_object:risk-engine-configuration/bulk_delete", + "saved_object:risk-engine-configuration/share_to_space", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "saved_object:policy-settings-protection-updates-note/create", + "saved_object:policy-settings-protection-updates-note/bulk_create", + "saved_object:policy-settings-protection-updates-note/update", + "saved_object:policy-settings-protection-updates-note/bulk_update", + "saved_object:policy-settings-protection-updates-note/delete", + "saved_object:policy-settings-protection-updates-note/bulk_delete", + "saved_object:policy-settings-protection-updates-note/share_to_space", + "saved_object:csp_rule/bulk_get", + "saved_object:csp_rule/get", + "saved_object:csp_rule/find", + "saved_object:csp_rule/open_point_in_time", + "saved_object:csp_rule/close_point_in_time", + "saved_object:csp_rule/create", + "saved_object:csp_rule/bulk_create", + "saved_object:csp_rule/update", + "saved_object:csp_rule/bulk_update", + "saved_object:csp_rule/delete", + "saved_object:csp_rule/bulk_delete", + "saved_object:csp_rule/share_to_space", + "saved_object:cloud-security-posture-settings/bulk_get", + "saved_object:cloud-security-posture-settings/get", + "saved_object:cloud-security-posture-settings/find", + "saved_object:cloud-security-posture-settings/open_point_in_time", + "saved_object:cloud-security-posture-settings/close_point_in_time", + "saved_object:cloud-security-posture-settings/create", + "saved_object:cloud-security-posture-settings/bulk_create", + "saved_object:cloud-security-posture-settings/update", + "saved_object:cloud-security-posture-settings/bulk_update", + "saved_object:cloud-security-posture-settings/delete", + "saved_object:cloud-security-posture-settings/bulk_delete", + "saved_object:cloud-security-posture-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:siem/show", + "ui:siem/crud", + "ui:siem/entity-analytics", + "ui:siem/investigation-guide", + "ui:siem/investigation-guide-interactions", + "ui:siem/threat-intelligence", + "ui:siem/showEndpointExceptions", + "ui:siem/crudEndpointExceptions", + "alerting:siem.notifications/siem/rule/get", + "alerting:siem.notifications/siem/rule/getRuleState", + "alerting:siem.notifications/siem/rule/getAlertSummary", + "alerting:siem.notifications/siem/rule/getExecutionLog", + "alerting:siem.notifications/siem/rule/getActionErrorLog", + "alerting:siem.notifications/siem/rule/find", + "alerting:siem.notifications/siem/rule/getRuleExecutionKPI", + "alerting:siem.notifications/siem/rule/getBackfill", + "alerting:siem.notifications/siem/rule/findBackfill", + "alerting:siem.notifications/siem/rule/create", + "alerting:siem.notifications/siem/rule/delete", + "alerting:siem.notifications/siem/rule/update", + "alerting:siem.notifications/siem/rule/updateApiKey", + "alerting:siem.notifications/siem/rule/enable", + "alerting:siem.notifications/siem/rule/disable", + "alerting:siem.notifications/siem/rule/muteAll", + "alerting:siem.notifications/siem/rule/unmuteAll", + "alerting:siem.notifications/siem/rule/muteAlert", + "alerting:siem.notifications/siem/rule/unmuteAlert", + "alerting:siem.notifications/siem/rule/snooze", + "alerting:siem.notifications/siem/rule/bulkEdit", + "alerting:siem.notifications/siem/rule/bulkDelete", + "alerting:siem.notifications/siem/rule/bulkEnable", + "alerting:siem.notifications/siem/rule/bulkDisable", + "alerting:siem.notifications/siem/rule/unsnooze", + "alerting:siem.notifications/siem/rule/runSoon", + "alerting:siem.notifications/siem/rule/scheduleBackfill", + "alerting:siem.notifications/siem/rule/deleteBackfill", + "alerting:siem.esqlRule/siem/rule/get", + "alerting:siem.esqlRule/siem/rule/getRuleState", + "alerting:siem.esqlRule/siem/rule/getAlertSummary", + "alerting:siem.esqlRule/siem/rule/getExecutionLog", + "alerting:siem.esqlRule/siem/rule/getActionErrorLog", + "alerting:siem.esqlRule/siem/rule/find", + "alerting:siem.esqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.esqlRule/siem/rule/getBackfill", + "alerting:siem.esqlRule/siem/rule/findBackfill", + "alerting:siem.esqlRule/siem/rule/create", + "alerting:siem.esqlRule/siem/rule/delete", + "alerting:siem.esqlRule/siem/rule/update", + "alerting:siem.esqlRule/siem/rule/updateApiKey", + "alerting:siem.esqlRule/siem/rule/enable", + "alerting:siem.esqlRule/siem/rule/disable", + "alerting:siem.esqlRule/siem/rule/muteAll", + "alerting:siem.esqlRule/siem/rule/unmuteAll", + "alerting:siem.esqlRule/siem/rule/muteAlert", + "alerting:siem.esqlRule/siem/rule/unmuteAlert", + "alerting:siem.esqlRule/siem/rule/snooze", + "alerting:siem.esqlRule/siem/rule/bulkEdit", + "alerting:siem.esqlRule/siem/rule/bulkDelete", + "alerting:siem.esqlRule/siem/rule/bulkEnable", + "alerting:siem.esqlRule/siem/rule/bulkDisable", + "alerting:siem.esqlRule/siem/rule/unsnooze", + "alerting:siem.esqlRule/siem/rule/runSoon", + "alerting:siem.esqlRule/siem/rule/scheduleBackfill", + "alerting:siem.esqlRule/siem/rule/deleteBackfill", + "alerting:siem.eqlRule/siem/rule/get", + "alerting:siem.eqlRule/siem/rule/getRuleState", + "alerting:siem.eqlRule/siem/rule/getAlertSummary", + "alerting:siem.eqlRule/siem/rule/getExecutionLog", + "alerting:siem.eqlRule/siem/rule/getActionErrorLog", + "alerting:siem.eqlRule/siem/rule/find", + "alerting:siem.eqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.eqlRule/siem/rule/getBackfill", + "alerting:siem.eqlRule/siem/rule/findBackfill", + "alerting:siem.eqlRule/siem/rule/create", + "alerting:siem.eqlRule/siem/rule/delete", + "alerting:siem.eqlRule/siem/rule/update", + "alerting:siem.eqlRule/siem/rule/updateApiKey", + "alerting:siem.eqlRule/siem/rule/enable", + "alerting:siem.eqlRule/siem/rule/disable", + "alerting:siem.eqlRule/siem/rule/muteAll", + "alerting:siem.eqlRule/siem/rule/unmuteAll", + "alerting:siem.eqlRule/siem/rule/muteAlert", + "alerting:siem.eqlRule/siem/rule/unmuteAlert", + "alerting:siem.eqlRule/siem/rule/snooze", + "alerting:siem.eqlRule/siem/rule/bulkEdit", + "alerting:siem.eqlRule/siem/rule/bulkDelete", + "alerting:siem.eqlRule/siem/rule/bulkEnable", + "alerting:siem.eqlRule/siem/rule/bulkDisable", + "alerting:siem.eqlRule/siem/rule/unsnooze", + "alerting:siem.eqlRule/siem/rule/runSoon", + "alerting:siem.eqlRule/siem/rule/scheduleBackfill", + "alerting:siem.eqlRule/siem/rule/deleteBackfill", + "alerting:siem.indicatorRule/siem/rule/get", + "alerting:siem.indicatorRule/siem/rule/getRuleState", + "alerting:siem.indicatorRule/siem/rule/getAlertSummary", + "alerting:siem.indicatorRule/siem/rule/getExecutionLog", + "alerting:siem.indicatorRule/siem/rule/getActionErrorLog", + "alerting:siem.indicatorRule/siem/rule/find", + "alerting:siem.indicatorRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.indicatorRule/siem/rule/getBackfill", + "alerting:siem.indicatorRule/siem/rule/findBackfill", + "alerting:siem.indicatorRule/siem/rule/create", + "alerting:siem.indicatorRule/siem/rule/delete", + "alerting:siem.indicatorRule/siem/rule/update", + "alerting:siem.indicatorRule/siem/rule/updateApiKey", + "alerting:siem.indicatorRule/siem/rule/enable", + "alerting:siem.indicatorRule/siem/rule/disable", + "alerting:siem.indicatorRule/siem/rule/muteAll", + "alerting:siem.indicatorRule/siem/rule/unmuteAll", + "alerting:siem.indicatorRule/siem/rule/muteAlert", + "alerting:siem.indicatorRule/siem/rule/unmuteAlert", + "alerting:siem.indicatorRule/siem/rule/snooze", + "alerting:siem.indicatorRule/siem/rule/bulkEdit", + "alerting:siem.indicatorRule/siem/rule/bulkDelete", + "alerting:siem.indicatorRule/siem/rule/bulkEnable", + "alerting:siem.indicatorRule/siem/rule/bulkDisable", + "alerting:siem.indicatorRule/siem/rule/unsnooze", + "alerting:siem.indicatorRule/siem/rule/runSoon", + "alerting:siem.indicatorRule/siem/rule/scheduleBackfill", + "alerting:siem.indicatorRule/siem/rule/deleteBackfill", + "alerting:siem.mlRule/siem/rule/get", + "alerting:siem.mlRule/siem/rule/getRuleState", + "alerting:siem.mlRule/siem/rule/getAlertSummary", + "alerting:siem.mlRule/siem/rule/getExecutionLog", + "alerting:siem.mlRule/siem/rule/getActionErrorLog", + "alerting:siem.mlRule/siem/rule/find", + "alerting:siem.mlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.mlRule/siem/rule/getBackfill", + "alerting:siem.mlRule/siem/rule/findBackfill", + "alerting:siem.mlRule/siem/rule/create", + "alerting:siem.mlRule/siem/rule/delete", + "alerting:siem.mlRule/siem/rule/update", + "alerting:siem.mlRule/siem/rule/updateApiKey", + "alerting:siem.mlRule/siem/rule/enable", + "alerting:siem.mlRule/siem/rule/disable", + "alerting:siem.mlRule/siem/rule/muteAll", + "alerting:siem.mlRule/siem/rule/unmuteAll", + "alerting:siem.mlRule/siem/rule/muteAlert", + "alerting:siem.mlRule/siem/rule/unmuteAlert", + "alerting:siem.mlRule/siem/rule/snooze", + "alerting:siem.mlRule/siem/rule/bulkEdit", + "alerting:siem.mlRule/siem/rule/bulkDelete", + "alerting:siem.mlRule/siem/rule/bulkEnable", + "alerting:siem.mlRule/siem/rule/bulkDisable", + "alerting:siem.mlRule/siem/rule/unsnooze", + "alerting:siem.mlRule/siem/rule/runSoon", + "alerting:siem.mlRule/siem/rule/scheduleBackfill", + "alerting:siem.mlRule/siem/rule/deleteBackfill", + "alerting:siem.queryRule/siem/rule/get", + "alerting:siem.queryRule/siem/rule/getRuleState", + "alerting:siem.queryRule/siem/rule/getAlertSummary", + "alerting:siem.queryRule/siem/rule/getExecutionLog", + "alerting:siem.queryRule/siem/rule/getActionErrorLog", + "alerting:siem.queryRule/siem/rule/find", + "alerting:siem.queryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.queryRule/siem/rule/getBackfill", + "alerting:siem.queryRule/siem/rule/findBackfill", + "alerting:siem.queryRule/siem/rule/create", + "alerting:siem.queryRule/siem/rule/delete", + "alerting:siem.queryRule/siem/rule/update", + "alerting:siem.queryRule/siem/rule/updateApiKey", + "alerting:siem.queryRule/siem/rule/enable", + "alerting:siem.queryRule/siem/rule/disable", + "alerting:siem.queryRule/siem/rule/muteAll", + "alerting:siem.queryRule/siem/rule/unmuteAll", + "alerting:siem.queryRule/siem/rule/muteAlert", + "alerting:siem.queryRule/siem/rule/unmuteAlert", + "alerting:siem.queryRule/siem/rule/snooze", + "alerting:siem.queryRule/siem/rule/bulkEdit", + "alerting:siem.queryRule/siem/rule/bulkDelete", + "alerting:siem.queryRule/siem/rule/bulkEnable", + "alerting:siem.queryRule/siem/rule/bulkDisable", + "alerting:siem.queryRule/siem/rule/unsnooze", + "alerting:siem.queryRule/siem/rule/runSoon", + "alerting:siem.queryRule/siem/rule/scheduleBackfill", + "alerting:siem.queryRule/siem/rule/deleteBackfill", + "alerting:siem.savedQueryRule/siem/rule/get", + "alerting:siem.savedQueryRule/siem/rule/getRuleState", + "alerting:siem.savedQueryRule/siem/rule/getAlertSummary", + "alerting:siem.savedQueryRule/siem/rule/getExecutionLog", + "alerting:siem.savedQueryRule/siem/rule/getActionErrorLog", + "alerting:siem.savedQueryRule/siem/rule/find", + "alerting:siem.savedQueryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.savedQueryRule/siem/rule/getBackfill", + "alerting:siem.savedQueryRule/siem/rule/findBackfill", + "alerting:siem.savedQueryRule/siem/rule/create", + "alerting:siem.savedQueryRule/siem/rule/delete", + "alerting:siem.savedQueryRule/siem/rule/update", + "alerting:siem.savedQueryRule/siem/rule/updateApiKey", + "alerting:siem.savedQueryRule/siem/rule/enable", + "alerting:siem.savedQueryRule/siem/rule/disable", + "alerting:siem.savedQueryRule/siem/rule/muteAll", + "alerting:siem.savedQueryRule/siem/rule/unmuteAll", + "alerting:siem.savedQueryRule/siem/rule/muteAlert", + "alerting:siem.savedQueryRule/siem/rule/unmuteAlert", + "alerting:siem.savedQueryRule/siem/rule/snooze", + "alerting:siem.savedQueryRule/siem/rule/bulkEdit", + "alerting:siem.savedQueryRule/siem/rule/bulkDelete", + "alerting:siem.savedQueryRule/siem/rule/bulkEnable", + "alerting:siem.savedQueryRule/siem/rule/bulkDisable", + "alerting:siem.savedQueryRule/siem/rule/unsnooze", + "alerting:siem.savedQueryRule/siem/rule/runSoon", + "alerting:siem.savedQueryRule/siem/rule/scheduleBackfill", + "alerting:siem.savedQueryRule/siem/rule/deleteBackfill", + "alerting:siem.thresholdRule/siem/rule/get", + "alerting:siem.thresholdRule/siem/rule/getRuleState", + "alerting:siem.thresholdRule/siem/rule/getAlertSummary", + "alerting:siem.thresholdRule/siem/rule/getExecutionLog", + "alerting:siem.thresholdRule/siem/rule/getActionErrorLog", + "alerting:siem.thresholdRule/siem/rule/find", + "alerting:siem.thresholdRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.thresholdRule/siem/rule/getBackfill", + "alerting:siem.thresholdRule/siem/rule/findBackfill", + "alerting:siem.thresholdRule/siem/rule/create", + "alerting:siem.thresholdRule/siem/rule/delete", + "alerting:siem.thresholdRule/siem/rule/update", + "alerting:siem.thresholdRule/siem/rule/updateApiKey", + "alerting:siem.thresholdRule/siem/rule/enable", + "alerting:siem.thresholdRule/siem/rule/disable", + "alerting:siem.thresholdRule/siem/rule/muteAll", + "alerting:siem.thresholdRule/siem/rule/unmuteAll", + "alerting:siem.thresholdRule/siem/rule/muteAlert", + "alerting:siem.thresholdRule/siem/rule/unmuteAlert", + "alerting:siem.thresholdRule/siem/rule/snooze", + "alerting:siem.thresholdRule/siem/rule/bulkEdit", + "alerting:siem.thresholdRule/siem/rule/bulkDelete", + "alerting:siem.thresholdRule/siem/rule/bulkEnable", + "alerting:siem.thresholdRule/siem/rule/bulkDisable", + "alerting:siem.thresholdRule/siem/rule/unsnooze", + "alerting:siem.thresholdRule/siem/rule/runSoon", + "alerting:siem.thresholdRule/siem/rule/scheduleBackfill", + "alerting:siem.thresholdRule/siem/rule/deleteBackfill", + "alerting:siem.newTermsRule/siem/rule/get", + "alerting:siem.newTermsRule/siem/rule/getRuleState", + "alerting:siem.newTermsRule/siem/rule/getAlertSummary", + "alerting:siem.newTermsRule/siem/rule/getExecutionLog", + "alerting:siem.newTermsRule/siem/rule/getActionErrorLog", + "alerting:siem.newTermsRule/siem/rule/find", + "alerting:siem.newTermsRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.newTermsRule/siem/rule/getBackfill", + "alerting:siem.newTermsRule/siem/rule/findBackfill", + "alerting:siem.newTermsRule/siem/rule/create", + "alerting:siem.newTermsRule/siem/rule/delete", + "alerting:siem.newTermsRule/siem/rule/update", + "alerting:siem.newTermsRule/siem/rule/updateApiKey", + "alerting:siem.newTermsRule/siem/rule/enable", + "alerting:siem.newTermsRule/siem/rule/disable", + "alerting:siem.newTermsRule/siem/rule/muteAll", + "alerting:siem.newTermsRule/siem/rule/unmuteAll", + "alerting:siem.newTermsRule/siem/rule/muteAlert", + "alerting:siem.newTermsRule/siem/rule/unmuteAlert", + "alerting:siem.newTermsRule/siem/rule/snooze", + "alerting:siem.newTermsRule/siem/rule/bulkEdit", + "alerting:siem.newTermsRule/siem/rule/bulkDelete", + "alerting:siem.newTermsRule/siem/rule/bulkEnable", + "alerting:siem.newTermsRule/siem/rule/bulkDisable", + "alerting:siem.newTermsRule/siem/rule/unsnooze", + "alerting:siem.newTermsRule/siem/rule/runSoon", + "alerting:siem.newTermsRule/siem/rule/scheduleBackfill", + "alerting:siem.newTermsRule/siem/rule/deleteBackfill", + "alerting:siem.notifications/siem/alert/get", + "alerting:siem.notifications/siem/alert/find", + "alerting:siem.notifications/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.notifications/siem/alert/getAlertSummary", + "alerting:siem.notifications/siem/alert/update", + "alerting:siem.esqlRule/siem/alert/get", + "alerting:siem.esqlRule/siem/alert/find", + "alerting:siem.esqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.esqlRule/siem/alert/getAlertSummary", + "alerting:siem.esqlRule/siem/alert/update", + "alerting:siem.eqlRule/siem/alert/get", + "alerting:siem.eqlRule/siem/alert/find", + "alerting:siem.eqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.eqlRule/siem/alert/getAlertSummary", + "alerting:siem.eqlRule/siem/alert/update", + "alerting:siem.indicatorRule/siem/alert/get", + "alerting:siem.indicatorRule/siem/alert/find", + "alerting:siem.indicatorRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.indicatorRule/siem/alert/getAlertSummary", + "alerting:siem.indicatorRule/siem/alert/update", + "alerting:siem.mlRule/siem/alert/get", + "alerting:siem.mlRule/siem/alert/find", + "alerting:siem.mlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.mlRule/siem/alert/getAlertSummary", + "alerting:siem.mlRule/siem/alert/update", + "alerting:siem.queryRule/siem/alert/get", + "alerting:siem.queryRule/siem/alert/find", + "alerting:siem.queryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.queryRule/siem/alert/getAlertSummary", + "alerting:siem.queryRule/siem/alert/update", + "alerting:siem.savedQueryRule/siem/alert/get", + "alerting:siem.savedQueryRule/siem/alert/find", + "alerting:siem.savedQueryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.savedQueryRule/siem/alert/getAlertSummary", + "alerting:siem.savedQueryRule/siem/alert/update", + "alerting:siem.thresholdRule/siem/alert/get", + "alerting:siem.thresholdRule/siem/alert/find", + "alerting:siem.thresholdRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.thresholdRule/siem/alert/getAlertSummary", + "alerting:siem.thresholdRule/siem/alert/update", + "alerting:siem.newTermsRule/siem/alert/get", + "alerting:siem.newTermsRule/siem/alert/find", + "alerting:siem.newTermsRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.newTermsRule/siem/alert/getAlertSummary", + "alerting:siem.newTermsRule/siem/alert/update", + "api:fileUpload:analyzeFile", + "api:store_search_session", + "api:generateReport", + "app:discover", + "ui:catalogue/discover", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/discover", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + "ui:discover/createShortUrl", + "ui:discover/storeSearchSession", + "ui:discover/generateCsv", + "api:bulkGetUserProfiles", + "api:downloadCsv", + "app:dashboards", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "ui:dashboard/createShortUrl", + "ui:dashboard/storeSearchSession", + "ui:dashboard/generateScreenshot", + "ui:dashboard/downloadCsv", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + ], + "blocklist_all": Array [ + "login:", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-writeBlocklist", + "api:securitySolution-readBlocklist", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "ui:siem/writeBlocklist", + "ui:siem/readBlocklist", + ], + "blocklist_read": Array [ + "login:", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-readBlocklist", + "ui:siem/readBlocklist", + ], + "endpoint_exceptions_all": Array [ + "login:", + "api:securitySolution-showEndpointExceptions", + "api:securitySolution-crudEndpointExceptions", + "ui:siem/showEndpointExceptions", + "ui:siem/crudEndpointExceptions", + ], + "endpoint_exceptions_read": Array [ + "login:", + "api:securitySolution-showEndpointExceptions", + "ui:siem/showEndpointExceptions", + ], + "endpoint_list_all": Array [ + "login:", + "api:securitySolution-writeEndpointList", + "api:securitySolution-readEndpointList", + "ui:siem/writeEndpointList", + "ui:siem/readEndpointList", + ], + "endpoint_list_read": Array [ + "login:", + "api:securitySolution-readEndpointList", + "ui:siem/readEndpointList", + ], + "event_filters_all": Array [ + "login:", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-writeEventFilters", + "api:securitySolution-readEventFilters", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "ui:siem/writeEventFilters", + "ui:siem/readEventFilters", + ], + "event_filters_read": Array [ + "login:", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-readEventFilters", + "ui:siem/readEventFilters", + ], + "execute_operations_all": Array [ + "login:", + "api:securitySolution-writeExecuteOperations", + "ui:siem/writeExecuteOperations", + ], + "file_operations_all": Array [ + "login:", + "api:securitySolution-writeFileOperations", + "ui:siem/writeFileOperations", + ], + "host_isolation_all": Array [ + "login:", + "api:securitySolution-writeHostIsolationRelease", + "api:securitySolution-writeHostIsolation", + "ui:siem/writeHostIsolationRelease", + "ui:siem/writeHostIsolation", + ], + "host_isolation_exceptions_all": Array [ + "login:", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-deleteHostIsolationExceptions", + "api:securitySolution-readHostIsolationExceptions", + "api:securitySolution-accessHostIsolationExceptions", + "api:securitySolution-writeHostIsolationExceptions", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "ui:siem/readHostIsolationExceptions", + "ui:siem/deleteHostIsolationExceptions", + "ui:siem/accessHostIsolationExceptions", + "ui:siem/writeHostIsolationExceptions", + ], + "host_isolation_exceptions_read": Array [ + "login:", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-readHostIsolationExceptions", + "api:securitySolution-accessHostIsolationExceptions", + "ui:siem/readHostIsolationExceptions", + "ui:siem/accessHostIsolationExceptions", + ], + "minimal_all": Array [ + "login:", + "api:securitySolution", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:rac", + "api:cloud-security-posture-all", + "api:cloud-security-posture-read", + "api:cloud-defend-all", + "api:cloud-defend-read", + "api:securitySolution-entity-analytics", + "api:securitySolution-threat-intelligence", + "app:securitySolution", + "app:csp", + "app:cloudDefend", + "app:kibana", + "ui:catalogue/securitySolution", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/securitySolution", + "ui:navLinks/csp", + "ui:navLinks/cloudDefend", + "ui:navLinks/kibana", + "saved_object:alert/bulk_get", + "saved_object:alert/get", + "saved_object:alert/find", + "saved_object:alert/open_point_in_time", + "saved_object:alert/close_point_in_time", + "saved_object:alert/create", + "saved_object:alert/bulk_create", + "saved_object:alert/update", + "saved_object:alert/bulk_update", + "saved_object:alert/delete", + "saved_object:alert/bulk_delete", + "saved_object:alert/share_to_space", + "saved_object:exception-list/bulk_get", + "saved_object:exception-list/get", + "saved_object:exception-list/find", + "saved_object:exception-list/open_point_in_time", + "saved_object:exception-list/close_point_in_time", + "saved_object:exception-list/create", + "saved_object:exception-list/bulk_create", + "saved_object:exception-list/update", + "saved_object:exception-list/bulk_update", + "saved_object:exception-list/delete", + "saved_object:exception-list/bulk_delete", + "saved_object:exception-list/share_to_space", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:index-pattern/create", + "saved_object:index-pattern/bulk_create", + "saved_object:index-pattern/update", + "saved_object:index-pattern/bulk_update", + "saved_object:index-pattern/delete", + "saved_object:index-pattern/bulk_delete", + "saved_object:index-pattern/share_to_space", + "saved_object:siem-ui-timeline-note/bulk_get", + "saved_object:siem-ui-timeline-note/get", + "saved_object:siem-ui-timeline-note/find", + "saved_object:siem-ui-timeline-note/open_point_in_time", + "saved_object:siem-ui-timeline-note/close_point_in_time", + "saved_object:siem-ui-timeline-note/create", + "saved_object:siem-ui-timeline-note/bulk_create", + "saved_object:siem-ui-timeline-note/update", + "saved_object:siem-ui-timeline-note/bulk_update", + "saved_object:siem-ui-timeline-note/delete", + "saved_object:siem-ui-timeline-note/bulk_delete", + "saved_object:siem-ui-timeline-note/share_to_space", + "saved_object:siem-ui-timeline-pinned-event/bulk_get", + "saved_object:siem-ui-timeline-pinned-event/get", + "saved_object:siem-ui-timeline-pinned-event/find", + "saved_object:siem-ui-timeline-pinned-event/open_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/close_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/create", + "saved_object:siem-ui-timeline-pinned-event/bulk_create", + "saved_object:siem-ui-timeline-pinned-event/update", + "saved_object:siem-ui-timeline-pinned-event/bulk_update", + "saved_object:siem-ui-timeline-pinned-event/delete", + "saved_object:siem-ui-timeline-pinned-event/bulk_delete", + "saved_object:siem-ui-timeline-pinned-event/share_to_space", + "saved_object:siem-detection-engine-rule-actions/bulk_get", + "saved_object:siem-detection-engine-rule-actions/get", + "saved_object:siem-detection-engine-rule-actions/find", + "saved_object:siem-detection-engine-rule-actions/open_point_in_time", + "saved_object:siem-detection-engine-rule-actions/close_point_in_time", + "saved_object:siem-detection-engine-rule-actions/create", + "saved_object:siem-detection-engine-rule-actions/bulk_create", + "saved_object:siem-detection-engine-rule-actions/update", + "saved_object:siem-detection-engine-rule-actions/bulk_update", + "saved_object:siem-detection-engine-rule-actions/delete", + "saved_object:siem-detection-engine-rule-actions/bulk_delete", + "saved_object:siem-detection-engine-rule-actions/share_to_space", + "saved_object:security-rule/bulk_get", + "saved_object:security-rule/get", + "saved_object:security-rule/find", + "saved_object:security-rule/open_point_in_time", + "saved_object:security-rule/close_point_in_time", + "saved_object:security-rule/create", + "saved_object:security-rule/bulk_create", + "saved_object:security-rule/update", + "saved_object:security-rule/bulk_update", + "saved_object:security-rule/delete", + "saved_object:security-rule/bulk_delete", + "saved_object:security-rule/share_to_space", + "saved_object:siem-ui-timeline/bulk_get", + "saved_object:siem-ui-timeline/get", + "saved_object:siem-ui-timeline/find", + "saved_object:siem-ui-timeline/open_point_in_time", + "saved_object:siem-ui-timeline/close_point_in_time", + "saved_object:siem-ui-timeline/create", + "saved_object:siem-ui-timeline/bulk_create", + "saved_object:siem-ui-timeline/update", + "saved_object:siem-ui-timeline/bulk_update", + "saved_object:siem-ui-timeline/delete", + "saved_object:siem-ui-timeline/bulk_delete", + "saved_object:siem-ui-timeline/share_to_space", + "saved_object:endpoint:user-artifact-manifest/bulk_get", + "saved_object:endpoint:user-artifact-manifest/get", + "saved_object:endpoint:user-artifact-manifest/find", + "saved_object:endpoint:user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:user-artifact-manifest/create", + "saved_object:endpoint:user-artifact-manifest/bulk_create", + "saved_object:endpoint:user-artifact-manifest/update", + "saved_object:endpoint:user-artifact-manifest/bulk_update", + "saved_object:endpoint:user-artifact-manifest/delete", + "saved_object:endpoint:user-artifact-manifest/bulk_delete", + "saved_object:endpoint:user-artifact-manifest/share_to_space", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_get", + "saved_object:endpoint:unified-user-artifact-manifest/get", + "saved_object:endpoint:unified-user-artifact-manifest/find", + "saved_object:endpoint:unified-user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/create", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_create", + "saved_object:endpoint:unified-user-artifact-manifest/update", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_update", + "saved_object:endpoint:unified-user-artifact-manifest/delete", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_delete", + "saved_object:endpoint:unified-user-artifact-manifest/share_to_space", + "saved_object:security-solution-signals-migration/bulk_get", + "saved_object:security-solution-signals-migration/get", + "saved_object:security-solution-signals-migration/find", + "saved_object:security-solution-signals-migration/open_point_in_time", + "saved_object:security-solution-signals-migration/close_point_in_time", + "saved_object:security-solution-signals-migration/create", + "saved_object:security-solution-signals-migration/bulk_create", + "saved_object:security-solution-signals-migration/update", + "saved_object:security-solution-signals-migration/bulk_update", + "saved_object:security-solution-signals-migration/delete", + "saved_object:security-solution-signals-migration/bulk_delete", + "saved_object:security-solution-signals-migration/share_to_space", + "saved_object:risk-engine-configuration/bulk_get", + "saved_object:risk-engine-configuration/get", + "saved_object:risk-engine-configuration/find", + "saved_object:risk-engine-configuration/open_point_in_time", + "saved_object:risk-engine-configuration/close_point_in_time", + "saved_object:risk-engine-configuration/create", + "saved_object:risk-engine-configuration/bulk_create", + "saved_object:risk-engine-configuration/update", + "saved_object:risk-engine-configuration/bulk_update", + "saved_object:risk-engine-configuration/delete", + "saved_object:risk-engine-configuration/bulk_delete", + "saved_object:risk-engine-configuration/share_to_space", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "saved_object:policy-settings-protection-updates-note/create", + "saved_object:policy-settings-protection-updates-note/bulk_create", + "saved_object:policy-settings-protection-updates-note/update", + "saved_object:policy-settings-protection-updates-note/bulk_update", + "saved_object:policy-settings-protection-updates-note/delete", + "saved_object:policy-settings-protection-updates-note/bulk_delete", + "saved_object:policy-settings-protection-updates-note/share_to_space", + "saved_object:csp_rule/bulk_get", + "saved_object:csp_rule/get", + "saved_object:csp_rule/find", + "saved_object:csp_rule/open_point_in_time", + "saved_object:csp_rule/close_point_in_time", + "saved_object:csp_rule/create", + "saved_object:csp_rule/bulk_create", + "saved_object:csp_rule/update", + "saved_object:csp_rule/bulk_update", + "saved_object:csp_rule/delete", + "saved_object:csp_rule/bulk_delete", + "saved_object:csp_rule/share_to_space", + "saved_object:cloud-security-posture-settings/bulk_get", + "saved_object:cloud-security-posture-settings/get", + "saved_object:cloud-security-posture-settings/find", + "saved_object:cloud-security-posture-settings/open_point_in_time", + "saved_object:cloud-security-posture-settings/close_point_in_time", + "saved_object:cloud-security-posture-settings/create", + "saved_object:cloud-security-posture-settings/bulk_create", + "saved_object:cloud-security-posture-settings/update", + "saved_object:cloud-security-posture-settings/bulk_update", + "saved_object:cloud-security-posture-settings/delete", + "saved_object:cloud-security-posture-settings/bulk_delete", + "saved_object:cloud-security-posture-settings/share_to_space", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:telemetry/create", + "saved_object:telemetry/bulk_create", + "saved_object:telemetry/update", + "saved_object:telemetry/bulk_update", + "saved_object:telemetry/delete", + "saved_object:telemetry/bulk_delete", + "saved_object:telemetry/share_to_space", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:siem/show", + "ui:siem/crud", + "ui:siem/entity-analytics", + "ui:siem/investigation-guide", + "ui:siem/investigation-guide-interactions", + "ui:siem/threat-intelligence", + "alerting:siem.notifications/siem/rule/get", + "alerting:siem.notifications/siem/rule/getRuleState", + "alerting:siem.notifications/siem/rule/getAlertSummary", + "alerting:siem.notifications/siem/rule/getExecutionLog", + "alerting:siem.notifications/siem/rule/getActionErrorLog", + "alerting:siem.notifications/siem/rule/find", + "alerting:siem.notifications/siem/rule/getRuleExecutionKPI", + "alerting:siem.notifications/siem/rule/getBackfill", + "alerting:siem.notifications/siem/rule/findBackfill", + "alerting:siem.notifications/siem/rule/create", + "alerting:siem.notifications/siem/rule/delete", + "alerting:siem.notifications/siem/rule/update", + "alerting:siem.notifications/siem/rule/updateApiKey", + "alerting:siem.notifications/siem/rule/enable", + "alerting:siem.notifications/siem/rule/disable", + "alerting:siem.notifications/siem/rule/muteAll", + "alerting:siem.notifications/siem/rule/unmuteAll", + "alerting:siem.notifications/siem/rule/muteAlert", + "alerting:siem.notifications/siem/rule/unmuteAlert", + "alerting:siem.notifications/siem/rule/snooze", + "alerting:siem.notifications/siem/rule/bulkEdit", + "alerting:siem.notifications/siem/rule/bulkDelete", + "alerting:siem.notifications/siem/rule/bulkEnable", + "alerting:siem.notifications/siem/rule/bulkDisable", + "alerting:siem.notifications/siem/rule/unsnooze", + "alerting:siem.notifications/siem/rule/runSoon", + "alerting:siem.notifications/siem/rule/scheduleBackfill", + "alerting:siem.notifications/siem/rule/deleteBackfill", + "alerting:siem.esqlRule/siem/rule/get", + "alerting:siem.esqlRule/siem/rule/getRuleState", + "alerting:siem.esqlRule/siem/rule/getAlertSummary", + "alerting:siem.esqlRule/siem/rule/getExecutionLog", + "alerting:siem.esqlRule/siem/rule/getActionErrorLog", + "alerting:siem.esqlRule/siem/rule/find", + "alerting:siem.esqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.esqlRule/siem/rule/getBackfill", + "alerting:siem.esqlRule/siem/rule/findBackfill", + "alerting:siem.esqlRule/siem/rule/create", + "alerting:siem.esqlRule/siem/rule/delete", + "alerting:siem.esqlRule/siem/rule/update", + "alerting:siem.esqlRule/siem/rule/updateApiKey", + "alerting:siem.esqlRule/siem/rule/enable", + "alerting:siem.esqlRule/siem/rule/disable", + "alerting:siem.esqlRule/siem/rule/muteAll", + "alerting:siem.esqlRule/siem/rule/unmuteAll", + "alerting:siem.esqlRule/siem/rule/muteAlert", + "alerting:siem.esqlRule/siem/rule/unmuteAlert", + "alerting:siem.esqlRule/siem/rule/snooze", + "alerting:siem.esqlRule/siem/rule/bulkEdit", + "alerting:siem.esqlRule/siem/rule/bulkDelete", + "alerting:siem.esqlRule/siem/rule/bulkEnable", + "alerting:siem.esqlRule/siem/rule/bulkDisable", + "alerting:siem.esqlRule/siem/rule/unsnooze", + "alerting:siem.esqlRule/siem/rule/runSoon", + "alerting:siem.esqlRule/siem/rule/scheduleBackfill", + "alerting:siem.esqlRule/siem/rule/deleteBackfill", + "alerting:siem.eqlRule/siem/rule/get", + "alerting:siem.eqlRule/siem/rule/getRuleState", + "alerting:siem.eqlRule/siem/rule/getAlertSummary", + "alerting:siem.eqlRule/siem/rule/getExecutionLog", + "alerting:siem.eqlRule/siem/rule/getActionErrorLog", + "alerting:siem.eqlRule/siem/rule/find", + "alerting:siem.eqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.eqlRule/siem/rule/getBackfill", + "alerting:siem.eqlRule/siem/rule/findBackfill", + "alerting:siem.eqlRule/siem/rule/create", + "alerting:siem.eqlRule/siem/rule/delete", + "alerting:siem.eqlRule/siem/rule/update", + "alerting:siem.eqlRule/siem/rule/updateApiKey", + "alerting:siem.eqlRule/siem/rule/enable", + "alerting:siem.eqlRule/siem/rule/disable", + "alerting:siem.eqlRule/siem/rule/muteAll", + "alerting:siem.eqlRule/siem/rule/unmuteAll", + "alerting:siem.eqlRule/siem/rule/muteAlert", + "alerting:siem.eqlRule/siem/rule/unmuteAlert", + "alerting:siem.eqlRule/siem/rule/snooze", + "alerting:siem.eqlRule/siem/rule/bulkEdit", + "alerting:siem.eqlRule/siem/rule/bulkDelete", + "alerting:siem.eqlRule/siem/rule/bulkEnable", + "alerting:siem.eqlRule/siem/rule/bulkDisable", + "alerting:siem.eqlRule/siem/rule/unsnooze", + "alerting:siem.eqlRule/siem/rule/runSoon", + "alerting:siem.eqlRule/siem/rule/scheduleBackfill", + "alerting:siem.eqlRule/siem/rule/deleteBackfill", + "alerting:siem.indicatorRule/siem/rule/get", + "alerting:siem.indicatorRule/siem/rule/getRuleState", + "alerting:siem.indicatorRule/siem/rule/getAlertSummary", + "alerting:siem.indicatorRule/siem/rule/getExecutionLog", + "alerting:siem.indicatorRule/siem/rule/getActionErrorLog", + "alerting:siem.indicatorRule/siem/rule/find", + "alerting:siem.indicatorRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.indicatorRule/siem/rule/getBackfill", + "alerting:siem.indicatorRule/siem/rule/findBackfill", + "alerting:siem.indicatorRule/siem/rule/create", + "alerting:siem.indicatorRule/siem/rule/delete", + "alerting:siem.indicatorRule/siem/rule/update", + "alerting:siem.indicatorRule/siem/rule/updateApiKey", + "alerting:siem.indicatorRule/siem/rule/enable", + "alerting:siem.indicatorRule/siem/rule/disable", + "alerting:siem.indicatorRule/siem/rule/muteAll", + "alerting:siem.indicatorRule/siem/rule/unmuteAll", + "alerting:siem.indicatorRule/siem/rule/muteAlert", + "alerting:siem.indicatorRule/siem/rule/unmuteAlert", + "alerting:siem.indicatorRule/siem/rule/snooze", + "alerting:siem.indicatorRule/siem/rule/bulkEdit", + "alerting:siem.indicatorRule/siem/rule/bulkDelete", + "alerting:siem.indicatorRule/siem/rule/bulkEnable", + "alerting:siem.indicatorRule/siem/rule/bulkDisable", + "alerting:siem.indicatorRule/siem/rule/unsnooze", + "alerting:siem.indicatorRule/siem/rule/runSoon", + "alerting:siem.indicatorRule/siem/rule/scheduleBackfill", + "alerting:siem.indicatorRule/siem/rule/deleteBackfill", + "alerting:siem.mlRule/siem/rule/get", + "alerting:siem.mlRule/siem/rule/getRuleState", + "alerting:siem.mlRule/siem/rule/getAlertSummary", + "alerting:siem.mlRule/siem/rule/getExecutionLog", + "alerting:siem.mlRule/siem/rule/getActionErrorLog", + "alerting:siem.mlRule/siem/rule/find", + "alerting:siem.mlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.mlRule/siem/rule/getBackfill", + "alerting:siem.mlRule/siem/rule/findBackfill", + "alerting:siem.mlRule/siem/rule/create", + "alerting:siem.mlRule/siem/rule/delete", + "alerting:siem.mlRule/siem/rule/update", + "alerting:siem.mlRule/siem/rule/updateApiKey", + "alerting:siem.mlRule/siem/rule/enable", + "alerting:siem.mlRule/siem/rule/disable", + "alerting:siem.mlRule/siem/rule/muteAll", + "alerting:siem.mlRule/siem/rule/unmuteAll", + "alerting:siem.mlRule/siem/rule/muteAlert", + "alerting:siem.mlRule/siem/rule/unmuteAlert", + "alerting:siem.mlRule/siem/rule/snooze", + "alerting:siem.mlRule/siem/rule/bulkEdit", + "alerting:siem.mlRule/siem/rule/bulkDelete", + "alerting:siem.mlRule/siem/rule/bulkEnable", + "alerting:siem.mlRule/siem/rule/bulkDisable", + "alerting:siem.mlRule/siem/rule/unsnooze", + "alerting:siem.mlRule/siem/rule/runSoon", + "alerting:siem.mlRule/siem/rule/scheduleBackfill", + "alerting:siem.mlRule/siem/rule/deleteBackfill", + "alerting:siem.queryRule/siem/rule/get", + "alerting:siem.queryRule/siem/rule/getRuleState", + "alerting:siem.queryRule/siem/rule/getAlertSummary", + "alerting:siem.queryRule/siem/rule/getExecutionLog", + "alerting:siem.queryRule/siem/rule/getActionErrorLog", + "alerting:siem.queryRule/siem/rule/find", + "alerting:siem.queryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.queryRule/siem/rule/getBackfill", + "alerting:siem.queryRule/siem/rule/findBackfill", + "alerting:siem.queryRule/siem/rule/create", + "alerting:siem.queryRule/siem/rule/delete", + "alerting:siem.queryRule/siem/rule/update", + "alerting:siem.queryRule/siem/rule/updateApiKey", + "alerting:siem.queryRule/siem/rule/enable", + "alerting:siem.queryRule/siem/rule/disable", + "alerting:siem.queryRule/siem/rule/muteAll", + "alerting:siem.queryRule/siem/rule/unmuteAll", + "alerting:siem.queryRule/siem/rule/muteAlert", + "alerting:siem.queryRule/siem/rule/unmuteAlert", + "alerting:siem.queryRule/siem/rule/snooze", + "alerting:siem.queryRule/siem/rule/bulkEdit", + "alerting:siem.queryRule/siem/rule/bulkDelete", + "alerting:siem.queryRule/siem/rule/bulkEnable", + "alerting:siem.queryRule/siem/rule/bulkDisable", + "alerting:siem.queryRule/siem/rule/unsnooze", + "alerting:siem.queryRule/siem/rule/runSoon", + "alerting:siem.queryRule/siem/rule/scheduleBackfill", + "alerting:siem.queryRule/siem/rule/deleteBackfill", + "alerting:siem.savedQueryRule/siem/rule/get", + "alerting:siem.savedQueryRule/siem/rule/getRuleState", + "alerting:siem.savedQueryRule/siem/rule/getAlertSummary", + "alerting:siem.savedQueryRule/siem/rule/getExecutionLog", + "alerting:siem.savedQueryRule/siem/rule/getActionErrorLog", + "alerting:siem.savedQueryRule/siem/rule/find", + "alerting:siem.savedQueryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.savedQueryRule/siem/rule/getBackfill", + "alerting:siem.savedQueryRule/siem/rule/findBackfill", + "alerting:siem.savedQueryRule/siem/rule/create", + "alerting:siem.savedQueryRule/siem/rule/delete", + "alerting:siem.savedQueryRule/siem/rule/update", + "alerting:siem.savedQueryRule/siem/rule/updateApiKey", + "alerting:siem.savedQueryRule/siem/rule/enable", + "alerting:siem.savedQueryRule/siem/rule/disable", + "alerting:siem.savedQueryRule/siem/rule/muteAll", + "alerting:siem.savedQueryRule/siem/rule/unmuteAll", + "alerting:siem.savedQueryRule/siem/rule/muteAlert", + "alerting:siem.savedQueryRule/siem/rule/unmuteAlert", + "alerting:siem.savedQueryRule/siem/rule/snooze", + "alerting:siem.savedQueryRule/siem/rule/bulkEdit", + "alerting:siem.savedQueryRule/siem/rule/bulkDelete", + "alerting:siem.savedQueryRule/siem/rule/bulkEnable", + "alerting:siem.savedQueryRule/siem/rule/bulkDisable", + "alerting:siem.savedQueryRule/siem/rule/unsnooze", + "alerting:siem.savedQueryRule/siem/rule/runSoon", + "alerting:siem.savedQueryRule/siem/rule/scheduleBackfill", + "alerting:siem.savedQueryRule/siem/rule/deleteBackfill", + "alerting:siem.thresholdRule/siem/rule/get", + "alerting:siem.thresholdRule/siem/rule/getRuleState", + "alerting:siem.thresholdRule/siem/rule/getAlertSummary", + "alerting:siem.thresholdRule/siem/rule/getExecutionLog", + "alerting:siem.thresholdRule/siem/rule/getActionErrorLog", + "alerting:siem.thresholdRule/siem/rule/find", + "alerting:siem.thresholdRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.thresholdRule/siem/rule/getBackfill", + "alerting:siem.thresholdRule/siem/rule/findBackfill", + "alerting:siem.thresholdRule/siem/rule/create", + "alerting:siem.thresholdRule/siem/rule/delete", + "alerting:siem.thresholdRule/siem/rule/update", + "alerting:siem.thresholdRule/siem/rule/updateApiKey", + "alerting:siem.thresholdRule/siem/rule/enable", + "alerting:siem.thresholdRule/siem/rule/disable", + "alerting:siem.thresholdRule/siem/rule/muteAll", + "alerting:siem.thresholdRule/siem/rule/unmuteAll", + "alerting:siem.thresholdRule/siem/rule/muteAlert", + "alerting:siem.thresholdRule/siem/rule/unmuteAlert", + "alerting:siem.thresholdRule/siem/rule/snooze", + "alerting:siem.thresholdRule/siem/rule/bulkEdit", + "alerting:siem.thresholdRule/siem/rule/bulkDelete", + "alerting:siem.thresholdRule/siem/rule/bulkEnable", + "alerting:siem.thresholdRule/siem/rule/bulkDisable", + "alerting:siem.thresholdRule/siem/rule/unsnooze", + "alerting:siem.thresholdRule/siem/rule/runSoon", + "alerting:siem.thresholdRule/siem/rule/scheduleBackfill", + "alerting:siem.thresholdRule/siem/rule/deleteBackfill", + "alerting:siem.newTermsRule/siem/rule/get", + "alerting:siem.newTermsRule/siem/rule/getRuleState", + "alerting:siem.newTermsRule/siem/rule/getAlertSummary", + "alerting:siem.newTermsRule/siem/rule/getExecutionLog", + "alerting:siem.newTermsRule/siem/rule/getActionErrorLog", + "alerting:siem.newTermsRule/siem/rule/find", + "alerting:siem.newTermsRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.newTermsRule/siem/rule/getBackfill", + "alerting:siem.newTermsRule/siem/rule/findBackfill", + "alerting:siem.newTermsRule/siem/rule/create", + "alerting:siem.newTermsRule/siem/rule/delete", + "alerting:siem.newTermsRule/siem/rule/update", + "alerting:siem.newTermsRule/siem/rule/updateApiKey", + "alerting:siem.newTermsRule/siem/rule/enable", + "alerting:siem.newTermsRule/siem/rule/disable", + "alerting:siem.newTermsRule/siem/rule/muteAll", + "alerting:siem.newTermsRule/siem/rule/unmuteAll", + "alerting:siem.newTermsRule/siem/rule/muteAlert", + "alerting:siem.newTermsRule/siem/rule/unmuteAlert", + "alerting:siem.newTermsRule/siem/rule/snooze", + "alerting:siem.newTermsRule/siem/rule/bulkEdit", + "alerting:siem.newTermsRule/siem/rule/bulkDelete", + "alerting:siem.newTermsRule/siem/rule/bulkEnable", + "alerting:siem.newTermsRule/siem/rule/bulkDisable", + "alerting:siem.newTermsRule/siem/rule/unsnooze", + "alerting:siem.newTermsRule/siem/rule/runSoon", + "alerting:siem.newTermsRule/siem/rule/scheduleBackfill", + "alerting:siem.newTermsRule/siem/rule/deleteBackfill", + "alerting:siem.notifications/siem/alert/get", + "alerting:siem.notifications/siem/alert/find", + "alerting:siem.notifications/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.notifications/siem/alert/getAlertSummary", + "alerting:siem.notifications/siem/alert/update", + "alerting:siem.esqlRule/siem/alert/get", + "alerting:siem.esqlRule/siem/alert/find", + "alerting:siem.esqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.esqlRule/siem/alert/getAlertSummary", + "alerting:siem.esqlRule/siem/alert/update", + "alerting:siem.eqlRule/siem/alert/get", + "alerting:siem.eqlRule/siem/alert/find", + "alerting:siem.eqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.eqlRule/siem/alert/getAlertSummary", + "alerting:siem.eqlRule/siem/alert/update", + "alerting:siem.indicatorRule/siem/alert/get", + "alerting:siem.indicatorRule/siem/alert/find", + "alerting:siem.indicatorRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.indicatorRule/siem/alert/getAlertSummary", + "alerting:siem.indicatorRule/siem/alert/update", + "alerting:siem.mlRule/siem/alert/get", + "alerting:siem.mlRule/siem/alert/find", + "alerting:siem.mlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.mlRule/siem/alert/getAlertSummary", + "alerting:siem.mlRule/siem/alert/update", + "alerting:siem.queryRule/siem/alert/get", + "alerting:siem.queryRule/siem/alert/find", + "alerting:siem.queryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.queryRule/siem/alert/getAlertSummary", + "alerting:siem.queryRule/siem/alert/update", + "alerting:siem.savedQueryRule/siem/alert/get", + "alerting:siem.savedQueryRule/siem/alert/find", + "alerting:siem.savedQueryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.savedQueryRule/siem/alert/getAlertSummary", + "alerting:siem.savedQueryRule/siem/alert/update", + "alerting:siem.thresholdRule/siem/alert/get", + "alerting:siem.thresholdRule/siem/alert/find", + "alerting:siem.thresholdRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.thresholdRule/siem/alert/getAlertSummary", + "alerting:siem.thresholdRule/siem/alert/update", + "alerting:siem.newTermsRule/siem/alert/get", + "alerting:siem.newTermsRule/siem/alert/find", + "alerting:siem.newTermsRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.newTermsRule/siem/alert/getAlertSummary", + "alerting:siem.newTermsRule/siem/alert/update", + "api:fileUpload:analyzeFile", + "api:store_search_session", + "api:generateReport", + "app:discover", + "ui:catalogue/discover", + "ui:management/kibana/search_sessions", + "ui:management/insightsAndAlerting/reporting", + "ui:navLinks/discover", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:search/create", + "saved_object:search/bulk_create", + "saved_object:search/update", + "saved_object:search/bulk_update", + "saved_object:search/delete", + "saved_object:search/bulk_delete", + "saved_object:search/share_to_space", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "saved_object:query/create", + "saved_object:query/bulk_create", + "saved_object:query/update", + "saved_object:query/bulk_update", + "saved_object:query/delete", + "saved_object:query/bulk_delete", + "saved_object:query/share_to_space", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search-session/bulk_get", + "saved_object:search-session/get", + "saved_object:search-session/find", + "saved_object:search-session/open_point_in_time", + "saved_object:search-session/close_point_in_time", + "saved_object:search-session/create", + "saved_object:search-session/bulk_create", + "saved_object:search-session/update", + "saved_object:search-session/bulk_update", + "saved_object:search-session/delete", + "saved_object:search-session/bulk_delete", + "saved_object:search-session/share_to_space", + "ui:discover/show", + "ui:discover/save", + "ui:discover/saveQuery", + "ui:discover/createShortUrl", + "ui:discover/storeSearchSession", + "ui:discover/generateCsv", + "api:bulkGetUserProfiles", + "api:downloadCsv", + "app:dashboards", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:dashboard/create", + "saved_object:dashboard/bulk_create", + "saved_object:dashboard/update", + "saved_object:dashboard/bulk_update", + "saved_object:dashboard/delete", + "saved_object:dashboard/bulk_delete", + "saved_object:dashboard/share_to_space", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "ui:dashboard/createNew", + "ui:dashboard/show", + "ui:dashboard/showWriteControls", + "ui:dashboard/saveQuery", + "ui:dashboard/createShortUrl", + "ui:dashboard/storeSearchSession", + "ui:dashboard/generateScreenshot", + "ui:dashboard/downloadCsv", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "saved_object:visualization/create", + "saved_object:visualization/bulk_create", + "saved_object:visualization/update", + "saved_object:visualization/bulk_update", + "saved_object:visualization/delete", + "saved_object:visualization/bulk_delete", + "saved_object:visualization/share_to_space", + "saved_object:lens/create", + "saved_object:lens/bulk_create", + "saved_object:lens/update", + "saved_object:lens/bulk_update", + "saved_object:lens/delete", + "saved_object:lens/bulk_delete", + "saved_object:lens/share_to_space", + "ui:visualize/show", + "ui:visualize/delete", + "ui:visualize/save", + "ui:visualize/saveQuery", + "ui:visualize/createShortUrl", + "ui:visualize/generateScreenshot", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "saved_object:map/create", + "saved_object:map/bulk_create", + "saved_object:map/update", + "saved_object:map/bulk_update", + "saved_object:map/delete", + "saved_object:map/bulk_delete", + "saved_object:map/share_to_space", + "ui:maps/save", + "ui:maps/show", + "ui:maps/saveQuery", + ], + "minimal_read": Array [ + "login:", + "api:securitySolution", + "api:lists-read", + "api:rac", + "api:cloud-security-posture-read", + "api:cloud-defend-read", + "api:securitySolution-entity-analytics", + "api:securitySolution-threat-intelligence", + "app:securitySolution", + "app:csp", + "app:cloudDefend", + "app:kibana", + "ui:catalogue/securitySolution", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/securitySolution", + "ui:navLinks/csp", + "ui:navLinks/cloudDefend", + "ui:navLinks/kibana", + "saved_object:exception-list/bulk_get", + "saved_object:exception-list/get", + "saved_object:exception-list/find", + "saved_object:exception-list/open_point_in_time", + "saved_object:exception-list/close_point_in_time", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:siem-ui-timeline-note/bulk_get", + "saved_object:siem-ui-timeline-note/get", + "saved_object:siem-ui-timeline-note/find", + "saved_object:siem-ui-timeline-note/open_point_in_time", + "saved_object:siem-ui-timeline-note/close_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/bulk_get", + "saved_object:siem-ui-timeline-pinned-event/get", + "saved_object:siem-ui-timeline-pinned-event/find", + "saved_object:siem-ui-timeline-pinned-event/open_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/close_point_in_time", + "saved_object:siem-detection-engine-rule-actions/bulk_get", + "saved_object:siem-detection-engine-rule-actions/get", + "saved_object:siem-detection-engine-rule-actions/find", + "saved_object:siem-detection-engine-rule-actions/open_point_in_time", + "saved_object:siem-detection-engine-rule-actions/close_point_in_time", + "saved_object:security-rule/bulk_get", + "saved_object:security-rule/get", + "saved_object:security-rule/find", + "saved_object:security-rule/open_point_in_time", + "saved_object:security-rule/close_point_in_time", + "saved_object:siem-ui-timeline/bulk_get", + "saved_object:siem-ui-timeline/get", + "saved_object:siem-ui-timeline/find", + "saved_object:siem-ui-timeline/open_point_in_time", + "saved_object:siem-ui-timeline/close_point_in_time", + "saved_object:endpoint:user-artifact-manifest/bulk_get", + "saved_object:endpoint:user-artifact-manifest/get", + "saved_object:endpoint:user-artifact-manifest/find", + "saved_object:endpoint:user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_get", + "saved_object:endpoint:unified-user-artifact-manifest/get", + "saved_object:endpoint:unified-user-artifact-manifest/find", + "saved_object:endpoint:unified-user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/close_point_in_time", + "saved_object:security-solution-signals-migration/bulk_get", + "saved_object:security-solution-signals-migration/get", + "saved_object:security-solution-signals-migration/find", + "saved_object:security-solution-signals-migration/open_point_in_time", + "saved_object:security-solution-signals-migration/close_point_in_time", + "saved_object:risk-engine-configuration/bulk_get", + "saved_object:risk-engine-configuration/get", + "saved_object:risk-engine-configuration/find", + "saved_object:risk-engine-configuration/open_point_in_time", + "saved_object:risk-engine-configuration/close_point_in_time", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "saved_object:csp_rule/bulk_get", + "saved_object:csp_rule/get", + "saved_object:csp_rule/find", + "saved_object:csp_rule/open_point_in_time", + "saved_object:csp_rule/close_point_in_time", + "saved_object:cloud-security-posture-settings/bulk_get", + "saved_object:cloud-security-posture-settings/get", + "saved_object:cloud-security-posture-settings/find", + "saved_object:cloud-security-posture-settings/open_point_in_time", + "saved_object:cloud-security-posture-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:siem/show", + "ui:siem/entity-analytics", + "ui:siem/investigation-guide", + "ui:siem/investigation-guide-interactions", + "ui:siem/threat-intelligence", + "alerting:siem.notifications/siem/rule/get", + "alerting:siem.notifications/siem/rule/getRuleState", + "alerting:siem.notifications/siem/rule/getAlertSummary", + "alerting:siem.notifications/siem/rule/getExecutionLog", + "alerting:siem.notifications/siem/rule/getActionErrorLog", + "alerting:siem.notifications/siem/rule/find", + "alerting:siem.notifications/siem/rule/getRuleExecutionKPI", + "alerting:siem.notifications/siem/rule/getBackfill", + "alerting:siem.notifications/siem/rule/findBackfill", + "alerting:siem.esqlRule/siem/rule/get", + "alerting:siem.esqlRule/siem/rule/getRuleState", + "alerting:siem.esqlRule/siem/rule/getAlertSummary", + "alerting:siem.esqlRule/siem/rule/getExecutionLog", + "alerting:siem.esqlRule/siem/rule/getActionErrorLog", + "alerting:siem.esqlRule/siem/rule/find", + "alerting:siem.esqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.esqlRule/siem/rule/getBackfill", + "alerting:siem.esqlRule/siem/rule/findBackfill", + "alerting:siem.eqlRule/siem/rule/get", + "alerting:siem.eqlRule/siem/rule/getRuleState", + "alerting:siem.eqlRule/siem/rule/getAlertSummary", + "alerting:siem.eqlRule/siem/rule/getExecutionLog", + "alerting:siem.eqlRule/siem/rule/getActionErrorLog", + "alerting:siem.eqlRule/siem/rule/find", + "alerting:siem.eqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.eqlRule/siem/rule/getBackfill", + "alerting:siem.eqlRule/siem/rule/findBackfill", + "alerting:siem.indicatorRule/siem/rule/get", + "alerting:siem.indicatorRule/siem/rule/getRuleState", + "alerting:siem.indicatorRule/siem/rule/getAlertSummary", + "alerting:siem.indicatorRule/siem/rule/getExecutionLog", + "alerting:siem.indicatorRule/siem/rule/getActionErrorLog", + "alerting:siem.indicatorRule/siem/rule/find", + "alerting:siem.indicatorRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.indicatorRule/siem/rule/getBackfill", + "alerting:siem.indicatorRule/siem/rule/findBackfill", + "alerting:siem.mlRule/siem/rule/get", + "alerting:siem.mlRule/siem/rule/getRuleState", + "alerting:siem.mlRule/siem/rule/getAlertSummary", + "alerting:siem.mlRule/siem/rule/getExecutionLog", + "alerting:siem.mlRule/siem/rule/getActionErrorLog", + "alerting:siem.mlRule/siem/rule/find", + "alerting:siem.mlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.mlRule/siem/rule/getBackfill", + "alerting:siem.mlRule/siem/rule/findBackfill", + "alerting:siem.queryRule/siem/rule/get", + "alerting:siem.queryRule/siem/rule/getRuleState", + "alerting:siem.queryRule/siem/rule/getAlertSummary", + "alerting:siem.queryRule/siem/rule/getExecutionLog", + "alerting:siem.queryRule/siem/rule/getActionErrorLog", + "alerting:siem.queryRule/siem/rule/find", + "alerting:siem.queryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.queryRule/siem/rule/getBackfill", + "alerting:siem.queryRule/siem/rule/findBackfill", + "alerting:siem.savedQueryRule/siem/rule/get", + "alerting:siem.savedQueryRule/siem/rule/getRuleState", + "alerting:siem.savedQueryRule/siem/rule/getAlertSummary", + "alerting:siem.savedQueryRule/siem/rule/getExecutionLog", + "alerting:siem.savedQueryRule/siem/rule/getActionErrorLog", + "alerting:siem.savedQueryRule/siem/rule/find", + "alerting:siem.savedQueryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.savedQueryRule/siem/rule/getBackfill", + "alerting:siem.savedQueryRule/siem/rule/findBackfill", + "alerting:siem.thresholdRule/siem/rule/get", + "alerting:siem.thresholdRule/siem/rule/getRuleState", + "alerting:siem.thresholdRule/siem/rule/getAlertSummary", + "alerting:siem.thresholdRule/siem/rule/getExecutionLog", + "alerting:siem.thresholdRule/siem/rule/getActionErrorLog", + "alerting:siem.thresholdRule/siem/rule/find", + "alerting:siem.thresholdRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.thresholdRule/siem/rule/getBackfill", + "alerting:siem.thresholdRule/siem/rule/findBackfill", + "alerting:siem.newTermsRule/siem/rule/get", + "alerting:siem.newTermsRule/siem/rule/getRuleState", + "alerting:siem.newTermsRule/siem/rule/getAlertSummary", + "alerting:siem.newTermsRule/siem/rule/getExecutionLog", + "alerting:siem.newTermsRule/siem/rule/getActionErrorLog", + "alerting:siem.newTermsRule/siem/rule/find", + "alerting:siem.newTermsRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.newTermsRule/siem/rule/getBackfill", + "alerting:siem.newTermsRule/siem/rule/findBackfill", + "alerting:siem.notifications/siem/alert/get", + "alerting:siem.notifications/siem/alert/find", + "alerting:siem.notifications/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.notifications/siem/alert/getAlertSummary", + "alerting:siem.notifications/siem/alert/update", + "alerting:siem.esqlRule/siem/alert/get", + "alerting:siem.esqlRule/siem/alert/find", + "alerting:siem.esqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.esqlRule/siem/alert/getAlertSummary", + "alerting:siem.esqlRule/siem/alert/update", + "alerting:siem.eqlRule/siem/alert/get", + "alerting:siem.eqlRule/siem/alert/find", + "alerting:siem.eqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.eqlRule/siem/alert/getAlertSummary", + "alerting:siem.eqlRule/siem/alert/update", + "alerting:siem.indicatorRule/siem/alert/get", + "alerting:siem.indicatorRule/siem/alert/find", + "alerting:siem.indicatorRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.indicatorRule/siem/alert/getAlertSummary", + "alerting:siem.indicatorRule/siem/alert/update", + "alerting:siem.mlRule/siem/alert/get", + "alerting:siem.mlRule/siem/alert/find", + "alerting:siem.mlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.mlRule/siem/alert/getAlertSummary", + "alerting:siem.mlRule/siem/alert/update", + "alerting:siem.queryRule/siem/alert/get", + "alerting:siem.queryRule/siem/alert/find", + "alerting:siem.queryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.queryRule/siem/alert/getAlertSummary", + "alerting:siem.queryRule/siem/alert/update", + "alerting:siem.savedQueryRule/siem/alert/get", + "alerting:siem.savedQueryRule/siem/alert/find", + "alerting:siem.savedQueryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.savedQueryRule/siem/alert/getAlertSummary", + "alerting:siem.savedQueryRule/siem/alert/update", + "alerting:siem.thresholdRule/siem/alert/get", + "alerting:siem.thresholdRule/siem/alert/find", + "alerting:siem.thresholdRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.thresholdRule/siem/alert/getAlertSummary", + "alerting:siem.thresholdRule/siem/alert/update", + "alerting:siem.newTermsRule/siem/alert/get", + "alerting:siem.newTermsRule/siem/alert/find", + "alerting:siem.newTermsRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.newTermsRule/siem/alert/getAlertSummary", + "alerting:siem.newTermsRule/siem/alert/update", + "app:discover", + "ui:catalogue/discover", + "ui:navLinks/discover", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "ui:discover/show", + "ui:discover/createShortUrl", + "api:bulkGetUserProfiles", + "app:dashboards", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "ui:dashboard/show", + "ui:dashboard/createShortUrl", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "ui:visualize/show", + "ui:visualize/createShortUrl", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + ], + "policy_management_all": Array [ + "login:", + "api:securitySolution-writePolicyManagement", + "api:securitySolution-readPolicyManagement", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "saved_object:policy-settings-protection-updates-note/create", + "saved_object:policy-settings-protection-updates-note/bulk_create", + "saved_object:policy-settings-protection-updates-note/update", + "saved_object:policy-settings-protection-updates-note/bulk_update", + "saved_object:policy-settings-protection-updates-note/delete", + "saved_object:policy-settings-protection-updates-note/bulk_delete", + "saved_object:policy-settings-protection-updates-note/share_to_space", + "ui:siem/writePolicyManagement", + "ui:siem/readPolicyManagement", + ], + "policy_management_read": Array [ + "login:", + "api:securitySolution-readPolicyManagement", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "ui:siem/readPolicyManagement", + ], + "process_operations_all": Array [ + "login:", + "api:securitySolution-writeProcessOperations", + "ui:siem/writeProcessOperations", + ], + "read": Array [ + "login:", + "api:securitySolution", + "api:lists-read", + "api:rac", + "api:cloud-security-posture-read", + "api:cloud-defend-read", + "api:securitySolution-entity-analytics", + "api:securitySolution-threat-intelligence", + "api:securitySolution-showEndpointExceptions", + "app:securitySolution", + "app:csp", + "app:cloudDefend", + "app:kibana", + "ui:catalogue/securitySolution", + "ui:management/insightsAndAlerting/triggersActions", + "ui:navLinks/securitySolution", + "ui:navLinks/csp", + "ui:navLinks/cloudDefend", + "ui:navLinks/kibana", + "saved_object:exception-list/bulk_get", + "saved_object:exception-list/get", + "saved_object:exception-list/find", + "saved_object:exception-list/open_point_in_time", + "saved_object:exception-list/close_point_in_time", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:index-pattern/bulk_get", + "saved_object:index-pattern/get", + "saved_object:index-pattern/find", + "saved_object:index-pattern/open_point_in_time", + "saved_object:index-pattern/close_point_in_time", + "saved_object:siem-ui-timeline-note/bulk_get", + "saved_object:siem-ui-timeline-note/get", + "saved_object:siem-ui-timeline-note/find", + "saved_object:siem-ui-timeline-note/open_point_in_time", + "saved_object:siem-ui-timeline-note/close_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/bulk_get", + "saved_object:siem-ui-timeline-pinned-event/get", + "saved_object:siem-ui-timeline-pinned-event/find", + "saved_object:siem-ui-timeline-pinned-event/open_point_in_time", + "saved_object:siem-ui-timeline-pinned-event/close_point_in_time", + "saved_object:siem-detection-engine-rule-actions/bulk_get", + "saved_object:siem-detection-engine-rule-actions/get", + "saved_object:siem-detection-engine-rule-actions/find", + "saved_object:siem-detection-engine-rule-actions/open_point_in_time", + "saved_object:siem-detection-engine-rule-actions/close_point_in_time", + "saved_object:security-rule/bulk_get", + "saved_object:security-rule/get", + "saved_object:security-rule/find", + "saved_object:security-rule/open_point_in_time", + "saved_object:security-rule/close_point_in_time", + "saved_object:siem-ui-timeline/bulk_get", + "saved_object:siem-ui-timeline/get", + "saved_object:siem-ui-timeline/find", + "saved_object:siem-ui-timeline/open_point_in_time", + "saved_object:siem-ui-timeline/close_point_in_time", + "saved_object:endpoint:user-artifact-manifest/bulk_get", + "saved_object:endpoint:user-artifact-manifest/get", + "saved_object:endpoint:user-artifact-manifest/find", + "saved_object:endpoint:user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:user-artifact-manifest/close_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/bulk_get", + "saved_object:endpoint:unified-user-artifact-manifest/get", + "saved_object:endpoint:unified-user-artifact-manifest/find", + "saved_object:endpoint:unified-user-artifact-manifest/open_point_in_time", + "saved_object:endpoint:unified-user-artifact-manifest/close_point_in_time", + "saved_object:security-solution-signals-migration/bulk_get", + "saved_object:security-solution-signals-migration/get", + "saved_object:security-solution-signals-migration/find", + "saved_object:security-solution-signals-migration/open_point_in_time", + "saved_object:security-solution-signals-migration/close_point_in_time", + "saved_object:risk-engine-configuration/bulk_get", + "saved_object:risk-engine-configuration/get", + "saved_object:risk-engine-configuration/find", + "saved_object:risk-engine-configuration/open_point_in_time", + "saved_object:risk-engine-configuration/close_point_in_time", + "saved_object:policy-settings-protection-updates-note/bulk_get", + "saved_object:policy-settings-protection-updates-note/get", + "saved_object:policy-settings-protection-updates-note/find", + "saved_object:policy-settings-protection-updates-note/open_point_in_time", + "saved_object:policy-settings-protection-updates-note/close_point_in_time", + "saved_object:csp_rule/bulk_get", + "saved_object:csp_rule/get", + "saved_object:csp_rule/find", + "saved_object:csp_rule/open_point_in_time", + "saved_object:csp_rule/close_point_in_time", + "saved_object:cloud-security-posture-settings/bulk_get", + "saved_object:cloud-security-posture-settings/get", + "saved_object:cloud-security-posture-settings/find", + "saved_object:cloud-security-posture-settings/open_point_in_time", + "saved_object:cloud-security-posture-settings/close_point_in_time", + "saved_object:config/bulk_get", + "saved_object:config/get", + "saved_object:config/find", + "saved_object:config/open_point_in_time", + "saved_object:config/close_point_in_time", + "saved_object:config-global/bulk_get", + "saved_object:config-global/get", + "saved_object:config-global/find", + "saved_object:config-global/open_point_in_time", + "saved_object:config-global/close_point_in_time", + "saved_object:telemetry/bulk_get", + "saved_object:telemetry/get", + "saved_object:telemetry/find", + "saved_object:telemetry/open_point_in_time", + "saved_object:telemetry/close_point_in_time", + "saved_object:url/bulk_get", + "saved_object:url/get", + "saved_object:url/find", + "saved_object:url/open_point_in_time", + "saved_object:url/close_point_in_time", + "ui:siem/show", + "ui:siem/entity-analytics", + "ui:siem/investigation-guide", + "ui:siem/investigation-guide-interactions", + "ui:siem/threat-intelligence", + "ui:siem/showEndpointExceptions", + "alerting:siem.notifications/siem/rule/get", + "alerting:siem.notifications/siem/rule/getRuleState", + "alerting:siem.notifications/siem/rule/getAlertSummary", + "alerting:siem.notifications/siem/rule/getExecutionLog", + "alerting:siem.notifications/siem/rule/getActionErrorLog", + "alerting:siem.notifications/siem/rule/find", + "alerting:siem.notifications/siem/rule/getRuleExecutionKPI", + "alerting:siem.notifications/siem/rule/getBackfill", + "alerting:siem.notifications/siem/rule/findBackfill", + "alerting:siem.esqlRule/siem/rule/get", + "alerting:siem.esqlRule/siem/rule/getRuleState", + "alerting:siem.esqlRule/siem/rule/getAlertSummary", + "alerting:siem.esqlRule/siem/rule/getExecutionLog", + "alerting:siem.esqlRule/siem/rule/getActionErrorLog", + "alerting:siem.esqlRule/siem/rule/find", + "alerting:siem.esqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.esqlRule/siem/rule/getBackfill", + "alerting:siem.esqlRule/siem/rule/findBackfill", + "alerting:siem.eqlRule/siem/rule/get", + "alerting:siem.eqlRule/siem/rule/getRuleState", + "alerting:siem.eqlRule/siem/rule/getAlertSummary", + "alerting:siem.eqlRule/siem/rule/getExecutionLog", + "alerting:siem.eqlRule/siem/rule/getActionErrorLog", + "alerting:siem.eqlRule/siem/rule/find", + "alerting:siem.eqlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.eqlRule/siem/rule/getBackfill", + "alerting:siem.eqlRule/siem/rule/findBackfill", + "alerting:siem.indicatorRule/siem/rule/get", + "alerting:siem.indicatorRule/siem/rule/getRuleState", + "alerting:siem.indicatorRule/siem/rule/getAlertSummary", + "alerting:siem.indicatorRule/siem/rule/getExecutionLog", + "alerting:siem.indicatorRule/siem/rule/getActionErrorLog", + "alerting:siem.indicatorRule/siem/rule/find", + "alerting:siem.indicatorRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.indicatorRule/siem/rule/getBackfill", + "alerting:siem.indicatorRule/siem/rule/findBackfill", + "alerting:siem.mlRule/siem/rule/get", + "alerting:siem.mlRule/siem/rule/getRuleState", + "alerting:siem.mlRule/siem/rule/getAlertSummary", + "alerting:siem.mlRule/siem/rule/getExecutionLog", + "alerting:siem.mlRule/siem/rule/getActionErrorLog", + "alerting:siem.mlRule/siem/rule/find", + "alerting:siem.mlRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.mlRule/siem/rule/getBackfill", + "alerting:siem.mlRule/siem/rule/findBackfill", + "alerting:siem.queryRule/siem/rule/get", + "alerting:siem.queryRule/siem/rule/getRuleState", + "alerting:siem.queryRule/siem/rule/getAlertSummary", + "alerting:siem.queryRule/siem/rule/getExecutionLog", + "alerting:siem.queryRule/siem/rule/getActionErrorLog", + "alerting:siem.queryRule/siem/rule/find", + "alerting:siem.queryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.queryRule/siem/rule/getBackfill", + "alerting:siem.queryRule/siem/rule/findBackfill", + "alerting:siem.savedQueryRule/siem/rule/get", + "alerting:siem.savedQueryRule/siem/rule/getRuleState", + "alerting:siem.savedQueryRule/siem/rule/getAlertSummary", + "alerting:siem.savedQueryRule/siem/rule/getExecutionLog", + "alerting:siem.savedQueryRule/siem/rule/getActionErrorLog", + "alerting:siem.savedQueryRule/siem/rule/find", + "alerting:siem.savedQueryRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.savedQueryRule/siem/rule/getBackfill", + "alerting:siem.savedQueryRule/siem/rule/findBackfill", + "alerting:siem.thresholdRule/siem/rule/get", + "alerting:siem.thresholdRule/siem/rule/getRuleState", + "alerting:siem.thresholdRule/siem/rule/getAlertSummary", + "alerting:siem.thresholdRule/siem/rule/getExecutionLog", + "alerting:siem.thresholdRule/siem/rule/getActionErrorLog", + "alerting:siem.thresholdRule/siem/rule/find", + "alerting:siem.thresholdRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.thresholdRule/siem/rule/getBackfill", + "alerting:siem.thresholdRule/siem/rule/findBackfill", + "alerting:siem.newTermsRule/siem/rule/get", + "alerting:siem.newTermsRule/siem/rule/getRuleState", + "alerting:siem.newTermsRule/siem/rule/getAlertSummary", + "alerting:siem.newTermsRule/siem/rule/getExecutionLog", + "alerting:siem.newTermsRule/siem/rule/getActionErrorLog", + "alerting:siem.newTermsRule/siem/rule/find", + "alerting:siem.newTermsRule/siem/rule/getRuleExecutionKPI", + "alerting:siem.newTermsRule/siem/rule/getBackfill", + "alerting:siem.newTermsRule/siem/rule/findBackfill", + "alerting:siem.notifications/siem/alert/get", + "alerting:siem.notifications/siem/alert/find", + "alerting:siem.notifications/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.notifications/siem/alert/getAlertSummary", + "alerting:siem.notifications/siem/alert/update", + "alerting:siem.esqlRule/siem/alert/get", + "alerting:siem.esqlRule/siem/alert/find", + "alerting:siem.esqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.esqlRule/siem/alert/getAlertSummary", + "alerting:siem.esqlRule/siem/alert/update", + "alerting:siem.eqlRule/siem/alert/get", + "alerting:siem.eqlRule/siem/alert/find", + "alerting:siem.eqlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.eqlRule/siem/alert/getAlertSummary", + "alerting:siem.eqlRule/siem/alert/update", + "alerting:siem.indicatorRule/siem/alert/get", + "alerting:siem.indicatorRule/siem/alert/find", + "alerting:siem.indicatorRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.indicatorRule/siem/alert/getAlertSummary", + "alerting:siem.indicatorRule/siem/alert/update", + "alerting:siem.mlRule/siem/alert/get", + "alerting:siem.mlRule/siem/alert/find", + "alerting:siem.mlRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.mlRule/siem/alert/getAlertSummary", + "alerting:siem.mlRule/siem/alert/update", + "alerting:siem.queryRule/siem/alert/get", + "alerting:siem.queryRule/siem/alert/find", + "alerting:siem.queryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.queryRule/siem/alert/getAlertSummary", + "alerting:siem.queryRule/siem/alert/update", + "alerting:siem.savedQueryRule/siem/alert/get", + "alerting:siem.savedQueryRule/siem/alert/find", + "alerting:siem.savedQueryRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.savedQueryRule/siem/alert/getAlertSummary", + "alerting:siem.savedQueryRule/siem/alert/update", + "alerting:siem.thresholdRule/siem/alert/get", + "alerting:siem.thresholdRule/siem/alert/find", + "alerting:siem.thresholdRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.thresholdRule/siem/alert/getAlertSummary", + "alerting:siem.thresholdRule/siem/alert/update", + "alerting:siem.newTermsRule/siem/alert/get", + "alerting:siem.newTermsRule/siem/alert/find", + "alerting:siem.newTermsRule/siem/alert/getAuthorizedAlertsIndices", + "alerting:siem.newTermsRule/siem/alert/getAlertSummary", + "alerting:siem.newTermsRule/siem/alert/update", + "app:discover", + "ui:catalogue/discover", + "ui:navLinks/discover", + "saved_object:url/create", + "saved_object:url/bulk_create", + "saved_object:url/update", + "saved_object:url/bulk_update", + "saved_object:url/delete", + "saved_object:url/bulk_delete", + "saved_object:url/share_to_space", + "saved_object:search/bulk_get", + "saved_object:search/get", + "saved_object:search/find", + "saved_object:search/open_point_in_time", + "saved_object:search/close_point_in_time", + "saved_object:query/bulk_get", + "saved_object:query/get", + "saved_object:query/find", + "saved_object:query/open_point_in_time", + "saved_object:query/close_point_in_time", + "ui:discover/show", + "ui:discover/createShortUrl", + "api:bulkGetUserProfiles", + "app:dashboards", + "ui:catalogue/dashboard", + "ui:navLinks/dashboards", + "saved_object:visualization/bulk_get", + "saved_object:visualization/get", + "saved_object:visualization/find", + "saved_object:visualization/open_point_in_time", + "saved_object:visualization/close_point_in_time", + "saved_object:canvas-workpad/bulk_get", + "saved_object:canvas-workpad/get", + "saved_object:canvas-workpad/find", + "saved_object:canvas-workpad/open_point_in_time", + "saved_object:canvas-workpad/close_point_in_time", + "saved_object:lens/bulk_get", + "saved_object:lens/get", + "saved_object:lens/find", + "saved_object:lens/open_point_in_time", + "saved_object:lens/close_point_in_time", + "saved_object:links/bulk_get", + "saved_object:links/get", + "saved_object:links/find", + "saved_object:links/open_point_in_time", + "saved_object:links/close_point_in_time", + "saved_object:map/bulk_get", + "saved_object:map/get", + "saved_object:map/find", + "saved_object:map/open_point_in_time", + "saved_object:map/close_point_in_time", + "saved_object:dashboard/bulk_get", + "saved_object:dashboard/get", + "saved_object:dashboard/find", + "saved_object:dashboard/open_point_in_time", + "saved_object:dashboard/close_point_in_time", + "saved_object:tag/bulk_get", + "saved_object:tag/get", + "saved_object:tag/find", + "saved_object:tag/open_point_in_time", + "saved_object:tag/close_point_in_time", + "ui:dashboard/show", + "ui:dashboard/createShortUrl", + "app:visualize", + "app:lens", + "ui:catalogue/visualize", + "ui:navLinks/visualize", + "ui:navLinks/lens", + "ui:visualize/show", + "ui:visualize/createShortUrl", + "app:maps", + "ui:catalogue/maps", + "ui:navLinks/maps", + "ui:maps/show", + ], + "trusted_applications_all": Array [ + "login:", + "api:lists-all", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-writeTrustedApplications", + "api:securitySolution-readTrustedApplications", + "saved_object:exception-list-agnostic/bulk_get", + "saved_object:exception-list-agnostic/get", + "saved_object:exception-list-agnostic/find", + "saved_object:exception-list-agnostic/open_point_in_time", + "saved_object:exception-list-agnostic/close_point_in_time", + "saved_object:exception-list-agnostic/create", + "saved_object:exception-list-agnostic/bulk_create", + "saved_object:exception-list-agnostic/update", + "saved_object:exception-list-agnostic/bulk_update", + "saved_object:exception-list-agnostic/delete", + "saved_object:exception-list-agnostic/bulk_delete", + "saved_object:exception-list-agnostic/share_to_space", + "ui:siem/writeTrustedApplications", + "ui:siem/readTrustedApplications", + ], + "trusted_applications_read": Array [ + "login:", + "api:lists-read", + "api:lists-summary", + "api:securitySolution-readTrustedApplications", + "ui:siem/readTrustedApplications", + ], + }, + } + `); + }); + }); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/security/platform_security/index.ts b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/index.ts new file mode 100644 index 00000000000000..5271f15b683f13 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/security/platform_security/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ loadTestFile }: FtrProviderContext) { + describe('Platform security APIs', function () { + loadTestFile(require.resolve('./authorization')); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/security/telemetry/telemetry_config.ts b/x-pack/test_serverless/api_integration/test_suites/security/telemetry/telemetry_config.ts index 6701fc93a506a3..66f76ac669a814 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/telemetry/telemetry_config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/telemetry/telemetry_config.ts @@ -34,7 +34,8 @@ export default function telemetryConfigTest({ getService }: FtrProviderContext) expect(body).toMatchObject(baseConfig); }); - it('GET should get updated labels after dynamically updating them', async () => { + // coreApp.allowDynamicConfigOverrides is disabled + it.skip('GET should get updated labels after dynamically updating them', async () => { await supertest .put('/internal/core/_settings') .set(svlCommonApi.getInternalRequestHeader()) diff --git a/x-pack/test_serverless/functional/test_suites/common/management/ingest_pipelines.ts b/x-pack/test_serverless/functional/test_suites/common/management/ingest_pipelines.ts index 3b0c9b01907da7..aa1cb5eee16a7d 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/ingest_pipelines.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/ingest_pipelines.ts @@ -75,9 +75,17 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); describe('Create pipeline', () => { + beforeEach(async () => { + await pageObjects.common.navigateToApp('ingestPipelines'); + }); + afterEach(async () => { - // Delete the pipeline that was created - await es.ingest.deletePipeline({ id: TEST_PIPELINE_NAME }); + const pipeline = await es.ingest.getPipeline({ id: TEST_PIPELINE_NAME }); + + // Only if the pipeline exists between runs, we delete it + if (pipeline) { + await es.ingest.deletePipeline({ id: TEST_PIPELINE_NAME }); + } }); it('Creates a pipeline', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/advanced_settings.ts b/x-pack/test_serverless/functional/test_suites/observability/advanced_settings.ts index d6f2ef6502f2df..0e3c4d65349c9c 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/advanced_settings.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/advanced_settings.ts @@ -18,7 +18,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Observability advanced settings', function () { before(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('admin'); await pageObjects.common.navigateToApp('settings'); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts index 2dda21ca852151..7719ba01ce8ead 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/attachment_framework.ts @@ -26,7 +26,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { describe('Cases persistable attachments', function () { describe('lens visualization', () => { before(async () => { - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); await kibanaServer.savedObjects.cleanStandardList(); await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); await kibanaServer.importExport.load( diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts index 7b56c069fec5df..8a966c6b7d1353 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/configure.ts @@ -23,7 +23,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { describe('Configure Case', function () { before(async () => { - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); await svlObltNavigation.navigateToLandingPage(); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-overview:cases' }); await header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/create_case_form.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/create_case_form.ts index c1b2f1e0068a54..88f2663a10749e 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/create_case_form.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/create_case_form.ts @@ -25,7 +25,7 @@ export default ({ getService, getPageObject }: FtrProviderContext) => { const header = getPageObject('header'); before(async () => { - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); }); beforeEach(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts index 6009c4557bed62..e98cc99bdec5b4 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/list_view.ts @@ -21,7 +21,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { describe('Cases list', function () { before(async () => { - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); await svlObltNavigation.navigateToLandingPage(); await svlCommonNavigation.sidenav.clickLink({ deepLinkId: 'observability-overview:cases' }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/cases/view_case.ts b/x-pack/test_serverless/functional/test_suites/observability/cases/view_case.ts index a4bc060062ad77..5962a5f7c41950 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/cases/view_case.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/cases/view_case.ts @@ -36,7 +36,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { describe('Case View', function () { before(async () => { - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/header_menu.ts index 0f9ed330c3ad4f..e59021dbd7e1aa 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/header_menu.ts @@ -16,7 +16,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Header menu', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('viewer'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts index 22757855e02f8c..45aa6222813122 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/hosts_page.ts @@ -45,7 +45,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { await Promise.all([ esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'), ]); - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('viewer'); await browser.setWindowSize(1600, 1200); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts index 677611b3e4ef7e..0f9ddcef05db6c 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/infra.ts @@ -31,7 +31,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Infra pages', function () { before(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('viewer'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts index 6f03c8831ce856..6bbb746eb65a67 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/navigation.ts @@ -26,7 +26,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { describe('Infra Side Navigation', () => { before(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('viewer'); await svlObltNavigation.navigateToLandingPage(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/infra/node_details.ts b/x-pack/test_serverless/functional/test_suites/observability/infra/node_details.ts index 4decf638741f04..bd56244eb12ba3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/infra/node_details.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/infra/node_details.ts @@ -35,7 +35,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('viewer'); await pageObjects.common.navigateToApp( `metrics/${NODE_DETAILS_PATH}/demo-stack-kubernetes-01` ); diff --git a/x-pack/test_serverless/functional/test_suites/observability/ml/anomaly_detection_jobs_list.ts b/x-pack/test_serverless/functional/test_suites/observability/ml/anomaly_detection_jobs_list.ts index f4d0077f6b73c4..e8dddef3eb35ac 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/ml/anomaly_detection_jobs_list.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/ml/anomaly_detection_jobs_list.ts @@ -19,7 +19,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // Error: Failed to delete all indices with pattern [.ml-*] this.tags(['failsOnMKI']); before(async () => { - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('admin'); // Load logstash* data and create dataview for logstash*, logstash-2015.09.22 await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/logstash_functional'); diff --git a/x-pack/test_serverless/functional/test_suites/observability/ml/search_bar_features.ts b/x-pack/test_serverless/functional/test_suites/observability/ml/search_bar_features.ts index fec1fbd9d3646a..15b7d3d76c61af 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/ml/search_bar_features.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/ml/search_bar_features.ts @@ -10,80 +10,90 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function ({ getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['header', 'svlCommonPage', 'svlCommonNavigation']); - const allLabels = [ - { label: 'Machine Learning', expected: true }, - { label: 'Machine Learning / Overview', expected: true }, - { label: 'Machine Learning / Anomaly Detection', expected: true }, - { label: 'Machine Learning / Anomaly Detection / Anomaly explorer', expected: true }, - { label: 'Machine Learning / Anomaly Detection / Single metric viewer', expected: true }, - { label: 'Machine Learning / Data Frame Analytics', expected: false }, - { label: 'Machine Learning / Data Frame Analytics / Results explorer', expected: false }, - { label: 'Machine Learning / Data Frame Analytics / Analytics map', expected: false }, - { label: 'Machine Learning / Model Management', expected: true }, - { label: 'Machine Learning / Model Management / Trained Models', expected: true }, - { label: 'Machine Learning / Model Management / Nodes', expected: false }, - { label: 'Machine Learning / Memory Usage', expected: true }, - { label: 'Machine Learning / Settings', expected: true }, - { label: 'Machine Learning / Settings / Calendars', expected: true }, - { label: 'Machine Learning / Settings / Filter Lists', expected: true }, - { label: 'Machine Learning / AIOps', expected: true }, - { label: 'Machine Learning / AIOps / Log Rate Analysis', expected: true }, - { label: 'Machine Learning / AIOps / Log Pattern Analysis', expected: true }, - { label: 'Machine Learning / AIOps / Change Point Detection', expected: true }, - { label: 'Machine Learning / Notifications', expected: true }, - { label: 'Machine Learning / Data Visualizer', expected: true }, - { label: 'Machine Learning / File Upload', expected: true }, - { label: 'Machine Learning / Index Data Visualizer', expected: true }, - { label: 'Machine Learning / ES|QL Data Visualizer', expected: true }, - { label: 'Machine Learning / Data Drift', expected: true }, - { label: 'Alerts and Insights / Machine Learning', expected: true }, - ]; + const allLabels = { + viewer: [ + { label: 'Machine Learning', expected: true }, + { label: 'Machine Learning / Overview', expected: true }, + { label: 'Machine Learning / Anomaly Detection', expected: true }, + { label: 'Machine Learning / Anomaly Detection / Anomaly explorer', expected: true }, + { label: 'Machine Learning / Anomaly Detection / Single metric viewer', expected: true }, + { label: 'Machine Learning / Data Frame Analytics', expected: false }, + { label: 'Machine Learning / Data Frame Analytics / Results explorer', expected: false }, + { label: 'Machine Learning / Data Frame Analytics / Analytics map', expected: false }, + { label: 'Machine Learning / Model Management', expected: true }, + { label: 'Machine Learning / Model Management / Trained Models', expected: true }, + { label: 'Machine Learning / Model Management / Nodes', expected: false }, + { label: 'Machine Learning / Memory Usage', expected: true }, + { label: 'Machine Learning / Settings', expected: true }, + { label: 'Machine Learning / Settings / Calendars', expected: true }, + { label: 'Machine Learning / Settings / Filter Lists', expected: true }, + { label: 'Machine Learning / AIOps', expected: true }, + { label: 'Machine Learning / AIOps / Log Rate Analysis', expected: true }, + { label: 'Machine Learning / AIOps / Log Pattern Analysis', expected: true }, + { label: 'Machine Learning / AIOps / Change Point Detection', expected: true }, + { label: 'Machine Learning / Notifications', expected: true }, + { label: 'Machine Learning / Data Visualizer', expected: true }, + { label: 'Machine Learning / File Upload', expected: true }, + { label: 'Machine Learning / Index Data Visualizer', expected: true }, + { label: 'Machine Learning / ES|QL Data Visualizer', expected: true }, + { label: 'Machine Learning / Data Drift', expected: true }, + ], + admin: [{ label: 'Alerts and Insights / Machine Learning', expected: true }], + }; describe('Search bar features', () => { - before(async () => { - await PageObjects.svlCommonPage.login(); - }); + ([{ role: 'viewer' }, { role: 'admin' }] as Array<{ role: keyof typeof allLabels }>).forEach( + ({ role }) => { + describe(`user role: ${role}`, () => { + before(async () => { + await PageObjects.svlCommonPage.loginWithRole(role); + }); - after(async () => { - await PageObjects.svlCommonPage.forceLogout(); - }); + after(async () => { + await PageObjects.svlCommonPage.forceLogout(); + }); - describe('list features', () => { - it('has the correct features enabled', async () => { - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.svlCommonNavigation.search.showSearch(); + describe('list features', () => { + it('has the correct features enabled', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.svlCommonNavigation.search.showSearch(); - const expectedLabels = allLabels.filter((l) => l.expected).map((l) => l.label); + const expectedLabels = allLabels[role].filter((l) => l.expected).map((l) => l.label); - for (const expectedLabel of expectedLabels) { - await PageObjects.svlCommonNavigation.search.searchFor(expectedLabel); - const [result] = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); - const label = result?.label; - expect(label).to.eql( - expectedLabel, - `First result should be ${expectedLabel} (got matching items '${label}')` - ); - } - await PageObjects.svlCommonNavigation.search.hideSearch(); - }); + for (const expectedLabel of expectedLabels) { + await PageObjects.svlCommonNavigation.search.searchFor(expectedLabel); + const [result] = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); + const label = result?.label; + expect(label).to.eql( + expectedLabel, + `First result should be ${expectedLabel} (got matching items '${label}')` + ); + } + await PageObjects.svlCommonNavigation.search.hideSearch(); + }); - it('has the correct features disabled', async () => { - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.svlCommonNavigation.search.showSearch(); + it('has the correct features disabled', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.svlCommonNavigation.search.showSearch(); - const notExpectedLabels = allLabels.filter((l) => !l.expected).map((l) => l.label); + const notExpectedLabels = allLabels[role] + .filter((l) => !l.expected) + .map((l) => l.label); - for (const notExpectedLabel of notExpectedLabels) { - await PageObjects.svlCommonNavigation.search.searchFor(notExpectedLabel); - const [result] = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); - const label = result?.label; - expect(label).to.not.eql( - notExpectedLabel, - `First result should not be ${notExpectedLabel} (got matching items '${label}')` - ); - } - await PageObjects.svlCommonNavigation.search.hideSearch(); - }); - }); + for (const notExpectedLabel of notExpectedLabels) { + await PageObjects.svlCommonNavigation.search.searchFor(notExpectedLabel); + const [result] = await PageObjects.svlCommonNavigation.search.getDisplayedResults(); + const label = result?.label; + expect(label).to.not.eql( + notExpectedLabel, + `First result should not be ${notExpectedLabel} (got matching items '${label}')` + ); + } + await PageObjects.svlCommonNavigation.search.hideSearch(); + }); + }); + }); + } + ); }); } 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 24287170b83a6f..5c9dc65027b6bc 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/navigation.ts @@ -33,7 +33,6 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { await svlCommonNavigation.breadcrumbs.expectExists(); // check side nav links - await svlCommonNavigation.sidenav.expectSectionOpen('observability_project_nav'); await svlCommonNavigation.breadcrumbs.expectBreadcrumbExists({ deepLinkId: 'observabilityOnboarding', }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts index d32f3aff208b01..14c5de71853104 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/columns_selection.ts @@ -35,7 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await navigateToLogsExplorer(); }); @@ -87,7 +87,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('render content virtual column properly', async () => { it('should render log level and log message when present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('A sample log')).to.be(true); @@ -96,7 +96,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render log message when present and skip log level when missing', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 3); + const cellElement = await dataGrid.getCellElement(1, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(false); expect(cellValue.includes('A sample log')).to.be(true); @@ -105,7 +105,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render message from error object when top level message not present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(2, 3); + const cellElement = await dataGrid.getCellElement(2, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('error.message')).to.be(true); @@ -115,7 +115,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render message from event.original when top level message and error.message not present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(3, 3); + const cellElement = await dataGrid.getCellElement(3, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); expect(cellValue.includes('event.original')).to.be(true); @@ -125,7 +125,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the whole JSON when neither message, error.message and event.original are present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(4, 3); + const cellElement = await dataGrid.getCellElement(4, 4); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('info')).to.be(true); @@ -139,7 +139,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('on cell expansion with no message field should open JSON Viewer', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - await dataGrid.clickCellExpandButton(4, 3); + await dataGrid.clickCellExpandButton(4, 4); await testSubjects.existOrFail('dataTableExpandCellActionJsonPopover'); }); }); @@ -147,7 +147,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('on cell expansion with message field should open regular popover', async () => { await navigateToLogsExplorer(); await retry.tryForTime(TEST_TIMEOUT, async () => { - await dataGrid.clickCellExpandButton(3, 3); + await dataGrid.clickCellExpandButton(3, 4); await testSubjects.existOrFail('euiDataGridExpansionPopover'); }); }); @@ -156,7 +156,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('render resource virtual column properly', async () => { it('should render service name and host name when present', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 2); + const cellElement = await dataGrid.getCellElement(0, 3); const cellValue = await cellElement.getVisibleText(); expect(cellValue.includes('synth-service')).to.be(true); expect(cellValue.includes('synth-host')).to.be(true); @@ -170,7 +170,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should render a popover with cell actions when a chip on content column is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -186,7 +186,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where log.level value is info when filter in action is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -206,7 +206,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where log.level value is not info when filter out action is clicked', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 3); + const cellElement = await dataGrid.getCellElement(0, 4); const logLevelChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_log.level' ); @@ -224,7 +224,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should render the table filtered where service.name value is selected', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 2); + const cellElement = await dataGrid.getCellElement(0, 3); const serviceNameChip = await cellElement.findByTestSubject( 'dataTablePopoverChip_service.name' ); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/custom_control_columns.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/custom_control_columns.ts index 993d4ab3bc4d5e..6e836f00cc3f29 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/custom_control_columns.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/custom_control_columns.ts @@ -36,7 +36,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('When the logs explorer loads', () => { before(async () => { await synthtrace.index(generateLogsData({ to })); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await navigateToLogsExplorer(); }); @@ -48,30 +48,30 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('should render custom control columns properly', async () => { it('should render control column with proper header', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - // First control column has no title, so empty string, last control column has title + // First control column has no title, so empty string, leading control column has title expect(await dataGrid.getControlColumnHeaderFields()).to.eql(['', 'actions']); }); }); - it('should render the expand icon in the last control column', async () => { + it('should render the expand icon in the leading control column', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 4); + const cellElement = await dataGrid.getCellElement(0, 1); const expandButton = await cellElement.findByTestSubject('docTableExpandToggleColumn'); expect(expandButton).to.not.be.empty(); }); }); - it('should render the malformed icon in the last control column if malformed doc exists', async () => { + it('should render the malformed icon in the leading control column if malformed doc exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 4); + const cellElement = await dataGrid.getCellElement(1, 1); const malformedButton = await cellElement.findByTestSubject('docTableDegradedDocExist'); expect(malformedButton).to.not.be.empty(); }); }); - it('should render the disabled malformed icon in the last control column when malformed doc does not exists', async () => { + it('should render the disabled malformed icon in the leading control column when malformed doc does not exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(0, 4); + const cellElement = await dataGrid.getCellElement(0, 1); const malformedDisableButton = await cellElement.findByTestSubject( 'docTableDegradedDocDoesNotExist' ); @@ -79,17 +79,17 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); }); - it('should render the stacktrace icon in the last control column when stacktrace exists', async () => { + it('should render the stacktrace icon in the leading control column when stacktrace exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(4, 4); + const cellElement = await dataGrid.getCellElement(4, 1); const stacktraceButton = await cellElement.findByTestSubject('docTableStacktraceExist'); expect(stacktraceButton).to.not.be.empty(); }); }); - it('should render the stacktrace icon disabled in the last control column when stacktrace does not exists', async () => { + it('should render the stacktrace icon disabled in the leading control column when stacktrace does not exists', async () => { await retry.tryForTime(TEST_TIMEOUT, async () => { - const cellElement = await dataGrid.getCellElement(1, 4); + const cellElement = await dataGrid.getCellElement(1, 1); const stacktraceButton = await cellElement.findByTestSubject( 'docTableStacktraceDoesNotExist' ); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selection_state.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selection_state.ts index 5fe928c5d3d5ec..871c0151432a24 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selection_state.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selection_state.ts @@ -34,7 +34,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('dataSourceSelection initialization and update', () => { before(async () => { - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selector.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selector.ts index df749f2d4f9dd0..3bb012c81311fd 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selector.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/data_source_selector.ts @@ -40,7 +40,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // TimeoutError: Waiting for element to be located By(css selector, [data-test-subj="dataSourceSelectorPopoverButton"]) this.tags(['failsOnMKI']); before(async () => { - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await PageObjects.observabilityLogsExplorer.removeInstalledPackages(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/field_list.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/field_list.ts index 828c4d4c61dd13..5c5cd85f624a4d 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/field_list.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/field_list.ts @@ -35,7 +35,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('When virtual columns loads', () => { before(async () => { await synthtrace.index(generateLogsData({ from, to })); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await navigateToLogsExplorer(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts index 9cf4629e89a901..0dc479b391800e 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/filter_controls.ts @@ -14,7 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('Filter controls customization', () => { before('initialize tests', async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); }); after('clean up archives', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts index 8758ca590a5158..2e181f1a7d9b49 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/flyout.ts @@ -45,7 +45,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { NAMESPACE ); await PageObjects.observabilityLogsExplorer.ingestLogEntries(DATA_STREAM_NAME, docs); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); }); beforeEach(async () => { @@ -68,7 +68,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should display the logs overview tab', async () => { - await dataGrid.clickRowToggle({ columnIndex: 4 }); + await dataGrid.clickRowToggle({ columnIndex: 1 }); await testSubjects.existOrFail('docViewerTab-doc_view_logs_overview'); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts index 23d2e7729e2f47..a61c1afbfb6180 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/header_menu.ts @@ -31,7 +31,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'x-pack/test/functional/es_archives/observability_logs_explorer/data_streams' ); await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await PageObjects.observabilityLogsExplorer.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts index 88852f1f7b5b70..076e4701c91fc3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/observability_logs_explorer/navigation.ts @@ -34,7 +34,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { before(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await synthtrace.index(generateLogsData({ to })); - await PageObjects.svlCommonPage.login(); + await PageObjects.svlCommonPage.loginWithRole('viewer'); await navigateToLogsExplorer(); }); diff --git a/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts b/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts index 0e486b4947d808..aa2ba3ff72fdad 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/rules/rules_list.ts @@ -84,7 +84,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { before(async () => { roleAuthc = await svlUserManager.createApiKeyForRole('admin'); internalReqHeader = svlCommonApi.getInternalRequestHeader(); - await svlCommonPage.login(); + await svlCommonPage.loginWithRole('admin'); await svlObltNavigation.navigateToLandingPage(); await svlCommonNavigation.sidenav.clickLink({ text: 'Alerts' }); await testSubjects.click('manageRulesPageButton'); diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/cases/list_view.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/cases/list_view.ts index e20029f5ebce19..b4666e7807342e 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/cases/list_view.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/cases/list_view.ts @@ -6,6 +6,7 @@ */ import { OBSERVABILITY_OWNER } from '@kbn/cases-plugin/common'; +import type { RoleCredentials } from '../../../../../../shared/services'; import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { navigateToCasesApp } from '../../../../../../shared/lib/cases'; @@ -16,18 +17,22 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi const svlCommonScreenshots = getService('svlCommonScreenshots'); const screenshotDirectories = ['response_ops_docs', 'observability_cases']; const testSubjects = getService('testSubjects'); + const svlUserManager = getService('svlUserManager'); const owner = OBSERVABILITY_OWNER; let caseIdMonitoring: string; describe('list view', function () { + let roleAuthc: RoleCredentials; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); await svlCases.api.createCase( svlCases.api.getPostCaseRequest(owner, { title: 'Metrics inventory', tags: ['IBM resilient'], description: 'Test.', owner, - }) + }), + roleAuthc ); await svlCases.api.createCase( @@ -36,7 +41,8 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi tags: ['jira'], description: 'Test.', owner, - }) + }), + roleAuthc ); const caseMonitoring = await svlCases.api.createCase( @@ -45,7 +51,8 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi tags: ['swimlane'], description: 'Test.', owner, - }) + }), + roleAuthc ); caseIdMonitoring = caseMonitoring.id; }); @@ -56,7 +63,7 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi }); beforeEach(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('admin'); }); it('cases list screenshot', async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/connectors/server_log_connector.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/connectors/server_log_connector.ts index 7eed7d5cbbd267..a38807f4537cae 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/connectors/server_log_connector.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/connectors/server_log_connector.ts @@ -15,7 +15,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { describe('server log connector', function () { beforeEach(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('admin'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts index db43127a0adcff..73f431eeb6ccb3 100644 --- a/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts +++ b/x-pack/test_serverless/functional/test_suites/observability/screenshot_creation/response_ops_docs/maintenance_windows/create_window.ts @@ -16,7 +16,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { describe('create window', function () { beforeEach(async () => { - await pageObjects.svlCommonPage.login(); + await pageObjects.svlCommonPage.loginWithRole('admin'); }); after(async () => { diff --git a/x-pack/test_serverless/functional/test_suites/search/navigation.ts b/x-pack/test_serverless/functional/test_suites/search/navigation.ts index 85042af186ebc4..554a2e2b63c154 100644 --- a/x-pack/test_serverless/functional/test_suites/search/navigation.ts +++ b/x-pack/test_serverless/functional/test_suites/search/navigation.ts @@ -37,7 +37,6 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { // check side nav links await testSubjects.existOrFail(`svlSearchOverviewPage`); - await svlCommonNavigation.sidenav.expectSectionOpen('search_project_nav'); await svlCommonNavigation.sidenav.expectLinkActive({ deepLinkId: 'serverlessElasticsearch', }); diff --git a/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts b/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts index 65903c2343df6d..6a755c26e91d48 100644 --- a/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts +++ b/x-pack/test_serverless/functional/test_suites/security/config.cloud_security_posture.ts @@ -5,6 +5,7 @@ * 2.0. */ +import { CLOUD_SECURITY_PLUGIN_VERSION } from '@kbn/cloud-security-posture-plugin/common/constants'; import { createTestConfig } from '../../config.base'; export default createTestConfig({ @@ -14,7 +15,7 @@ export default createTestConfig({ }, kbnServerArgs: [ `--xpack.fleet.packages.0.name=cloud_security_posture`, - `--xpack.fleet.packages.0.version=1.5.2`, + `--xpack.fleet.packages.0.version=${CLOUD_SECURITY_PLUGIN_VERSION}`, ], // load tests in the index file testFiles: [require.resolve('./ftr/cloud_security_posture')], diff --git a/x-pack/test_serverless/functional/test_suites/security/screenshot_creation/response_ops_docs/cases/list_view.ts b/x-pack/test_serverless/functional/test_suites/security/screenshot_creation/response_ops_docs/cases/list_view.ts index b7de775a9a7ce9..7b9200b3b747bf 100644 --- a/x-pack/test_serverless/functional/test_suites/security/screenshot_creation/response_ops_docs/cases/list_view.ts +++ b/x-pack/test_serverless/functional/test_suites/security/screenshot_creation/response_ops_docs/cases/list_view.ts @@ -7,6 +7,7 @@ import { SECURITY_SOLUTION_OWNER } from '@kbn/cases-plugin/common'; import { CaseSeverity } from '@kbn/cases-plugin/common/types/domain'; +import type { RoleCredentials } from '../../../../../../shared/services'; import { FtrProviderContext } from '../../../../../ftr_provider_context'; import { navigateToCasesApp } from '../../../../../../shared/lib/cases'; @@ -17,11 +18,14 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi const svlCommonScreenshots = getService('svlCommonScreenshots'); const screenshotDirectories = ['response_ops_docs', 'security_cases']; const testSubjects = getService('testSubjects'); + const svlUserManager = getService('svlUserManager'); const owner = SECURITY_SOLUTION_OWNER; let caseIdSuspiciousEmail: string; describe('list view', function () { + let roleAuthc: RoleCredentials; before(async () => { + roleAuthc = await svlUserManager.createApiKeyForRole('admin'); await svlCases.api.createCase( svlCases.api.getPostCaseRequest(owner, { title: 'Unusual processes identified', @@ -29,7 +33,8 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi description: 'Test.', owner, severity: CaseSeverity.HIGH, - }) + }), + roleAuthc ); const caseSuspiciousEmail = await svlCases.api.createCase( @@ -38,7 +43,8 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi tags: ['email', 'phishing'], description: 'Several employees have received suspicious emails from an unknown address.', owner, - }) + }), + roleAuthc ); caseIdSuspiciousEmail = caseSuspiciousEmail.id; @@ -49,7 +55,8 @@ export default function ({ getPageObject, getPageObjects, getService }: FtrProvi description: 'Test.', owner, severity: CaseSeverity.MEDIUM, - }) + }), + roleAuthc ); }); diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index 5dff8ab3431fd8..e80bebb0e90ae1 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -101,6 +101,7 @@ "@kbn/dataset-quality-plugin", "@kbn/alerting-comparators", "@kbn/search-types", - "@kbn/reporting-server" + "@kbn/reporting-server", + "@kbn/features-plugin" ] } diff --git a/yarn.lock b/yarn.lock index 66c3d86bcbbe7d..b2c096ed6f9add 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1650,10 +1650,10 @@ dependencies: object-hash "^1.3.0" -"@elastic/charts@65.1.0": - version "65.1.0" - resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-65.1.0.tgz#ff0c7f71ce7da76472813c9bf5cd3ec16df887ae" - integrity sha512-rIvsoCZH6YUb+w3dqelp8geujEMwdiJLuxi/Y+9UVJm+7QrhkK4uob7QEFgPv79p2NeBngZIyetZCYGEE3FMzw== +"@elastic/charts@65.2.0": + version "65.2.0" + resolved "https://registry.yarnpkg.com/@elastic/charts/-/charts-65.2.0.tgz#203496b6471e4845807cb70c48b0990676882ef4" + integrity sha512-yeqascGqvnDABvtYOHgd7sr6cEq5kivFWKaS3UWeb/GpOxk+O4Ef1PlbBxpchgDyInP957SWlhKDmhUFF1Ttzg== dependencies: "@popperjs/core" "^2.11.8" bezier-easing "^2.1.0" @@ -1707,12 +1707,12 @@ "@elastic/transport" "^8.3.1" tslib "^2.4.0" -"@elastic/elasticsearch@^8.13.0": - version "8.13.0" - resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-8.13.0.tgz#625c6fba3caf944370c6859482fbd5cf3543aea8" - integrity sha512-OAYgzqArPqgDaIJ1yT0RX31YCgr1lleo53zL+36i23PFjHu08CA6Uq+BmBzEV05yEidl+ILPdeSfF3G8hPG/JQ== +"@elastic/elasticsearch@^8.13.1": + version "8.13.1" + resolved "https://registry.yarnpkg.com/@elastic/elasticsearch/-/elasticsearch-8.13.1.tgz#0fbe8318cf7f21c599165bb901277428639d57ec" + integrity sha512-2G4Vu6OHw4+XTrp7AGIcOEezpPEoVrWg2JTK1v/exEKSLYquZkUdd+m4yOL3/UZ6bTj7hmXwrmYzW76BnLCkJQ== dependencies: - "@elastic/transport" "^8.4.0" + "@elastic/transport" "~8.4.1" tslib "^2.4.0" "@elastic/ems-client@8.5.1": @@ -1887,7 +1887,7 @@ undici "^5.21.2" yaml "^2.2.2" -"@elastic/transport@^8.3.1", "@elastic/transport@^8.4.0": +"@elastic/transport@^8.3.1", "@elastic/transport@~8.4.1": version "8.4.1" resolved "https://registry.yarnpkg.com/@elastic/transport/-/transport-8.4.1.tgz#f98c5a5e2156bcb3f01170b4aca7e7de4d8b61b8" integrity sha512-/SXVuVnuU5b4dq8OFY4izG+dmGla185PcoqgK6+AJMpmOeY1QYVNbWtCwvSvoAANN5D/wV+EBU8+x7Vf9EphbA== @@ -4800,6 +4800,10 @@ version "0.0.0" uid "" +"@kbn/esql-datagrid@link:src/plugins/esql_datagrid": + version "0.0.0" + uid "" + "@kbn/esql-utils@link:packages/kbn-esql-utils": version "0.0.0" uid "" @@ -5176,6 +5180,10 @@ version "0.0.0" uid "" +"@kbn/investigate-plugin@link:x-pack/plugins/observability_solution/investigate": + version "0.0.0" + uid "" + "@kbn/io-ts-utils@link:packages/kbn-io-ts-utils": version "0.0.0" uid "" @@ -6720,6 +6728,10 @@ version "0.0.0" uid "" +"@kbn/unsaved-changes-prompt@link:packages/kbn-unsaved-changes-prompt": + version "0.0.0" + uid "" + "@kbn/upgrade-assistant-plugin@link:x-pack/plugins/upgrade_assistant": version "0.0.0" uid "" @@ -15043,10 +15055,10 @@ d3-collection@^1.0.7: resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== -"d3-color@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-2.0.0.tgz#8d625cab42ed9b8f601a1760a389f7ea9189d62e" - integrity sha512-SPXi0TSKPD4g9tw0NMZFnR95XVgUZiBH+uUTqQuDu1OsE2zomHU7ho0FISciaPvosimixwHFl3WHLGabv6dDgQ== +"d3-color@1 - 2", "d3-color@npm:@elastic/d3-color@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@elastic/d3-color/-/d3-color-2.0.1.tgz#afb7f58ace7e5ebcdbeddeb06d5e0b16aad5e7c0" + integrity sha512-XIZ+7nbjdjwpdBQLFEE+THVyDAlBGxjvNt8CDGos1f/apkdRHzOiZNgp/LtLdpfG+z3zYApDP9enWCaWCVvHSQ== "d3-color@1 - 3", d3-color@^3.1.0: version "3.1.0" @@ -16101,7 +16113,7 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -ecdsa-sig-formatter@1.0.11: +ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== @@ -16175,10 +16187,10 @@ elastic-apm-node@3.46.0: traverse "^0.6.6" unicode-byte-truncate "^1.0.0" -elastic-apm-node@^4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.5.4.tgz#add7c5a53f8a4ec29989e3365c9f2053ec64a20d" - integrity sha512-PqX8a5PdWo+mtH1Vn+xjmhJpa2RE9zbKDKFkKoENKG118KVgukxhFlVIpb3qrht9aeRkPxHqQsPNtNV3ljPjew== +elastic-apm-node@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/elastic-apm-node/-/elastic-apm-node-4.6.0.tgz#9de3b758158c85dee5932857eb93e21cf204c45a" + integrity sha512-mieujz8IA30wkavF8JG/mSBep2DG2zGMblQAh1uEkeXIjb8njrW3Ef+cqKPEdaFPN/Iqm2LZzZuy+Fu20MsfkA== dependencies: "@elastic/ecs-pino-format" "^1.5.0" "@opentelemetry/api" "^1.4.1" @@ -16198,7 +16210,7 @@ elastic-apm-node@^4.5.4: fast-safe-stringify "^2.0.7" fast-stream-to-buffer "^1.0.0" http-headers "^3.0.2" - import-in-the-middle "1.7.4" + import-in-the-middle "1.8.0" json-bigint "^1.0.0" lru-cache "^10.0.1" measured-reporting "^1.51.1" @@ -17386,7 +17398,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.2: +extend@^3.0.0, extend@^3.0.2, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -18211,6 +18223,25 @@ gauge@^3.0.0: strip-ansi "^6.0.1" wide-align "^1.1.2" +gaxios@^6.0.0, gaxios@^6.1.1: + version "6.6.0" + resolved "https://registry.yarnpkg.com/gaxios/-/gaxios-6.6.0.tgz#af8242fff0bbb82a682840d5feaa91b6a1c58be4" + integrity sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ== + dependencies: + extend "^3.0.2" + https-proxy-agent "^7.0.1" + is-stream "^2.0.0" + node-fetch "^2.6.9" + uuid "^9.0.1" + +gcp-metadata@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/gcp-metadata/-/gcp-metadata-6.1.0.tgz#9b0dd2b2445258e7597f2024332d20611cbd6b8c" + integrity sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg== + dependencies: + gaxios "^6.0.0" + json-bigint "^1.0.0" + geckodriver@^4.4.1: version "4.4.1" resolved "https://registry.yarnpkg.com/geckodriver/-/geckodriver-4.4.1.tgz#b39b26a17f9166038702743f5722b6d83e0483f6" @@ -18636,6 +18667,18 @@ gonzales-pe@^4.3.0: dependencies: minimist "^1.2.5" +google-auth-library@^9.10.0: + version "9.10.0" + resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-9.10.0.tgz#c9fb940923f7ff2569d61982ee1748578c0bbfd4" + integrity sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ== + dependencies: + base64-js "^1.3.0" + ecdsa-sig-formatter "^1.0.11" + gaxios "^6.1.1" + gcp-metadata "^6.1.0" + gtoken "^7.0.0" + jws "^4.0.0" + google-protobuf@^3.6.1: version "3.19.4" resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.19.4.tgz#8d32c3e34be9250956f28c0fb90955d13f311888" @@ -18723,6 +18766,14 @@ graphql@^16.6.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.8.1.tgz#1930a965bef1170603702acdb68aedd3f3cf6f07" integrity sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw== +gtoken@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-7.1.0.tgz#d61b4ebd10132222817f7222b1e6064bd463fc26" + integrity sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw== + dependencies: + gaxios "^6.0.0" + jws "^4.0.0" + gulp-brotli@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/gulp-brotli/-/gulp-brotli-3.0.0.tgz#7f5a1d8a6d43cab28056f9e56f29ae071dcfe4b4" @@ -19527,10 +19578,10 @@ import-in-the-middle@1.7.1: cjs-module-lexer "^1.2.2" module-details-from-path "^1.0.3" -import-in-the-middle@1.7.4: - version "1.7.4" - resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.7.4.tgz#508da6e91cfa84f210dcdb6c0a91ab0c9e8b3ebc" - integrity sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg== +import-in-the-middle@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.8.0.tgz#c94d88d53701de9a248f9710b41f533e67f598a4" + integrity sha512-/xQjze8szLNnJ5rvHSzn+dcVXqCAU6Plbk4P24U/jwPmg1wy7IIp9OjKIO5tYue8GSPhDpPDiApQjvBUmWwhsQ== dependencies: acorn "^8.8.2" acorn-import-attributes "^1.9.5" @@ -21448,6 +21499,15 @@ jwa@^1.4.1: ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" +jwa@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.0.tgz#a7e9c3f29dae94027ebcaf49975c9345593410fc" + integrity sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + jws@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" @@ -21456,6 +21516,14 @@ jws@^3.2.2: jwa "^1.4.1" safe-buffer "^5.0.1" +jws@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.0.tgz#2d4e8cf6a318ffaa12615e9dec7e86e6c97310f4" + integrity sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg== + dependencies: + jwa "^2.0.0" + safe-buffer "^5.0.1" + kdbush@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/kdbush/-/kdbush-4.0.2.tgz#2f7b7246328b4657dd122b6c7f025fbc2c868e39" @@ -21731,9 +21799,9 @@ lilconfig@^2.0.3, lilconfig@^2.0.4: integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== linkify-it@^5.0.0: version "5.0.0" @@ -23567,7 +23635,7 @@ node-fetch-h2@^2.3.0: dependencies: http2-client "^1.2.5" -node-fetch@^2.6.1, node-fetch@^2.6.7: +node-fetch@^2.6.1, node-fetch@^2.6.7, node-fetch@^2.6.9: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -30901,7 +30969,7 @@ uuid-browser@^3.1.0: resolved "https://registry.yarnpkg.com/uuid-browser/-/uuid-browser-3.1.0.tgz#0f05a40aef74f9e5951e20efbf44b11871e56410" integrity sha1-DwWkCu90+eWVHiDvv0SxGHHlZBA= -uuid@9.0.0, uuid@^9, uuid@^9.0.0: +uuid@9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.0.tgz#592f550650024a38ceb0c562f2f6aa435761efb5" integrity sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg== @@ -30916,6 +30984,11 @@ uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== +uuid@^9, uuid@^9.0.0, uuid@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" + integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== + v8-compile-cache-lib@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"