diff --git a/.buildkite/pipeline-resource-definitions/fix-location-collection.ts b/.buildkite/pipeline-resource-definitions/fix-location-collection.ts new file mode 100755 index 00000000000000..8ca4bf50f2cd91 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/fix-location-collection.ts @@ -0,0 +1,68 @@ +#!/usr/bin/env ts-node-script +/* + * Copyright 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 fs from 'fs'; +import jsYaml from 'js-yaml'; +import path from 'path'; +import { execSync } from 'child_process'; + +const EXCLUDE_LIST = ['locations.yml']; +const REPO_FILES_BASE = 'https://github.com/elastic/kibana/blob/main'; + +type BackstageLocationResource = object & { + spec: { targets: string[] }; +}; + +async function main() { + const repoRoot = execSync('git rev-parse --show-toplevel').toString().trim(); + const resourceDefinitionsFolder = path.resolve( + repoRoot, + '.buildkite', + 'pipeline-resource-definitions' + ); + const resourceDefinitionsBaseUrl = `${REPO_FILES_BASE}/.buildkite/pipeline-resource-definitions`; + const locationFile = path.resolve(resourceDefinitionsFolder, 'locations.yml'); + const locationFileLines = fs.readFileSync(locationFile, 'utf8').split('\n'); + + const pipelines = readDirRecursively(resourceDefinitionsFolder) + .filter((file) => file.endsWith('.yml')) + .map((file) => file.replace(`${resourceDefinitionsFolder}/`, '')) + .filter((f) => !EXCLUDE_LIST.includes(f)); + + const preamble = locationFileLines.slice(0, 1); + + const locationObj = jsYaml.load( + locationFileLines.slice(1).join('\n') + ) as BackstageLocationResource; + locationObj.spec.targets = pipelines.map( + (fileName) => `${resourceDefinitionsBaseUrl}/${fileName}` + ); + + const locationYaml = jsYaml.dump(locationObj, { lineWidth: 400 }); + + fs.writeFileSync(locationFile, `${preamble.join('\n')}\n${locationYaml}`); + + console.log('Updated locations.yml'); +} + +function readDirRecursively(dir: string): string[] { + const files = fs.readdirSync(dir); + return files.reduce((acc, file) => { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isDirectory()) { + return [...acc, ...readDirRecursively(filePath)]; + } else { + return [...acc, filePath]; + } + }, [] as string[]); +} + +main().catch((error) => { + console.error(error); + process.exit(1); +}); diff --git a/.buildkite/pipeline-resource-definitions/kibana-coverage-daily.yml b/.buildkite/pipeline-resource-definitions/kibana-coverage-daily.yml new file mode 100644 index 00000000000000..c73a276a6d786a --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/kibana-coverage-daily.yml @@ -0,0 +1,50 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-code-coverage-main + description: 'Collects code coverage for unit and e2e tests, publishes results on Kibana stats cluster' + links: + - url: 'https://buildkite.com/elastic/kibana-code-coverage-main' + title: Pipeline link +spec: + type: buildkite-pipeline + owner: 'group:appex-qa' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / code-coverage / main + description: 'Collects code coverage for unit and e2e tests, publishes results on Kibana stats cluster' + spec: + env: + SLACK_NOTIFICATIONS_CHANNEL: '#appex-qa-bots' + GITHUB_COMMIT_STATUS_CONTEXT: kibana-code-coverage-main + CODE_COVERAGE: '1' + FTR_CONFIGS_RETRY_COUNT: '0' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/code_coverage/daily.yml + skip_intermediate_builds: false + provider_settings: + prefix_pull_request_fork_branch_names: false + skip_pull_request_builds_for_existing_commits: true + trigger_mode: none + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ + schedules: + Daily 6 am UTC: + cronline: 0 5 * * * + message: Daily 6 am UTC + branch: main diff --git a/.buildkite/pipeline-resource-definitions/kibana-esql-grammar-sync.yml b/.buildkite/pipeline-resource-definitions/kibana-esql-grammar-sync.yml new file mode 100644 index 00000000000000..952babf7d580d4 --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/kibana-esql-grammar-sync.yml @@ -0,0 +1,53 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-esql-grammar-sync + description: Opens a PR if anything changes in the ES|QL grammar in Elasticsearch + links: + - url: 'https://buildkite.com/elastic/kibana-esql-grammar-sync' + title: Pipeline link +spec: + type: buildkite-pipeline + owner: 'group:kibana-esql' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / ES|QL grammar sync + description: Opens a PR if anything changes in the ES|QL grammar in Elasticsearch + spec: + env: + SLACK_NOTIFICATIONS_CHANNEL: '#kibana-esql-project-team' + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'true' + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/esql_grammar_sync.yml + skip_intermediate_builds: false + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + trigger_mode: none + build_tags: false + prefix_pull_request_fork_branch_names: false + skip_pull_request_builds_for_existing_commits: true + teams: + kibana-esql: + access_level: MANAGE_BUILD_AND_READ + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ + schedules: + Weekly build: + cronline: 0 0 * * 1 America/New_York + message: Weekly build + branch: main diff --git a/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml new file mode 100644 index 00000000000000..a8e6b46f7d3cae --- /dev/null +++ b/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml @@ -0,0 +1,45 @@ +# yaml-language-server: $schema=https://gist.githubusercontent.com/elasticmachine/988b80dae436cafea07d9a4a460a011d/raw/rre.schema.json +apiVersion: backstage.io/v1alpha1 +kind: Resource +metadata: + name: bk-kibana-purge-cloud-deployments + description: Purge stale cloud deployments + links: + - url: 'https://buildkite.com/elastic/kibana-purge-cloud-deployments' + title: Pipeline link +spec: + type: buildkite-pipeline + owner: 'group:kibana-operations' + system: buildkite + implementation: + apiVersion: buildkite.elastic.dev/v1 + kind: Pipeline + metadata: + name: kibana / purge-cloud-deployments + description: Purge stale cloud deployments + spec: + env: + ELASTIC_SLACK_NOTIFICATIONS_ENABLED: 'false' + allow_rebuilds: false + branch_configuration: main + default_branch: main + repository: elastic/kibana + pipeline_file: .buildkite/pipelines/purge_cloud_deployments.yml + skip_intermediate_builds: false + provider_settings: + build_branches: false + build_pull_requests: false + publish_commit_status: false + trigger_mode: none + build_tags: false + prefix_pull_request_fork_branch_names: false + skip_pull_request_builds_for_existing_commits: true + teams: + kibana-operations: + access_level: MANAGE_BUILD_AND_READ + appex-qa: + access_level: MANAGE_BUILD_AND_READ + kibana-tech-leads: + access_level: MANAGE_BUILD_AND_READ + everyone: + access_level: BUILD_AND_READ diff --git a/.buildkite/pipeline-resource-definitions/locations.yml b/.buildkite/pipeline-resource-definitions/locations.yml index 945e1ec820ffac..f0632ef2c0f26d 100644 --- a/.buildkite/pipeline-resource-definitions/locations.yml +++ b/.buildkite/pipeline-resource-definitions/locations.yml @@ -6,13 +6,16 @@ metadata: spec: type: url targets: + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-coverage-daily.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-esql-grammar-sync.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-migration-staging.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-purge-cloud-deployments.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-ess/security-solution-ess.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-explore.yml + - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-investigations.yml - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-rule-management.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-detection-engine.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-gen-ai.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-entity-analytics.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-quality-gate/kibana-serverless-security-solution-quality-gate-defend-workflows.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/security-solution-ess/security-solution-ess.yml - - https://github.com/elastic/kibana/blob/main/.buildkite/pipeline-resource-definitions/kibana-serverless-release.yml diff --git a/.buildkite/pipelines/code_coverage/daily.yml b/.buildkite/pipelines/code_coverage/daily.yml index 0ffcd8f3770713..1160d7de5c9df3 100644 --- a/.buildkite/pipelines/code_coverage/daily.yml +++ b/.buildkite/pipelines/code_coverage/daily.yml @@ -3,14 +3,20 @@ steps: label: Pre-Build timeout_in_minutes: 10 agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-2 - wait - command: .buildkite/scripts/steps/test/pick_test_group_run_order.sh label: 'Pick Test Group Run Order' agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-2 timeout_in_minutes: 10 env: FTR_CONFIGS_DEPS: '' @@ -21,7 +27,11 @@ steps: - command: .buildkite/scripts/steps/code_coverage/ingest.sh label: 'Merge and Ingest' agents: - queue: n2-4-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-4 + preemptible: true depends_on: - jest - jest-integration diff --git a/.buildkite/pipelines/esql_grammar_sync.yml b/.buildkite/pipelines/esql_grammar_sync.yml index f516d61ad6b4ac..ca924e18ad93b3 100644 --- a/.buildkite/pipelines/esql_grammar_sync.yml +++ b/.buildkite/pipelines/esql_grammar_sync.yml @@ -3,4 +3,8 @@ steps: label: ES|QL Grammar Sync timeout_in_minutes: 10 agents: - queue: n2-2-spot + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-2 + preemptible: true diff --git a/.buildkite/pipelines/pull_request/apm_cypress.yml b/.buildkite/pipelines/pull_request/apm_cypress.yml index 3c95b2814f4e02..38027371559db2 100644 --- a/.buildkite/pipelines/pull_request/apm_cypress.yml +++ b/.buildkite/pipelines/pull_request/apm_cypress.yml @@ -7,7 +7,7 @@ steps: - build - quick_checks timeout_in_minutes: 120 - parallelism: 4 + parallelism: 1 # TODO: Set parallelism when apm_cypress handles it retry: automatic: - exit_status: '-1' diff --git a/.buildkite/pipelines/purge_cloud_deployment.yml b/.buildkite/pipelines/purge_cloud_deployment.yml deleted file mode 100644 index 34f074658e5473..00000000000000 --- a/.buildkite/pipelines/purge_cloud_deployment.yml +++ /dev/null @@ -1,13 +0,0 @@ -steps: - - block: "Purge deployment" - prompt: "Fill out the details to shutdown a PR deployment" - fields: - - text: "Pull Request Number" - key: "kibana-pull-request" - if: "build.env('KIBANA_PULL_REQUEST') == null || build.env('KIBANA_PULL_REQUEST') == ''" - - - command: .buildkite/scripts/steps/cloud/purge_deployment.sh - label: Purge a cloud deployment - timeout_in_minutes: 10 - agents: - queue: kibana-default diff --git a/.buildkite/pipelines/purge_cloud_deployments.yml b/.buildkite/pipelines/purge_cloud_deployments.yml index 203e74ca63c801..44060b056f8b63 100644 --- a/.buildkite/pipelines/purge_cloud_deployments.yml +++ b/.buildkite/pipelines/purge_cloud_deployments.yml @@ -3,4 +3,7 @@ steps: label: Purge old cloud deployments timeout_in_minutes: 10 agents: - queue: kibana-default + image: family/kibana-ubuntu-2004 + imageProject: elastic-images-qa + provider: gcp + machineType: n2-standard-2 diff --git a/.buildkite/scripts/steps/cloud/purge_deployment.sh b/.buildkite/scripts/steps/cloud/purge_deployment.sh deleted file mode 100755 index b2f7d8cbfc94ca..00000000000000 --- a/.buildkite/scripts/steps/cloud/purge_deployment.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -ts-node .buildkite/scripts/steps/cloud/purge_deployment.ts diff --git a/.buildkite/scripts/steps/cloud/purge_deployment.ts b/.buildkite/scripts/steps/cloud/purge_deployment.ts deleted file mode 100644 index 682f3c1353e644..00000000000000 --- a/.buildkite/scripts/steps/cloud/purge_deployment.ts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { execSync } from 'child_process'; - -const deploymentsListJson = execSync('ecctl deployment list --output json').toString(); -const { deployments } = JSON.parse(deploymentsListJson); -const secretBasePath = process.env.VAULT_ADDR?.match(/secrets\.elastic\.co/g) - ? 'secret/kibana-issues/dev' - : 'secret/ci/elastic-kibana'; - -const prNumber = parseInt( - process.env.KIBANA_PULL_REQUEST || - execSync('buildkite-agent meta-data get kibana-pull-request').toString(), - 10 -); -const deploymentName = `kibana-pr-${prNumber}`; -const deployment = deployments.find((d: any) => d.name === deploymentName); - -if (!prNumber || !deployment) { - console.error(`${deploymentName} not found`); - process.exit(1); -} - -console.log(`Scheduling deployment for deletion: ${deployment.name} / ${deployment.id}`); -try { - execSync(`ecctl deployment shutdown --force '${deployment.id}'`, { stdio: 'inherit' }); - execSync(`vault delete ${secretBasePath}/cloud-deploy/${deployment.name}`, { - stdio: 'inherit', - }); -} catch (ex) { - console.error(ex.toString()); -} diff --git a/.buildkite/scripts/steps/esql_grammar_sync.sh b/.buildkite/scripts/steps/esql_grammar_sync.sh index 9d97a9ac6c87ad..2aa1144dce8cb9 100755 --- a/.buildkite/scripts/steps/esql_grammar_sync.sh +++ b/.buildkite/scripts/steps/esql_grammar_sync.sh @@ -7,7 +7,7 @@ synchronize_lexer_grammar () { destination_file="./packages/kbn-esql-ast/src/antlr/esql_lexer.g4" # Copy the file - cp "$source_file" "$destination_file" + cp "$source_file" "$destination_file" # Insert the license header temp_file=$(mktemp) @@ -15,11 +15,11 @@ synchronize_lexer_grammar () { mv "$temp_file" "$destination_file" # Replace the line containing "lexer grammar" with "lexer grammar esql_lexer;" - sed -i -e 's/lexer grammar.*$/lexer grammar esql_lexer;/' "$destination_file" + sed -i -e 's/lexer grammar.*$/lexer grammar esql_lexer;/' "$destination_file" # Insert "options { caseInsensitive = true; }" one line below sed -i -e '/lexer grammar esql_lexer;/a\ - options { caseInsensitive = true; }' "$destination_file" + options { caseInsensitive = true; }' "$destination_file" echo "File copied and modified successfully." } @@ -30,7 +30,7 @@ synchronize_parser_grammar () { destination_file="./packages/kbn-esql-ast/src/antlr/esql_parser.g4" # Copy the file - cp "$source_file" "$destination_file" + cp "$source_file" "$destination_file" # Insert the license header temp_file=$(mktemp) @@ -38,10 +38,10 @@ synchronize_parser_grammar () { mv "$temp_file" "$destination_file" # Replace the line containing "parser grammar" with "parser grammar esql_parser;" - sed -i -e 's/parser grammar.*$/parser grammar esql_parser;/' "$destination_file" + sed -i -e 's/parser grammar.*$/parser grammar esql_parser;/' "$destination_file" # Replace options {tokenVocab=EsqlBaseLexer;} with options {tokenVocab=esql_lexer;} - sed -i -e 's/options {tokenVocab=EsqlBaseLexer;}/options {tokenVocab=esql_lexer;}/' "$destination_file" + sed -i -e 's/options {tokenVocab=EsqlBaseLexer;}/options {tokenVocab=esql_lexer;}/' "$destination_file" echo "File copied and modified successfully." } @@ -51,17 +51,17 @@ report_main_step () { } main () { - cd "$PARENT_DIR" + cd "$PARENT_DIR" report_main_step "Cloning repositories" rm -rf elasticsearch - git clone https://github.com/elastic/elasticsearch --depth 1 + git clone https://github.com/elastic/elasticsearch --depth 1 rm -rf open-source - git clone https://github.com/elastic/open-source --depth 1 + git clone https://github.com/elastic/open-source --depth 1 - cd "$KIBANA_DIR" + cd "$KIBANA_DIR" license_header=$(cat "$PARENT_DIR/open-source/legal/elastic-license-2.0-header.txt") @@ -105,8 +105,8 @@ main () { .buildkite/scripts/bootstrap.sh # Build ANTLR stuff - cd ./packages/kbn-esql-ast/src - yarn build:antlr4:esql + cd ./packages/kbn-esql-ast/src + yarn build:antlr4:esql # Make a commit BRANCH_NAME="esql_grammar_sync_$(date +%s)" @@ -118,11 +118,10 @@ main () { report_main_step "Changes committed. Creating pull request." - git remote add kibanamachine https://github.com/kibanamachine/kibana.git - git push kibanamachine "$BRANCH_NAME" + git push origin "$BRANCH_NAME" # Create a PR - gh pr create --draft --title "$PR_TITLE" --body "$PR_BODY" --base main --head "kibanamachine:${BRANCH_NAME}" --label 'release_note:skip' --label 'Team:ESQL' + gh pr create --title "$PR_TITLE" --body "$PR_BODY" --base main --head "${BRANCH_NAME}" --label 'release_note:skip' --label 'Team:ESQL' } main diff --git a/.buildkite/tsconfig.json b/.buildkite/tsconfig.json index a3aad13e555640..5b2a91f6e91a3e 100644 --- a/.buildkite/tsconfig.json +++ b/.buildkite/tsconfig.json @@ -13,7 +13,8 @@ "pipelines/**/*", "scripts/**/*", "pipelines/flaky_tests/groups.json", - "pull_requests.json" + "pull_requests.json", + "pipeline-resource-definitions/**/*.ts" ], "exclude": [ "target/**/*", diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ecd3990f1263d4..9e6bca0b544336 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -692,6 +692,7 @@ x-pack/plugins/search_connectors @elastic/enterprise-search-frontend packages/kbn-search-errors @elastic/kibana-data-discovery examples/search_examples @elastic/kibana-data-discovery packages/kbn-search-index-documents @elastic/enterprise-search-frontend +x-pack/plugins/search_notebooks @elastic/enterprise-search-frontend x-pack/plugins/search_playground @elastic/enterprise-search-frontend packages/kbn-search-response-warnings @elastic/kibana-data-discovery x-pack/plugins/searchprofiler @elastic/kibana-management @@ -794,6 +795,7 @@ packages/shared-ux/router/mocks @elastic/appex-sharedux packages/shared-ux/router/types @elastic/appex-sharedux packages/shared-ux/storybook/config @elastic/appex-sharedux packages/shared-ux/storybook/mock @elastic/appex-sharedux +packages/shared-ux/modal/tabbed @elastic/appex-sharedux packages/kbn-shared-ux-utility @elastic/appex-sharedux x-pack/plugins/observability_solution/slo @elastic/obs-ux-management-team x-pack/packages/kbn-slo-schema @elastic/obs-ux-management-team @@ -1108,6 +1110,7 @@ x-pack/plugins/observability_solution/infra/server/lib/alerting @elastic/obs-ux- /x-pack/test/api_integration/apis/synthetics @elastic/obs-ux-infra_services-team /x-pack/test/alerting_api_integration/observability/synthetics_rule.ts @elastic/obs-ux-infra_services-team /x-pack/test/alerting_api_integration/observability/index.ts @elastic/obs-ux-management-team +/x-pack/test_serverless/api_integration/test_suites/observability/synthetics @elastic/obs-ux-infra_services-team # Logs /x-pack/test/api_integration/apis/logs_ui @elastic/obs-ux-logs-team @@ -1428,6 +1431,7 @@ x-pack/test/security_solution_cypress/cypress/tasks/expandable_flyout @elastic/ /x-pack/plugins/security_solution/common/detection_engine/rule_management @elastic/security-detection-rule-management /x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management @elastic/security-detection-rule-management +/x-pack/plugins/security_solution/docs/rfcs/detection_response @elastic/security-detection-rule-management @elastic/security-detection-engine /x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/prebuilt_rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/docs/testing/test_plans/detection_response/rule_management @elastic/security-detection-rule-management /x-pack/test/security_solution_api_integration/test_suites/detections_response/rules_management @elastic/security-detection-rule-management diff --git a/.i18nrc.json b/.i18nrc.json index 0c71b510223ad3..f853d3e1d8796b 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -9,17 +9,12 @@ "autocomplete": "packages/kbn-securitysolution-autocomplete/src", "bfetch": "src/plugins/bfetch", "bfetchError": "packages/kbn-bfetch-error", - "cases": [ - "packages/kbn-cases-components" - ], + "cases": ["packages/kbn-cases-components"], "cellActions": "packages/kbn-cell-actions", "charts": "src/plugins/charts", "console": "src/plugins/console", "contentManagement": "packages/content-management", - "core": [ - "src/core", - "packages/core" - ], + "core": ["src/core", "packages/core"], "customIntegrations": "src/plugins/custom_integrations", "customIntegrationsPackage": "packages/kbn-custom-integrations", "dashboard": "src/plugins/dashboard", @@ -31,10 +26,7 @@ "dataViews": "src/plugins/data_views", "defaultNavigation": "packages/default-nav", "devTools": "src/plugins/dev_tools", - "discover": [ - "src/plugins/discover", - "packages/kbn-discover-utils" - ], + "discover": ["src/plugins/discover", "packages/kbn-discover-utils"], "savedSearch": "src/plugins/saved_search", "embeddableApi": "src/plugins/embeddable", "presentationPanel": "src/plugins/presentation_panel", @@ -111,10 +103,7 @@ "searchConnectors": "packages/kbn-search-connectors", "searchConnectorsPlugin": "x-pack/plugins/search_connectors", "server": "src/legacy/server", - "share": [ - "src/plugins/share", - "packages/kbn-reporting-share" - ], + "share": ["src/plugins/share", "packages/kbn-reporting-share"], "sharedUXPackages": "packages/shared-ux", "searchApiPanels": "packages/kbn-search-api-panels/", "searchErrors": "packages/kbn-search-errors", @@ -126,17 +115,9 @@ "languageDocumentationPopover": "packages/kbn-language-documentation-popover/src", "textBasedLanguages": "src/plugins/text_based_languages", "statusPage": "src/legacy/core_plugins/status_page", - "telemetry": [ - "src/plugins/telemetry", - "src/plugins/telemetry_management_section" - ], - "timelion": [ - "src/plugins/vis_types/timelion" - ], - "uiActions": [ - "src/plugins/ui_actions", - "packages/kbn-ui-actions-browser" - ], + "telemetry": ["src/plugins/telemetry", "src/plugins/telemetry_management_section"], + "timelion": ["src/plugins/vis_types/timelion"], + "uiActions": ["src/plugins/ui_actions", "packages/kbn-ui-actions-browser"], "uiActionsEnhanced": "src/plugins/ui_actions_enhanced", "uiActionsExamples": "examples/ui_action_examples", "usageCollection": "src/plugins/usage_collection", @@ -157,10 +138,7 @@ "visualizations": "src/plugins/visualizations", "visualizationUiComponents": "packages/kbn-visualization-ui-components", "visualizationUtils": "packages/kbn-visualization-utils", - "unifiedDocViewer": [ - "src/plugins/unified_doc_viewer", - "packages/kbn-unified-doc-viewer" - ], + "unifiedDocViewer": ["src/plugins/unified_doc_viewer", "packages/kbn-unified-doc-viewer"], "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "packages/kbn-unified-field-list", "unifiedHistogram": "src/plugins/unified_histogram", diff --git a/.node-version b/.node-version index 2dbbe00e679a26..bc78e9f2695ea6 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -20.11.1 +20.12.1 diff --git a/.nvmrc b/.nvmrc index 2dbbe00e679a26..bc78e9f2695ea6 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.11.1 +20.12.1 diff --git a/WORKSPACE.bazel b/WORKSPACE.bazel index 35c8ec6bd01541..b004b398532923 100644 --- a/WORKSPACE.bazel +++ b/WORKSPACE.bazel @@ -22,13 +22,13 @@ load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install # Setup the Node.js toolchain for the architectures we want to support node_repositories( node_repositories = { - "20.11.1-darwin_amd64": ("node-v20.11.1-darwin-x64.tar.gz", "node-v20.11.1-darwin-x64", "c52e7fb0709dbe63a4cbe08ac8af3479188692937a7bd8e776e0eedfa33bb848"), - "20.11.1-darwin_arm64": ("node-v20.11.1-darwin-arm64.tar.gz", "node-v20.11.1-darwin-arm64", "e0065c61f340e85106a99c4b54746c5cee09d59b08c5712f67f99e92aa44995d"), - "20.11.1-linux_arm64": ("node-v20.11.1-linux-arm64.tar.xz", "node-v20.11.1-linux-arm64", "36bac185164aa11940715425da1db2ec46e3354325bda9ee0b98b4a607aa0d8b"), - "20.11.1-linux_amd64": ("node-v20.11.1-linux-x64.tar.xz", "node-v20.11.1-linux-x64", "e2c39cb70b9ff79575a02747dd1e89917817cce05da21bef6b94eb9e92442024"), - "20.11.1-windows_amd64": ("node-v20.11.1-win-x64.zip", "node-v20.11.1-win-x64", "bc032628d77d206ffa7f133518a6225a9c5d6d9210ead30d67e294ff37044bda"), + "20.12.1-darwin_amd64": ("node-v20.12.1-darwin-x64.tar.gz", "node-v20.12.1-darwin-x64", "f5dc3c71c87c58c9b019d9f85302db3a6a6c47167c5a0480b697f153d02ac316"), + "20.12.1-darwin_arm64": ("node-v20.12.1-darwin-arm64.tar.gz", "node-v20.12.1-darwin-arm64", "65df8cb0724e3a58c7757b75a70cc1057e1f67ffc5e852bfe6241de0b37c70a0"), + "20.12.1-linux_arm64": ("node-v20.12.1-linux-arm64.tar.xz", "node-v20.12.1-linux-arm64", "903a0f94312ba819f16a133e9dc378db128804ff45ea69e11af7152c303e8a85"), + "20.12.1-linux_amd64": ("node-v20.12.1-linux-x64.tar.xz", "node-v20.12.1-linux-x64", "e43b54ecea97b4419a5526af57bcf4f22a3d5583e1b2cacf461da71b9ba2befe"), + "20.12.1-windows_amd64": ("node-v20.12.1-win-x64.zip", "node-v20.12.1-win-x64", "629e2619ef88c5a8ce9944201f00ca3124f079c43ceef7ab0826c6fd19e09d75"), }, - node_version = "20.11.1", + node_version = "20.12.1", node_urls = [ "https://us-central1-elastic-kibana-184716.cloudfunctions.net/kibana-ci-proxy-cache/dist/v{version}/{filename}", ], diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 5d1435c1a59ce0..04843cc142979b 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-04-04 +date: 2024-04-05 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 5c21517b2817ce..92e02fb5ab646e 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-04-04 +date: 2024-04-05 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 6911310c174a13..9db48309f658d9 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-04-04 +date: 2024-04-05 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 71bd253a660095..4c1d5faa5a7a36 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-04-04 +date: 2024-04-05 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 ea52d3ecaff552..f02db103c33aa1 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 6adaf35de55b4b..150028e32950b4 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -418,7 +418,7 @@ "label": "APIEndpoint", "description": [], "signature": [ - "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_service_summary\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" + "\"POST /internal/apm/data_view/static\" | \"GET /internal/apm/data_view/index_pattern\" | \"GET /internal/apm/environments\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/groups/main_statistics_by_transaction_name\" | \"POST /internal/apm/services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/samples\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/error/{errorId}\" | \"GET /internal/apm/services/{serviceName}/errors/distribution\" | \"GET /internal/apm/services/{serviceName}/errors/{groupId}/top_erroneous_transactions\" | \"POST /internal/apm/latency/overall_distribution/transactions\" | \"GET /internal/apm/services/{serviceName}/metrics/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/nodes\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/charts\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/summary\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/functions_overview\" | \"GET /internal/apm/services/{serviceName}/metrics/serverless/active_instances\" | \"GET /internal/apm/observability_overview\" | \"GET /internal/apm/observability_overview/has_data\" | \"GET /internal/apm/service-map\" | \"GET /internal/apm/service-map/service/{serviceName}\" | \"GET /internal/apm/service-map/dependency\" | \"GET /internal/apm/services\" | \"POST /internal/apm/services/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/metadata/details\" | \"GET /internal/apm/services/{serviceName}/metadata/icons\" | \"GET /internal/apm/services/{serviceName}/agent\" | \"GET /internal/apm/services/{serviceName}/transaction_types\" | \"GET /internal/apm/services/{serviceName}/node/{serviceNodeName}/metadata\" | \"GET /api/apm/services/{serviceName}/annotation/search 2023-10-31\" | \"POST /api/apm/services/{serviceName}/annotation 2023-10-31\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}\" | \"GET /internal/apm/services/{serviceName}/throughput\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/main_statistics\" | \"GET /internal/apm/services/{serviceName}/service_overview_instances/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/dependencies\" | \"GET /internal/apm/services/{serviceName}/dependencies/breakdown\" | \"GET /internal/apm/services/{serviceName}/anomaly_charts\" | \"GET /internal/apm/services/{serviceName}/alerts_count\" | \"GET /internal/apm/service-groups\" | \"GET /internal/apm/service-group\" | \"POST /internal/apm/service-group\" | \"DELETE /internal/apm/service-group\" | \"GET /internal/apm/service-group/services\" | \"GET /internal/apm/service-group/counts\" | \"GET /internal/apm/suggestions\" | \"GET /internal/apm/traces/{traceId}\" | \"GET /internal/apm/traces\" | \"GET /internal/apm/traces/{traceId}/root_transaction\" | \"GET /internal/apm/transactions/{transactionId}\" | \"GET /internal/apm/traces/find\" | \"POST /internal/apm/traces/aggregated_critical_path\" | \"GET /internal/apm/traces/{traceId}/transactions/{transactionId}\" | \"GET /internal/apm/traces/{traceId}/spans/{spanId}\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/main_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/groups/detailed_statistics\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/latency\" | \"GET /internal/apm/services/{serviceName}/transactions/traces/samples\" | \"GET /internal/apm/services/{serviceName}/transaction/charts/breakdown\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/error_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate\" | \"GET /internal/apm/services/{serviceName}/transactions/charts/coldstart_rate_by_transaction_name\" | \"GET /internal/apm/rule_types/transaction_error_rate/chart_preview\" | \"GET /internal/apm/rule_types/error_count/chart_preview\" | \"GET /internal/apm/rule_types/transaction_duration/chart_preview\" | \"GET /api/apm/settings/agent-configuration 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/view 2023-10-31\" | \"DELETE /api/apm/settings/agent-configuration 2023-10-31\" | \"PUT /api/apm/settings/agent-configuration 2023-10-31\" | \"POST /api/apm/settings/agent-configuration/search 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/environments 2023-10-31\" | \"GET /api/apm/settings/agent-configuration/agent_name 2023-10-31\" | \"GET /internal/apm/settings/anomaly-detection/jobs\" | \"POST /internal/apm/settings/anomaly-detection/jobs\" | \"GET /internal/apm/settings/anomaly-detection/environments\" | \"POST /internal/apm/settings/anomaly-detection/update_to_v3\" | \"GET /internal/apm/settings/apm-index-settings\" | \"GET /internal/apm/settings/apm-indices\" | \"POST /internal/apm/settings/apm-indices/save\" | \"GET /internal/apm/settings/custom_links/transaction\" | \"GET /internal/apm/settings/custom_links\" | \"POST /internal/apm/settings/custom_links\" | \"PUT /internal/apm/settings/custom_links/{id}\" | \"DELETE /internal/apm/settings/custom_links/{id}\" | \"GET /api/apm/sourcemaps 2023-10-31\" | \"POST /api/apm/sourcemaps 2023-10-31\" | \"DELETE /api/apm/sourcemaps/{id} 2023-10-31\" | \"POST /internal/apm/sourcemaps/migrate_fleet_artifacts\" | \"GET /internal/apm/fleet/has_apm_policies\" | \"GET /internal/apm/fleet/agents\" | \"POST /api/apm/fleet/apm_server_schema 2023-10-31\" | \"GET /internal/apm/fleet/apm_server_schema/unsupported\" | \"GET /internal/apm/fleet/migration_check\" | \"POST /internal/apm/fleet/cloud_apm_package_policy\" | \"GET /internal/apm/fleet/java_agent_versions\" | \"GET /internal/apm/dependencies/top_dependencies\" | \"GET /internal/apm/dependencies/upstream_services\" | \"GET /internal/apm/dependencies/metadata\" | \"GET /internal/apm/dependencies/charts/latency\" | \"GET /internal/apm/dependencies/charts/throughput\" | \"GET /internal/apm/dependencies/charts/error_rate\" | \"GET /internal/apm/dependencies/operations\" | \"GET /internal/apm/dependencies/charts/distribution\" | \"GET /internal/apm/dependencies/operations/spans\" | \"GET /internal/apm/correlations/field_candidates/transactions\" | \"GET /internal/apm/correlations/field_value_stats/transactions\" | \"POST /internal/apm/correlations/field_value_pairs/transactions\" | \"POST /internal/apm/correlations/significant_correlations/transactions\" | \"POST /internal/apm/correlations/p_values/transactions\" | \"GET /internal/apm/fallback_to_transactions\" | \"GET /internal/apm/has_data\" | \"GET /internal/apm/event_metadata/{processorEvent}/{id}\" | \"GET /internal/apm/agent_keys\" | \"GET /internal/apm/agent_keys/privileges\" | \"POST /internal/apm/api_key/invalidate\" | \"POST /api/apm/agent_keys 2023-10-31\" | \"GET /internal/apm/storage_explorer\" | \"GET /internal/apm/services/{serviceName}/storage_details\" | \"GET /internal/apm/storage_chart\" | \"GET /internal/apm/storage_explorer/privileges\" | \"GET /internal/apm/storage_explorer_summary_stats\" | \"GET /internal/apm/storage_explorer/is_cross_cluster_search\" | \"GET /internal/apm/storage_explorer/get_services\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/parents\" | \"GET /internal/apm/traces/{traceId}/span_links/{spanId}/children\" | \"GET /internal/apm/services/{serviceName}/infrastructure_attributes\" | \"GET /internal/apm/debug-telemetry\" | \"GET /internal/apm/time_range_metadata\" | \"GET /internal/apm/settings/labs\" | \"GET /internal/apm/get_agents_per_service\" | \"GET /internal/apm/get_latest_agent_versions\" | \"GET /internal/apm/services/{serviceName}/agent_instances\" | \"GET /internal/apm/mobile-services/{serviceName}/error/http_error_rate\" | \"GET /internal/apm/mobile-services/{serviceName}/errors/groups/main_statistics\" | \"POST /internal/apm/mobile-services/{serviceName}/errors/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/error_terms\" | \"POST /internal/apm/mobile-services/{serviceName}/crashes/groups/detailed_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/groups/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/crashes/distribution\" | \"GET /internal/apm/services/{serviceName}/mobile/filters\" | \"GET /internal/apm/mobile-services/{serviceName}/most_used_charts\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/sessions\" | \"GET /internal/apm/mobile-services/{serviceName}/transactions/charts/http_requests\" | \"GET /internal/apm/mobile-services/{serviceName}/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/location/stats\" | \"GET /internal/apm/mobile-services/{serviceName}/terms\" | \"GET /internal/apm/mobile-services/{serviceName}/main_statistics\" | \"GET /internal/apm/mobile-services/{serviceName}/detailed_statistics\" | \"GET /internal/apm/diagnostics\" | \"POST /internal/apm/assistant/get_apm_timeseries\" | \"GET /internal/apm/assistant/get_apm_alert_details_context\" | \"GET /internal/apm/assistant/get_service_summary\" | \"POST /internal/apm/assistant/get_correlation_values\" | \"GET /internal/apm/assistant/get_downstream_dependencies\" | \"GET /internal/apm/services/{serviceName}/profiling/flamegraph\" | \"GET /internal/apm/profiling/status\" | \"GET /internal/apm/services/{serviceName}/profiling/functions\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/flamegraph\" | \"GET /internal/apm/services/{serviceName}/profiling/hosts/functions\" | \"POST /internal/apm/custom-dashboard\" | \"DELETE /internal/apm/custom-dashboard\" | \"GET /internal/apm/services/{serviceName}/dashboards\"" ], "path": "x-pack/plugins/observability_solution/apm/server/routes/apm_routes/get_global_apm_server_route_repository.ts", "deprecated": false, @@ -1037,6 +1037,52 @@ "ServiceSummary", "; }>; } & ", "APMRouteCreateOptions", + "; \"GET /internal/apm/assistant/get_apm_alert_details_context\": { endpoint: \"GET /internal/apm/assistant/get_apm_alert_details_context\"; params?: ", + "TypeC", + "<{ query: ", + "IntersectionC", + "<[", + "TypeC", + "<{ 'service.name': ", + "StringC", + "; alert_started_at: ", + "StringC", + "; }>, ", + "PartialC", + "<{ 'service.environment': ", + "StringC", + "; 'transaction.type': ", + "StringC", + "; 'transaction.name': ", + "StringC", + "; 'host.name': ", + "StringC", + "; 'container.id': ", + "StringC", + "; }>]>; }> | undefined; handler: ({}: ", + "APMRouteHandlerResources", + " & { params: { query: { 'service.name': string; alert_started_at: string; } & { 'service.environment'?: string | undefined; 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; }; }; }) => Promise<{ serviceSummary: ", + "ServiceSummary", + "; downstreamDependencies: ", + "APMDownstreamDependency", + "[]; logCategories: ", + "LogCategories", + "; serviceChangePoints: { title: string; changes: ", + "TimeseriesChangePoint", + "[]; }[]; exitSpanChangePoints: { title: string; changes: ", + "TimeseriesChangePoint", + "[]; }[]; anomalies: { '@timestamp': string; metricName: string; \"service.name\": string; \"service.environment\": \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + "Branded", + "; \"transaction.type\": string; anomalyScore: string | number | null; actualValue: number; expectedBoundsLower: number; expectedBoundsUpper: number; }[]; }>; } & ", + "APMRouteCreateOptions", "; \"POST /internal/apm/assistant/get_apm_timeseries\": { endpoint: \"POST /internal/apm/assistant/get_apm_timeseries\"; params?: ", "TypeC", "<{ body: ", @@ -1071,6 +1117,8 @@ "PartialC", "<{ 'transaction.type': ", "StringC", + "; 'transaction.name': ", + "StringC", "; }>]>, ", "IntersectionC", "<[", @@ -1119,6 +1167,8 @@ "PartialC", "<{ 'transaction.type': ", "StringC", + "; 'transaction.name': ", + "StringC", "; }>]>, ", "TypeC", "<{ name: ", @@ -1143,7 +1193,7 @@ "ApmTimeseriesType", ".transactionThroughput | ", "ApmTimeseriesType", - ".transactionFailureRate; } & { 'transaction.type'?: string | undefined; }) | ({ name: ", + ".transactionFailureRate; } & { 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; }) | ({ name: ", "ApmTimeseriesType", ".exitSpanThroughput | ", "ApmTimeseriesType", @@ -1153,7 +1203,7 @@ "ApmTimeseriesType", ".transactionLatency; function: ", "LatencyAggregationType", - "; } & { 'transaction.type'?: string | undefined; }) | { name: ", + "; } & { 'transaction.type'?: string | undefined; 'transaction.name'?: string | undefined; }) | { name: ", "ApmTimeseriesType", ".errorEventRate; }; } & { filter?: string | undefined; offset?: string | undefined; 'service.environment'?: string | undefined; })[]; start: string; end: string; }; }; }) => Promise<{ content: Omit<", "ApmTimeseries", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index ac73b2ba78d0ab..9229d39a7fa9d8 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.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 | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 29 | 125 | +| 29 | 0 | 29 | 127 | ## Client diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index b53da77d6c9483..5708a4e48bd572 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-04-04 +date: 2024-04-05 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 67208cb10b0d9c..52b8b774d9959d 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 4e22c038d050b1..d6743ebce9b2b4 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-04-04 +date: 2024-04-05 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 513a0a35cdd0b6..f69a6fa491b9a5 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-04-04 +date: 2024-04-05 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 8b64be407821a3..e59cf53dc57a34 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-04-04 +date: 2024-04-05 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 ddbf17e1f334c7..7d6bb529bd623c 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-04-04 +date: 2024-04-05 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 6e1939ada7f9f0..185aefda535b72 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index f0ba997f861879..07ad1a2fb96ba4 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 964fe3e9bdbd81..3a0bb09b30f1e6 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.devdocs.json b/api_docs/cloud_defend.devdocs.json index a147bd238d6976..fc5809fff4cc64 100644 --- a/api_docs/cloud_defend.devdocs.json +++ b/api_docs/cloud_defend.devdocs.json @@ -739,7 +739,7 @@ "label": "CloudDefendStatusCode", "description": [], "signature": [ - "\"unprivileged\" | \"indexed\" | \"indexing\" | \"index-timeout\" | \"not-deployed\" | \"not-installed\"" + "\"indexed\" | \"unprivileged\" | \"indexing\" | \"index-timeout\" | \"not-deployed\" | \"not-installed\"" ], "path": "x-pack/plugins/cloud_defend/common/v1.ts", "deprecated": false, diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 8097714ff28489..b7da2ca2e4b443 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-04-04 +date: 2024-04-05 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 531ca67fa009f1..5a6c6fdf761eae 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-04-04 +date: 2024-04-05 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 eb070df95cad42..ce468898e9698a 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-04-04 +date: 2024-04-05 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 a82c406dff9e51..fb1954a5b909a3 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-04-04 +date: 2024-04-05 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 dfe2cd4afe8135..66c38b30afcfd4 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-04-04 +date: 2024-04-05 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..e113cc8764bb6b 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -4725,7 +4725,7 @@ "label": "chainingSystem", "description": [], "signature": [ - "\"HIERARCHICAL\" | \"NONE\"" + "\"NONE\" | \"HIERARCHICAL\"" ], "path": "src/plugins/controls/common/control_group/types.ts", "deprecated": false, @@ -7005,7 +7005,7 @@ "label": "chainingSystem", "description": [], "signature": [ - "\"HIERARCHICAL\" | \"NONE\"" + "\"NONE\" | \"HIERARCHICAL\"" ], "path": "src/plugins/controls/common/control_group/types.ts", "deprecated": false, diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 91554c6609be79..e0b0905831fe78 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 05735b96025233..4a28f031f7891f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 160529b30c8aa2..a1dca256a00d29 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 489db9016c1208..ef8301d8105020 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 16bdf0bf86ab5d..950fcc8d7b0ecb 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -8347,6 +8347,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-public.SavedObject.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [ + "The ID of the user who created this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-public.SavedObject.updated_at", @@ -25006,6 +25022,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "data", + "id": "def-common.SavedObject.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [ + "The ID of the user who created this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "data", "id": "def-common.SavedObject.updated_at", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 467a442e417efd..1539bae7e29b78 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 3283 | 31 | 2619 | 23 | +| 3285 | 31 | 2619 | 23 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 112a3644ade3cc..89c038df50f3d3 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 3283 | 31 | 2619 | 23 | +| 3285 | 31 | 2619 | 23 | ## Client diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index b576f9dacc4e75..2bfa70918e9128 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 3283 | 31 | 2619 | 23 | +| 3285 | 31 | 2619 | 23 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 99675190782f87..0f1bc3598e4227 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-04-04 +date: 2024-04-05 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 5291786f8dae2b..c20478256069c1 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-04-04 +date: 2024-04-05 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 c698d690cf9d42..24ff7d17837426 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index dc66b8c4752ccf..99c362a2e14b2e 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -22110,6 +22110,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "dataViews", + "id": "def-common.SavedObject.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [ + "The ID of the user who created this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "dataViews", "id": "def-common.SavedObject.updated_at", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 0ef7fa87517dca..68c295e4a70f90 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.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 | |-------------------|-----------|------------------------|-----------------| -| 1069 | 0 | 370 | 4 | +| 1070 | 0 | 370 | 4 | ## Client diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 849aac8397cb72..b1ea83db3aa003 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-04-04 +date: 2024-04-05 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 6829ef0494ebee..1f33654224a901 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-04-04 +date: 2024-04-05 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 f6c7874edfeab9..46dc09cd16ab16 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,7 +17,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, devTools, console, security, visualizations, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, alerting, dashboard, triggersActionsUi, aiops, maps, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, licenseManagement, dataVisualizer, ml, fleet, crossClusterReplication, graph, grokdebugger, indexLifecycleManagement, ingestPipelines, logstash, metricsDataAccess, exploratoryView, osquery, infra, monitoring, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, transform, upgradeAssistant, watcher, cloudDataMigration, profiling, apm, observabilityOnboarding, synthetics, uptime, ux, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | +| | uiActions, guidedOnboarding, home, serverless, management, spaces, savedObjects, indexManagement, devTools, console, security, visualizations, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, alerting, dashboard, triggersActionsUi, aiops, maps, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, licenseManagement, dataVisualizer, ml, fleet, crossClusterReplication, graph, grokdebugger, indexLifecycleManagement, ingestPipelines, logstash, metricsDataAccess, exploratoryView, osquery, infra, monitoring, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, transform, upgradeAssistant, watcher, cloudDataMigration, profiling, apm, observabilityOnboarding, synthetics, uptime, ux, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, aiops, ml, dataVisualizer, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | @@ -28,7 +28,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | dashboard, dataVisualizer, stackAlerts, expressionPartitionVis | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | triggersActionsUi | - | -| | inspector, data, savedObjects, console, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, licensing, security, navigation, visualizations, savedObjectsTagging, dataViewFieldEditor, lens, dashboard, triggersActionsUi, cases, observabilityShared, banners, maps, @kbn/reporting-public, reporting, timelines, fleet, telemetry, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, exploratoryView, monitoring, securitySolution, cloudLinks, synthetics, uptime, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | +| | inspector, data, savedObjects, console, runtimeFields, indexManagement, dataViewEditor, unifiedSearch, embeddable, licensing, security, visualizations, savedObjectsTagging, dataViewFieldEditor, lens, dashboard, triggersActionsUi, cases, observabilityShared, banners, maps, @kbn/reporting-public, reporting, timelines, fleet, telemetry, cloudSecurityPosture, dashboardEnhanced, imageEmbeddable, graph, exploratoryView, monitoring, securitySolution, synthetics, uptime, dataViewManagement, eventAnnotationListing, filesManagement, uiActions, visTypeVislib | - | | | @kbn/core, visualizations, triggersActionsUi | - | | | ruleRegistry, securitySolution, synthetics, uptime, slo | - | | | alerting, discover, securitySolution | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 7d8f981664a75c..90ae767689e9d4 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -125,7 +125,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion) | - | | | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=migrationVersion) | - | -| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject)+ 4 more | - | +| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts#:~:text=SavedObject)+ 5 more | - | | | [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/create.ts#:~:text=SavedObjectReference), [create.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/create.ts#:~:text=SavedObjectReference), [bulk_update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/bulk_update.ts#:~:text=SavedObjectReference), [bulk_update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/bulk_update.ts#:~:text=SavedObjectReference), [update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/update.ts#:~:text=SavedObjectReference), [update.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-api-browser/src/apis/update.ts#:~:text=SavedObjectReference) | - | @@ -204,7 +204,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkCreateObject), [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkCreateObject) | - | | | [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkDeleteResponse), [saved_objects_client.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts#:~:text=SavedObjectsBulkDeleteResponse) | - | | | [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart), [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart), [saved_objects_service.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_service.ts#:~:text=SavedObjectsStart) | - | -| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject)+ 20 more | - | +| | [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject), [simple_saved_object.ts](https://github.com/elastic/kibana/tree/main/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts#:~:text=SavedObject)+ 21 more | - | @@ -328,7 +328,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode), [theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme.ts#:~:text=darkMode) | - | +| | [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [esql_theme.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/esql/lib/esql_theme.ts#:~:text=darkMode), [shared.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme/shared.ts#:~:text=darkMode), [shared.ts](https://github.com/elastic/kibana/tree/main/packages/kbn-monaco/src/console/theme/shared.ts#:~:text=darkMode) | - | @@ -488,7 +488,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [add_to_new_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx#:~:text=toMountPoint), [add_to_new_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx#:~:text=toMountPoint), [add_to_existing_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.tsx#:~:text=toMountPoint), [add_to_existing_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.tsx#:~:text=toMountPoint) | - | +| | [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [use_cases_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/common/use_cases_toast.tsx#:~:text=toMountPoint), [add_to_existing_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.tsx#:~:text=toMountPoint), [add_to_existing_case.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.tsx#:~:text=toMountPoint) | - | | | [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) | - | @@ -511,14 +511,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## cloudLinks - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [theme_darkmode_toggle.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx#:~:text=toMountPoint), [theme_darkmode_toggle.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx#:~:text=toMountPoint) | - | - - - ## cloudSecurityPosture | Deprecated API | Reference location(s) | Remove By | @@ -562,7 +554,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/types.ts#:~:text=fieldFormats), [data_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/data_service.ts#:~:text=fieldFormats) | - | -| | [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint)+ 2 more | - | +| | [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [dashboard_listing_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing_table.tsx#:~:text=toMountPoint), [dashboard_listing_table.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing_table.tsx#:~:text=toMountPoint) | - | | | [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider) | - | | | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal), [add_to_library_action.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | | | [duplicate_dashboard_panel.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.test.ts#:~:text=savedObjects), [duplicate_dashboard_panel.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/duplicate_dashboard_panel.test.ts#:~:text=savedObjects) | - | @@ -1199,14 +1191,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] -## navigation - -| Deprecated API | Reference location(s) | Remove By | -| ---------------|-----------|-----------| -| | [solution_nav_userprofile_toggle.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx#:~:text=toMountPoint), [solution_nav_userprofile_toggle.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx#:~:text=toMountPoint) | - | - - - ## newsfeed | Deprecated API | Reference location(s) | Remove By | @@ -1421,8 +1405,8 @@ 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 | | | [authorization_service.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/server/authorization/authorization_service.tsx#:~:text=getElasticsearchFeatures) | 8.8.0 | -| | [account_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/account_management/account_management_app.tsx#:~:text=toMountPoint), [account_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/account_management/account_management_app.tsx#:~:text=toMountPoint), [session_expiration_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/session/session_expiration_toast.tsx#:~:text=toMountPoint), [session_expiration_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/session/session_expiration_toast.tsx#:~:text=toMountPoint) | - | -| | [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [role_mappings_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.tsx#:~:text=KibanaThemeProvider)+ 20 more | - | +| | [session_expiration_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/session/session_expiration_toast.tsx#:~:text=toMountPoint), [session_expiration_toast.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/session/session_expiration_toast.tsx#:~:text=toMountPoint) | - | +| | [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [api_keys_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/api_keys/api_keys_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [users_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/users/users_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [roles_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/roles/roles_management_app.tsx#:~:text=KibanaThemeProvider), [role_mappings_management_app.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.tsx#:~:text=KibanaThemeProvider)+ 17 more | - | | | [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 | | | [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 | @@ -1490,7 +1474,6 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [share_menu_manager.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/share/public/services/share_menu_manager.tsx#:~:text=KibanaThemeProvider), [share_menu_manager.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/share/public/services/share_menu_manager.tsx#:~:text=KibanaThemeProvider), [share_menu_manager.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/share/public/services/share_menu_manager.tsx#:~:text=KibanaThemeProvider) | - | | | [register_url_service_saved_object_type.ts](https://github.com/elastic/kibana/tree/main/src/plugins/share/server/url_service/saved_objects/register_url_service_saved_object_type.ts#:~:text=migrations), [register_url_service_saved_object_type.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/share/server/url_service/saved_objects/register_url_service_saved_object_type.test.ts#:~:text=migrations), [register_url_service_saved_object_type.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/share/server/url_service/saved_objects/register_url_service_saved_object_type.test.ts#:~:text=migrations) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0d80ee3db201b2..782caa4d5c2693 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 3dc6445817baf4..f4c990b75d4f88 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-04-04 +date: 2024-04-05 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 7961c4a1de6bc4..8e61838db75067 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-04-04 +date: 2024-04-05 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 4aafa7f98f2411..5acddaf7bb77c6 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index f8e845142d85f3..06deda1bfedf19 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.devdocs.json b/api_docs/elastic_assistant.devdocs.json index 7a99968afbdace..804fed5b27febb 100644 --- a/api_docs/elastic_assistant.devdocs.json +++ b/api_docs/elastic_assistant.devdocs.json @@ -1639,7 +1639,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - "): { preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", + "): { preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", "AnomalyDetectionRuleState", " | undefined) => Promise<{ payload: ", "AnomalyDetectionAlertPayload", diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index f35744b10970f5..b39f26b521d3e2 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-04-04 +date: 2024-04-05 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 b63f926e92f2bd..5c3da0a3ae0e49 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -5806,7 +5806,7 @@ }, " | undefined" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false } @@ -7691,10 +7691,22 @@ "label": "embeddableInputToSubject", "description": [], "signature": [ - "(subscription: ", "Subscription", ", embeddable: ", @@ -7715,7 +7727,7 @@ }, ", any>, key: keyof LegacyInput, useExplicitInput?: boolean) => ", "BehaviorSubject", - "" + "" ], "path": "src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts", "deprecated": false, @@ -7808,10 +7820,22 @@ "label": "embeddableOutputToSubject", "description": [], "signature": [ - "(subscription: ", "Subscription", ", embeddable: ", @@ -7823,10 +7847,16 @@ "text": "IEmbeddable" }, "<", - "CommonLegacyInput", + { + "pluginId": "embeddable", + "scope": "common", + "docId": "kibEmbeddablePluginApi", + "section": "def-common.EmbeddableInput", + "text": "EmbeddableInput" + }, ", LegacyOutput, any>, key: keyof LegacyOutput) => ", "BehaviorSubject", - "" + "" ], "path": "src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts", "deprecated": false, @@ -7863,7 +7893,13 @@ "text": "IEmbeddable" }, "<", - "CommonLegacyInput", + { + "pluginId": "embeddable", + "scope": "common", + "docId": "kibEmbeddablePluginApi", + "section": "def-common.EmbeddableInput", + "text": "EmbeddableInput" + }, ", LegacyOutput, any>" ], "path": "src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 0f185f1987f1f2..fdac09e4f812d2 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 559 | 1 | 453 | 10 | +| 559 | 1 | 453 | 8 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 21c4ec51b62403..f07598e67a7241 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-04-04 +date: 2024-04-05 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 da2495fb0f4b5e..c41b53efd0fef4 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-04-04 +date: 2024-04-05 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 5c53a2f913b216..57fd8d7b18cb42 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-04-04 +date: 2024-04-05 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 e8e52d28e2b03f..a4549c5e0e0924 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 621ec7e6218051..5f6451dfe539b4 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-04-04 +date: 2024-04-05 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 53eed3d7b9fc25..7724448e185f5f 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-04-04 +date: 2024-04-05 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 df02a34c911533..dd31716294575b 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-04-04 +date: 2024-04-05 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 24f5f1550128a2..8f1fe343510c94 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-04-04 +date: 2024-04-05 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 5a8a8bc0c56fb7..7855881fc64dcf 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-04-04 +date: 2024-04-05 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 f0fa68b60db51c..c515d5a77cfcfe 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-04-04 +date: 2024-04-05 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 f164bf56b41d1e..2929dbfdea9d1d 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-04-04 +date: 2024-04-05 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 82a3a9267bafa9..8252ef14536939 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-04-04 +date: 2024-04-05 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 8e51b7a2b9796c..164d57c4299c2a 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-04-04 +date: 2024-04-05 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 c849cae0645d4b..acfa544558b49b 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-04-04 +date: 2024-04-05 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 fb67c2339393ad..e6b726f2164ffc 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-04-04 +date: 2024-04-05 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 1aad32376aa6a9..2eea06a1b566ad 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-04-04 +date: 2024-04-05 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 dca521d9050a3b..08bb1ff6bf9507 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-04-04 +date: 2024-04-05 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 4c292ff693803a..06fe5f35e29b1d 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.devdocs.json b/api_docs/expression_shape.devdocs.json index 63d5a0c2ce2f25..5b9ce734491bf2 100644 --- a/api_docs/expression_shape.devdocs.json +++ b/api_docs/expression_shape.devdocs.json @@ -635,7 +635,7 @@ "label": "strokeLinecap", "description": [], "signature": [ - "\"inherit\" | \"butt\" | \"round\" | \"square\" | undefined" + "\"square\" | \"inherit\" | \"butt\" | \"round\" | undefined" ], "path": "src/plugins/expression_shape/public/components/reusable/types.tsx", "deprecated": false, diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 336fd61a2b22f5..897dfb0af8d20d 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-04-04 +date: 2024-04-05 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 daba004faccc3e..09e2ca3b81fbfe 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.devdocs.json b/api_docs/expression_x_y.devdocs.json index a077d8d2b545e3..c2dd8607c69217 100644 --- a/api_docs/expression_x_y.devdocs.json +++ b/api_docs/expression_x_y.devdocs.json @@ -417,7 +417,7 @@ "label": "mode", "description": [], "signature": [ - "\"full\" | \"custom\" | \"dataBounds\"" + "\"custom\" | \"full\" | \"dataBounds\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -2301,7 +2301,7 @@ "label": "AxisExtentMode", "description": [], "signature": [ - "\"full\" | \"custom\" | \"dataBounds\"" + "\"custom\" | \"full\" | \"dataBounds\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -2316,7 +2316,7 @@ "label": "AxisMode", "description": [], "signature": [ - "\"percentage\" | \"normal\" | \"wiggle\" | \"silhouette\"" + "\"normal\" | \"percentage\" | \"wiggle\" | \"silhouette\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -3564,7 +3564,7 @@ "label": "YScaleType", "description": [], "signature": [ - "\"log\" | \"time\" | \"linear\" | \"sqrt\"" + "\"log\" | \"sqrt\" | \"time\" | \"linear\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 579434f34fdebc..03f39ef7013087 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-04-04 +date: 2024-04-05 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 0d7c0fd4639310..c001cf952d1fe5 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 4a3aa2f578a6d7..e928e6b6084f00 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index f6c11c9bc2829f..d8f6d5e592ad32 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index ef2297536f6130..d1376a83767ca4 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-04-04 +date: 2024-04-05 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 512b3d48295c05..67f96725b0b4dc 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-04-04 +date: 2024-04-05 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 ed52ee8ea15dab..d38840195b090d 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-04-04 +date: 2024-04-05 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 dc9f2eae19d35f..36f3b583b6df99 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -3,6 +3,25 @@ "client": { "classes": [], "functions": [ + { + "parentPluginId": "fleet", + "id": "def-public.AvailablePackagesHook", + "type": "Function", + "tags": [], + "label": "AvailablePackagesHook", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/fleet/public/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-public.CustomAssetsAccordion", @@ -93,6 +112,25 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-public.PackageList", + "type": "Function", + "tags": [], + "label": "PackageList", + "description": [], + "signature": [ + "() => Promise" + ], + "path": "x-pack/plugins/fleet/public/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-public.PackagePolicyEditorDatastreamMappings", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 9e6c9886b389b5..4c7238f158d11f 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 1233 | 3 | 1113 | 57 | +| 1235 | 3 | 1115 | 59 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index a26426f94e06f1..4bac3f328c585f 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-04-04 +date: 2024-04-05 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 1650bafc0be498..7c8febdc716e94 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-04-04 +date: 2024-04-05 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 2598d95b41033e..6af4157efdfdcc 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-04-04 +date: 2024-04-05 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 af764e9fcca958..16eb4054771400 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-04-04 +date: 2024-04-05 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 d7b5b4803b2592..898efb3e1f020c 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-04-04 +date: 2024-04-05 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 6444f2e62be785..643cc8855a68a3 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-04-04 +date: 2024-04-05 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 11806a0ea52054..bfe9cb94c77d38 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-04-04 +date: 2024-04-05 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 cd5a954016dbc6..58e50cf3198d6e 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-04-04 +date: 2024-04-05 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 b8844a679214bd..74d7ff8068bcd4 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-04-04 +date: 2024-04-05 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 873e881b64dc25..e16289e693afe3 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index ef11afb79f2501..22e8367ee1ad7e 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-04-04 +date: 2024-04-05 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 a2e935c2ab1107..eccd9d971289e0 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-04-04 +date: 2024-04-05 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 e942de9844e5d9..9d0023716f086c 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-04-04 +date: 2024-04-05 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 9aa3a6a54ac4ea..546fc919feedd2 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-04-04 +date: 2024-04-05 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 27d26084fce235..7081e6fca3fd71 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-04-04 +date: 2024-04-05 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 4e2237cdfe4a2f..7e1050a6ed6296 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 5660bc3e7e55ac..acfeec5329c9bb 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-04-04 +date: 2024-04-05 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 71657f8f47c9dc..aca2b14e933a9e 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_alerts_as_data_utils.devdocs.json index b59b0fab3cdd9e..b5bf082f0bbb1d 100644 --- a/api_docs/kbn_alerts_as_data_utils.devdocs.json +++ b/api_docs/kbn_alerts_as_data_utils.devdocs.json @@ -196,7 +196,7 @@ "label": "AADAlert", "description": [], "signature": [ - "({ '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & {} & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; 'error.message'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ '@timestamp': string | number; 'kibana.alert.ancestors': { depth: string | number; id: string; index: string; type: string; }[]; 'kibana.alert.depth': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.original_event.action': string; 'kibana.alert.original_event.category': string[]; 'kibana.alert.original_event.created': string | number; 'kibana.alert.original_event.dataset': string; 'kibana.alert.original_event.id': string; 'kibana.alert.original_event.ingested': string | number; 'kibana.alert.original_event.kind': string; 'kibana.alert.original_event.module': string; 'kibana.alert.original_event.original': string; 'kibana.alert.original_event.outcome': string; 'kibana.alert.original_event.provider': string; 'kibana.alert.original_event.sequence': string | number; 'kibana.alert.original_event.type': string[]; 'kibana.alert.original_time': string | number; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.false_positives': string[]; 'kibana.alert.rule.max_signals': (string | number)[]; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.threat.framework': string; 'kibana.alert.rule.threat.tactic.id': string; 'kibana.alert.rule.threat.tactic.name': string; 'kibana.alert.rule.threat.tactic.reference': string; 'kibana.alert.rule.threat.technique.id': string; 'kibana.alert.rule.threat.technique.name': string; 'kibana.alert.rule.threat.technique.reference': string; 'kibana.alert.rule.threat.technique.subtechnique.id': string; 'kibana.alert.rule.threat.technique.subtechnique.name': string; 'kibana.alert.rule.threat.technique.subtechnique.reference': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'ecs.version'?: string | undefined; 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'host.asset.criticality'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.ancestors.rule'?: string | undefined; 'kibana.alert.building_block_type'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.group.id'?: string | undefined; 'kibana.alert.group.index'?: number | undefined; 'kibana.alert.host.criticality_level'?: string | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.new_terms'?: string[] | undefined; 'kibana.alert.original_event.agent_id_status'?: string | undefined; 'kibana.alert.original_event.code'?: string | undefined; 'kibana.alert.original_event.duration'?: string | undefined; 'kibana.alert.original_event.end'?: string | number | undefined; 'kibana.alert.original_event.hash'?: string | undefined; 'kibana.alert.original_event.reason'?: string | undefined; 'kibana.alert.original_event.reference'?: string | undefined; 'kibana.alert.original_event.risk_score'?: number | undefined; 'kibana.alert.original_event.risk_score_norm'?: number | undefined; 'kibana.alert.original_event.severity'?: string | number | undefined; 'kibana.alert.original_event.start'?: string | number | undefined; 'kibana.alert.original_event.timezone'?: string | undefined; 'kibana.alert.original_event.url'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.building_block_type'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.immutable'?: string[] | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.rule.timeline_id'?: string[] | undefined; 'kibana.alert.rule.timeline_title'?: string[] | undefined; 'kibana.alert.rule.timestamp_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.threshold_result.cardinality'?: unknown; 'kibana.alert.threshold_result.count'?: string | number | undefined; 'kibana.alert.threshold_result.from'?: string | number | undefined; 'kibana.alert.threshold_result.terms'?: { field?: string | undefined; value?: string | undefined; }[] | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.user.criticality_level'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.alert.workflow_user'?: string | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; 'user.asset.criticality'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ 'kibana.alert.job_id': string; } & { 'kibana.alert.anomaly_score'?: number[] | undefined; 'kibana.alert.anomaly_timestamp'?: string | number | undefined; 'kibana.alert.is_interim'?: boolean | undefined; 'kibana.alert.top_influencers'?: { influencer_field_name?: string | undefined; influencer_field_value?: string | undefined; influencer_score?: number | undefined; initial_influencer_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; timestamp?: string | number | undefined; }[] | undefined; 'kibana.alert.top_records'?: { actual?: number | undefined; by_field_name?: string | undefined; by_field_value?: string | undefined; detector_index?: number | undefined; field_name?: string | undefined; function?: string | undefined; initial_record_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; over_field_name?: string | undefined; over_field_value?: string | undefined; partition_field_name?: string | undefined; partition_field_value?: string | undefined; record_score?: number | undefined; timestamp?: string | number | undefined; typical?: number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.datafeed_results'?: { datafeed_id?: string | undefined; datafeed_state?: string | undefined; job_id?: string | undefined; job_state?: string | undefined; }[] | undefined; 'kibana.alert.delayed_data_results'?: { annotation?: string | undefined; end_timestamp?: string | number | undefined; job_id?: string | undefined; missed_docs_count?: string | number | undefined; }[] | undefined; 'kibana.alert.job_errors_results'?: { errors?: unknown; job_id?: string | undefined; }[] | undefined; 'kibana.alert.mml_results'?: { job_id?: string | undefined; log_time?: string | number | undefined; memory_status?: string | undefined; model_bytes?: string | number | undefined; model_bytes_exceeded?: string | number | undefined; model_bytes_memory_limit?: string | number | undefined; peak_model_bytes?: string | number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.results'?: { description?: string | undefined; health_status?: string | undefined; issues?: unknown; node_name?: string | undefined; transform_id?: string | undefined; transform_state?: string | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; })" + "({ '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & {} & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'container.id'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'slo.id'?: string | undefined; 'slo.instanceId'?: string | undefined; 'slo.revision'?: string | number | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({} & { 'agent.name'?: string | undefined; 'anomaly.bucket_span.minutes'?: string | undefined; 'anomaly.start'?: string | number | undefined; 'error.message'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; 'monitor.id'?: string | undefined; 'monitor.name'?: string | undefined; 'monitor.type'?: string | undefined; 'observer.geo.name'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.x509.issuer.common_name'?: string | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.subject.common_name'?: string | undefined; 'url.full'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ '@timestamp': string | number; 'kibana.alert.ancestors': { depth: string | number; id: string; index: string; type: string; }[]; 'kibana.alert.depth': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.original_event.action': string; 'kibana.alert.original_event.category': string[]; 'kibana.alert.original_event.created': string | number; 'kibana.alert.original_event.dataset': string; 'kibana.alert.original_event.id': string; 'kibana.alert.original_event.ingested': string | number; 'kibana.alert.original_event.kind': string; 'kibana.alert.original_event.module': string; 'kibana.alert.original_event.original': string; 'kibana.alert.original_event.outcome': string; 'kibana.alert.original_event.provider': string; 'kibana.alert.original_event.sequence': string | number; 'kibana.alert.original_event.type': string[]; 'kibana.alert.original_time': string | number; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.false_positives': string[]; 'kibana.alert.rule.max_signals': (string | number)[]; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.threat.framework': string; 'kibana.alert.rule.threat.tactic.id': string; 'kibana.alert.rule.threat.tactic.name': string; 'kibana.alert.rule.threat.tactic.reference': string; 'kibana.alert.rule.threat.technique.id': string; 'kibana.alert.rule.threat.technique.name': string; 'kibana.alert.rule.threat.technique.reference': string; 'kibana.alert.rule.threat.technique.subtechnique.id': string; 'kibana.alert.rule.threat.technique.subtechnique.name': string; 'kibana.alert.rule.threat.technique.subtechnique.reference': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'ecs.version'?: string | undefined; 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'host.asset.criticality'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.ancestors.rule'?: string | undefined; 'kibana.alert.building_block_type'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.group.id'?: string | undefined; 'kibana.alert.group.index'?: number | undefined; 'kibana.alert.host.criticality_level'?: string | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.new_terms'?: string[] | undefined; 'kibana.alert.original_event.agent_id_status'?: string | undefined; 'kibana.alert.original_event.code'?: string | undefined; 'kibana.alert.original_event.duration'?: string | undefined; 'kibana.alert.original_event.end'?: string | number | undefined; 'kibana.alert.original_event.hash'?: string | undefined; 'kibana.alert.original_event.reason'?: string | undefined; 'kibana.alert.original_event.reference'?: string | undefined; 'kibana.alert.original_event.risk_score'?: number | undefined; 'kibana.alert.original_event.risk_score_norm'?: number | undefined; 'kibana.alert.original_event.severity'?: string | number | undefined; 'kibana.alert.original_event.start'?: string | number | undefined; 'kibana.alert.original_event.timezone'?: string | undefined; 'kibana.alert.original_event.url'?: string | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.building_block_type'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.immutable'?: string[] | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.rule.timeline_id'?: string[] | undefined; 'kibana.alert.rule.timeline_title'?: string[] | undefined; 'kibana.alert.rule.timestamp_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.threshold_result.cardinality'?: unknown; 'kibana.alert.threshold_result.count'?: string | number | undefined; 'kibana.alert.threshold_result.from'?: string | number | undefined; 'kibana.alert.threshold_result.terms'?: { field?: string | undefined; value?: string | undefined; }[] | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.user.criticality_level'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.alert.workflow_user'?: string | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; 'user.asset.criticality'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & { '@timestamp': string | number; 'ecs.version': string; } & { 'agent.build.original'?: string | undefined; 'agent.ephemeral_id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'agent.type'?: string | undefined; 'agent.version'?: string | undefined; 'client.address'?: string | undefined; 'client.as.number'?: string | number | undefined; 'client.as.organization.name'?: string | undefined; 'client.bytes'?: string | number | undefined; 'client.domain'?: string | undefined; 'client.geo.city_name'?: string | undefined; 'client.geo.continent_code'?: string | undefined; 'client.geo.continent_name'?: string | undefined; 'client.geo.country_iso_code'?: string | undefined; 'client.geo.country_name'?: string | undefined; 'client.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'client.geo.name'?: string | undefined; 'client.geo.postal_code'?: string | undefined; 'client.geo.region_iso_code'?: string | undefined; 'client.geo.region_name'?: string | undefined; 'client.geo.timezone'?: string | undefined; 'client.ip'?: string | undefined; 'client.mac'?: string | undefined; 'client.nat.ip'?: string | undefined; 'client.nat.port'?: string | number | undefined; 'client.packets'?: string | number | undefined; 'client.port'?: string | number | undefined; 'client.registered_domain'?: string | undefined; 'client.subdomain'?: string | undefined; 'client.top_level_domain'?: string | undefined; 'client.user.domain'?: string | undefined; 'client.user.email'?: string | undefined; 'client.user.full_name'?: string | undefined; 'client.user.group.domain'?: string | undefined; 'client.user.group.id'?: string | undefined; 'client.user.group.name'?: string | undefined; 'client.user.hash'?: string | undefined; 'client.user.id'?: string | undefined; 'client.user.name'?: string | undefined; 'client.user.roles'?: string[] | undefined; 'cloud.account.id'?: string | undefined; 'cloud.account.name'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'cloud.instance.name'?: string | undefined; 'cloud.machine.type'?: string | undefined; 'cloud.origin.account.id'?: string | undefined; 'cloud.origin.account.name'?: string | undefined; 'cloud.origin.availability_zone'?: string | undefined; 'cloud.origin.instance.id'?: string | undefined; 'cloud.origin.instance.name'?: string | undefined; 'cloud.origin.machine.type'?: string | undefined; 'cloud.origin.project.id'?: string | undefined; 'cloud.origin.project.name'?: string | undefined; 'cloud.origin.provider'?: string | undefined; 'cloud.origin.region'?: string | undefined; 'cloud.origin.service.name'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.project.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.service.name'?: string | undefined; 'cloud.target.account.id'?: string | undefined; 'cloud.target.account.name'?: string | undefined; 'cloud.target.availability_zone'?: string | undefined; 'cloud.target.instance.id'?: string | undefined; 'cloud.target.instance.name'?: string | undefined; 'cloud.target.machine.type'?: string | undefined; 'cloud.target.project.id'?: string | undefined; 'cloud.target.project.name'?: string | undefined; 'cloud.target.provider'?: string | undefined; 'cloud.target.region'?: string | undefined; 'cloud.target.service.name'?: string | undefined; 'container.cpu.usage'?: string | number | undefined; 'container.disk.read.bytes'?: string | number | undefined; 'container.disk.write.bytes'?: string | number | undefined; 'container.id'?: string | undefined; 'container.image.hash.all'?: string[] | undefined; 'container.image.name'?: string | undefined; 'container.image.tag'?: string[] | undefined; 'container.labels'?: unknown; 'container.memory.usage'?: string | number | undefined; 'container.name'?: string | undefined; 'container.network.egress.bytes'?: string | number | undefined; 'container.network.ingress.bytes'?: string | number | undefined; 'container.runtime'?: string | undefined; 'container.security_context.privileged'?: boolean | undefined; 'destination.address'?: string | undefined; 'destination.as.number'?: string | number | undefined; 'destination.as.organization.name'?: string | undefined; 'destination.bytes'?: string | number | undefined; 'destination.domain'?: string | undefined; 'destination.geo.city_name'?: string | undefined; 'destination.geo.continent_code'?: string | undefined; 'destination.geo.continent_name'?: string | undefined; 'destination.geo.country_iso_code'?: string | undefined; 'destination.geo.country_name'?: string | undefined; 'destination.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'destination.geo.name'?: string | undefined; 'destination.geo.postal_code'?: string | undefined; 'destination.geo.region_iso_code'?: string | undefined; 'destination.geo.region_name'?: string | undefined; 'destination.geo.timezone'?: string | undefined; 'destination.ip'?: string | undefined; 'destination.mac'?: string | undefined; 'destination.nat.ip'?: string | undefined; 'destination.nat.port'?: string | number | undefined; 'destination.packets'?: string | number | undefined; 'destination.port'?: string | number | undefined; 'destination.registered_domain'?: string | undefined; 'destination.subdomain'?: string | undefined; 'destination.top_level_domain'?: string | undefined; 'destination.user.domain'?: string | undefined; 'destination.user.email'?: string | undefined; 'destination.user.full_name'?: string | undefined; 'destination.user.group.domain'?: string | undefined; 'destination.user.group.id'?: string | undefined; 'destination.user.group.name'?: string | undefined; 'destination.user.hash'?: string | undefined; 'destination.user.id'?: string | undefined; 'destination.user.name'?: string | undefined; 'destination.user.roles'?: string[] | undefined; 'device.id'?: string | undefined; 'device.manufacturer'?: string | undefined; 'device.model.identifier'?: string | undefined; 'device.model.name'?: string | undefined; 'dll.code_signature.digest_algorithm'?: string | undefined; 'dll.code_signature.exists'?: boolean | undefined; 'dll.code_signature.signing_id'?: string | undefined; 'dll.code_signature.status'?: string | undefined; 'dll.code_signature.subject_name'?: string | undefined; 'dll.code_signature.team_id'?: string | undefined; 'dll.code_signature.timestamp'?: string | number | undefined; 'dll.code_signature.trusted'?: boolean | undefined; 'dll.code_signature.valid'?: boolean | undefined; 'dll.hash.md5'?: string | undefined; 'dll.hash.sha1'?: string | undefined; 'dll.hash.sha256'?: string | undefined; 'dll.hash.sha384'?: string | undefined; 'dll.hash.sha512'?: string | undefined; 'dll.hash.ssdeep'?: string | undefined; 'dll.hash.tlsh'?: string | undefined; 'dll.name'?: string | undefined; 'dll.path'?: string | undefined; 'dll.pe.architecture'?: string | undefined; 'dll.pe.company'?: string | undefined; 'dll.pe.description'?: string | undefined; 'dll.pe.file_version'?: string | undefined; 'dll.pe.go_import_hash'?: string | undefined; 'dll.pe.go_imports'?: unknown; 'dll.pe.go_imports_names_entropy'?: string | number | undefined; 'dll.pe.go_imports_names_var_entropy'?: string | number | undefined; 'dll.pe.go_stripped'?: boolean | undefined; 'dll.pe.imphash'?: string | undefined; 'dll.pe.import_hash'?: string | undefined; 'dll.pe.imports'?: unknown[] | undefined; 'dll.pe.imports_names_entropy'?: string | number | undefined; 'dll.pe.imports_names_var_entropy'?: string | number | undefined; 'dll.pe.original_file_name'?: string | undefined; 'dll.pe.pehash'?: string | undefined; 'dll.pe.product'?: string | undefined; 'dll.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'dns.answers'?: { class?: string | undefined; data?: string | undefined; name?: string | undefined; ttl?: string | number | undefined; type?: string | undefined; }[] | undefined; 'dns.header_flags'?: string[] | undefined; 'dns.id'?: string | undefined; 'dns.op_code'?: string | undefined; 'dns.question.class'?: string | undefined; 'dns.question.name'?: string | undefined; 'dns.question.registered_domain'?: string | undefined; 'dns.question.subdomain'?: string | undefined; 'dns.question.top_level_domain'?: string | undefined; 'dns.question.type'?: string | undefined; 'dns.resolved_ip'?: string[] | undefined; 'dns.response_code'?: string | undefined; 'dns.type'?: string | undefined; 'email.attachments'?: { 'file.extension'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.name'?: string | undefined; 'file.size'?: string | number | undefined; }[] | undefined; 'email.bcc.address'?: string[] | undefined; 'email.cc.address'?: string[] | undefined; 'email.content_type'?: string | undefined; 'email.delivery_timestamp'?: string | number | undefined; 'email.direction'?: string | undefined; 'email.from.address'?: string[] | undefined; 'email.local_id'?: string | undefined; 'email.message_id'?: string | undefined; 'email.origination_timestamp'?: string | number | undefined; 'email.reply_to.address'?: string[] | undefined; 'email.sender.address'?: string | undefined; 'email.subject'?: string | undefined; 'email.to.address'?: string[] | undefined; 'email.x_mailer'?: string | undefined; 'error.code'?: string | undefined; 'error.id'?: string | undefined; 'error.message'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.type'?: string | undefined; 'event.action'?: string | undefined; 'event.agent_id_status'?: string | undefined; 'event.category'?: string[] | undefined; 'event.code'?: string | undefined; 'event.created'?: string | number | undefined; 'event.dataset'?: string | undefined; 'event.duration'?: string | number | undefined; 'event.end'?: string | number | undefined; 'event.hash'?: string | undefined; 'event.id'?: string | undefined; 'event.ingested'?: string | number | undefined; 'event.kind'?: string | undefined; 'event.module'?: string | undefined; 'event.original'?: string | undefined; 'event.outcome'?: string | undefined; 'event.provider'?: string | undefined; 'event.reason'?: string | undefined; 'event.reference'?: string | undefined; 'event.risk_score'?: number | undefined; 'event.risk_score_norm'?: number | undefined; 'event.sequence'?: string | number | undefined; 'event.severity'?: string | number | undefined; 'event.start'?: string | number | undefined; 'event.timezone'?: string | undefined; 'event.type'?: string[] | undefined; 'event.url'?: string | undefined; 'faas.coldstart'?: boolean | undefined; 'faas.execution'?: string | undefined; 'faas.id'?: string | undefined; 'faas.name'?: string | undefined; 'faas.version'?: string | undefined; 'file.accessed'?: string | number | undefined; 'file.attributes'?: string[] | undefined; 'file.code_signature.digest_algorithm'?: string | undefined; 'file.code_signature.exists'?: boolean | undefined; 'file.code_signature.signing_id'?: string | undefined; 'file.code_signature.status'?: string | undefined; 'file.code_signature.subject_name'?: string | undefined; 'file.code_signature.team_id'?: string | undefined; 'file.code_signature.timestamp'?: string | number | undefined; 'file.code_signature.trusted'?: boolean | undefined; 'file.code_signature.valid'?: boolean | undefined; 'file.created'?: string | number | undefined; 'file.ctime'?: string | number | undefined; 'file.device'?: string | undefined; 'file.directory'?: string | undefined; 'file.drive_letter'?: string | undefined; 'file.elf.architecture'?: string | undefined; 'file.elf.byte_order'?: string | undefined; 'file.elf.cpu_type'?: string | undefined; 'file.elf.creation_date'?: string | number | undefined; 'file.elf.exports'?: unknown[] | undefined; 'file.elf.go_import_hash'?: string | undefined; 'file.elf.go_imports'?: unknown; 'file.elf.go_imports_names_entropy'?: string | number | undefined; 'file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'file.elf.go_stripped'?: boolean | undefined; 'file.elf.header.abi_version'?: string | undefined; 'file.elf.header.class'?: string | undefined; 'file.elf.header.data'?: string | undefined; 'file.elf.header.entrypoint'?: string | number | undefined; 'file.elf.header.object_version'?: string | undefined; 'file.elf.header.os_abi'?: string | undefined; 'file.elf.header.type'?: string | undefined; 'file.elf.header.version'?: string | undefined; 'file.elf.import_hash'?: string | undefined; 'file.elf.imports'?: unknown[] | undefined; 'file.elf.imports_names_entropy'?: string | number | undefined; 'file.elf.imports_names_var_entropy'?: string | number | undefined; 'file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'file.elf.shared_libraries'?: string[] | undefined; 'file.elf.telfhash'?: string | undefined; 'file.extension'?: string | undefined; 'file.fork_name'?: string | undefined; 'file.gid'?: string | undefined; 'file.group'?: string | undefined; 'file.hash.md5'?: string | undefined; 'file.hash.sha1'?: string | undefined; 'file.hash.sha256'?: string | undefined; 'file.hash.sha384'?: string | undefined; 'file.hash.sha512'?: string | undefined; 'file.hash.ssdeep'?: string | undefined; 'file.hash.tlsh'?: string | undefined; 'file.inode'?: string | undefined; 'file.macho.go_import_hash'?: string | undefined; 'file.macho.go_imports'?: unknown; 'file.macho.go_imports_names_entropy'?: string | number | undefined; 'file.macho.go_imports_names_var_entropy'?: string | number | undefined; 'file.macho.go_stripped'?: boolean | undefined; 'file.macho.import_hash'?: string | undefined; 'file.macho.imports'?: unknown[] | undefined; 'file.macho.imports_names_entropy'?: string | number | undefined; 'file.macho.imports_names_var_entropy'?: string | number | undefined; 'file.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.macho.symhash'?: string | undefined; 'file.mime_type'?: string | undefined; 'file.mode'?: string | undefined; 'file.mtime'?: string | number | undefined; 'file.name'?: string | undefined; 'file.owner'?: string | undefined; 'file.path'?: string | undefined; 'file.pe.architecture'?: string | undefined; 'file.pe.company'?: string | undefined; 'file.pe.description'?: string | undefined; 'file.pe.file_version'?: string | undefined; 'file.pe.go_import_hash'?: string | undefined; 'file.pe.go_imports'?: unknown; 'file.pe.go_imports_names_entropy'?: string | number | undefined; 'file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'file.pe.go_stripped'?: boolean | undefined; 'file.pe.imphash'?: string | undefined; 'file.pe.import_hash'?: string | undefined; 'file.pe.imports'?: unknown[] | undefined; 'file.pe.imports_names_entropy'?: string | number | undefined; 'file.pe.imports_names_var_entropy'?: string | number | undefined; 'file.pe.original_file_name'?: string | undefined; 'file.pe.pehash'?: string | undefined; 'file.pe.product'?: string | undefined; 'file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'file.size'?: string | number | undefined; 'file.target_path'?: string | undefined; 'file.type'?: string | undefined; 'file.uid'?: string | undefined; 'file.x509.alternative_names'?: string[] | undefined; 'file.x509.issuer.common_name'?: string[] | undefined; 'file.x509.issuer.country'?: string[] | undefined; 'file.x509.issuer.distinguished_name'?: string | undefined; 'file.x509.issuer.locality'?: string[] | undefined; 'file.x509.issuer.organization'?: string[] | undefined; 'file.x509.issuer.organizational_unit'?: string[] | undefined; 'file.x509.issuer.state_or_province'?: string[] | undefined; 'file.x509.not_after'?: string | number | undefined; 'file.x509.not_before'?: string | number | undefined; 'file.x509.public_key_algorithm'?: string | undefined; 'file.x509.public_key_curve'?: string | undefined; 'file.x509.public_key_exponent'?: string | number | undefined; 'file.x509.public_key_size'?: string | number | undefined; 'file.x509.serial_number'?: string | undefined; 'file.x509.signature_algorithm'?: string | undefined; 'file.x509.subject.common_name'?: string[] | undefined; 'file.x509.subject.country'?: string[] | undefined; 'file.x509.subject.distinguished_name'?: string | undefined; 'file.x509.subject.locality'?: string[] | undefined; 'file.x509.subject.organization'?: string[] | undefined; 'file.x509.subject.organizational_unit'?: string[] | undefined; 'file.x509.subject.state_or_province'?: string[] | undefined; 'file.x509.version_number'?: string | undefined; 'group.domain'?: string | undefined; 'group.id'?: string | undefined; 'group.name'?: string | undefined; 'host.architecture'?: string | undefined; 'host.boot.id'?: string | undefined; 'host.cpu.usage'?: string | number | undefined; 'host.disk.read.bytes'?: string | number | undefined; 'host.disk.write.bytes'?: string | number | undefined; 'host.domain'?: string | undefined; 'host.geo.city_name'?: string | undefined; 'host.geo.continent_code'?: string | undefined; 'host.geo.continent_name'?: string | undefined; 'host.geo.country_iso_code'?: string | undefined; 'host.geo.country_name'?: string | undefined; 'host.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'host.geo.name'?: string | undefined; 'host.geo.postal_code'?: string | undefined; 'host.geo.region_iso_code'?: string | undefined; 'host.geo.region_name'?: string | undefined; 'host.geo.timezone'?: string | undefined; 'host.hostname'?: string | undefined; 'host.id'?: string | undefined; 'host.ip'?: string[] | undefined; 'host.mac'?: string[] | undefined; 'host.name'?: string | undefined; 'host.network.egress.bytes'?: string | number | undefined; 'host.network.egress.packets'?: string | number | undefined; 'host.network.ingress.bytes'?: string | number | undefined; 'host.network.ingress.packets'?: string | number | undefined; 'host.os.family'?: string | undefined; 'host.os.full'?: string | undefined; 'host.os.kernel'?: string | undefined; 'host.os.name'?: string | undefined; 'host.os.platform'?: string | undefined; 'host.os.type'?: string | undefined; 'host.os.version'?: string | undefined; 'host.pid_ns_ino'?: string | undefined; 'host.risk.calculated_level'?: string | undefined; 'host.risk.calculated_score'?: number | undefined; 'host.risk.calculated_score_norm'?: number | undefined; 'host.risk.static_level'?: string | undefined; 'host.risk.static_score'?: number | undefined; 'host.risk.static_score_norm'?: number | undefined; 'host.type'?: string | undefined; 'host.uptime'?: string | number | undefined; 'http.request.body.bytes'?: string | number | undefined; 'http.request.body.content'?: string | undefined; 'http.request.bytes'?: string | number | undefined; 'http.request.id'?: string | undefined; 'http.request.method'?: string | undefined; 'http.request.mime_type'?: string | undefined; 'http.request.referrer'?: string | undefined; 'http.response.body.bytes'?: string | number | undefined; 'http.response.body.content'?: string | undefined; 'http.response.bytes'?: string | number | undefined; 'http.response.mime_type'?: string | undefined; 'http.response.status_code'?: string | number | undefined; 'http.version'?: string | undefined; labels?: unknown; 'log.file.path'?: string | undefined; 'log.level'?: string | undefined; 'log.logger'?: string | undefined; 'log.origin.file.line'?: string | number | undefined; 'log.origin.file.name'?: string | undefined; 'log.origin.function'?: string | undefined; 'log.syslog'?: unknown; message?: string | undefined; 'network.application'?: string | undefined; 'network.bytes'?: string | number | undefined; 'network.community_id'?: string | undefined; 'network.direction'?: string | undefined; 'network.forwarded_ip'?: string | undefined; 'network.iana_number'?: string | undefined; 'network.inner'?: unknown; 'network.name'?: string | undefined; 'network.packets'?: string | number | undefined; 'network.protocol'?: string | undefined; 'network.transport'?: string | undefined; 'network.type'?: string | undefined; 'network.vlan.id'?: string | undefined; 'network.vlan.name'?: string | undefined; 'observer.egress'?: unknown; 'observer.geo.city_name'?: string | undefined; 'observer.geo.continent_code'?: string | undefined; 'observer.geo.continent_name'?: string | undefined; 'observer.geo.country_iso_code'?: string | undefined; 'observer.geo.country_name'?: string | undefined; 'observer.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'observer.geo.name'?: string | undefined; 'observer.geo.postal_code'?: string | undefined; 'observer.geo.region_iso_code'?: string | undefined; 'observer.geo.region_name'?: string | undefined; 'observer.geo.timezone'?: string | undefined; 'observer.hostname'?: string | undefined; 'observer.ingress'?: unknown; 'observer.ip'?: string[] | undefined; 'observer.mac'?: string[] | undefined; 'observer.name'?: string | undefined; 'observer.os.family'?: string | undefined; 'observer.os.full'?: string | undefined; 'observer.os.kernel'?: string | undefined; 'observer.os.name'?: string | undefined; 'observer.os.platform'?: string | undefined; 'observer.os.type'?: string | undefined; 'observer.os.version'?: string | undefined; 'observer.product'?: string | undefined; 'observer.serial_number'?: string | undefined; 'observer.type'?: string | undefined; 'observer.vendor'?: string | undefined; 'observer.version'?: string | undefined; 'orchestrator.api_version'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.url'?: string | undefined; 'orchestrator.cluster.version'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'orchestrator.organization'?: string | undefined; 'orchestrator.resource.annotation'?: string[] | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.resource.ip'?: string[] | undefined; 'orchestrator.resource.label'?: string[] | undefined; 'orchestrator.resource.name'?: string | undefined; 'orchestrator.resource.parent.type'?: string | undefined; 'orchestrator.resource.type'?: string | undefined; 'orchestrator.type'?: string | undefined; 'organization.id'?: string | undefined; 'organization.name'?: string | undefined; 'package.architecture'?: string | undefined; 'package.build_version'?: string | undefined; 'package.checksum'?: string | undefined; 'package.description'?: string | undefined; 'package.install_scope'?: string | undefined; 'package.installed'?: string | number | undefined; 'package.license'?: string | undefined; 'package.name'?: string | undefined; 'package.path'?: string | undefined; 'package.reference'?: string | undefined; 'package.size'?: string | number | undefined; 'package.type'?: string | undefined; 'package.version'?: string | undefined; 'process.args'?: string[] | undefined; 'process.args_count'?: string | number | undefined; 'process.code_signature.digest_algorithm'?: string | undefined; 'process.code_signature.exists'?: boolean | undefined; 'process.code_signature.signing_id'?: string | undefined; 'process.code_signature.status'?: string | undefined; 'process.code_signature.subject_name'?: string | undefined; 'process.code_signature.team_id'?: string | undefined; 'process.code_signature.timestamp'?: string | number | undefined; 'process.code_signature.trusted'?: boolean | undefined; 'process.code_signature.valid'?: boolean | undefined; 'process.command_line'?: string | undefined; 'process.elf.architecture'?: string | undefined; 'process.elf.byte_order'?: string | undefined; 'process.elf.cpu_type'?: string | undefined; 'process.elf.creation_date'?: string | number | undefined; 'process.elf.exports'?: unknown[] | undefined; 'process.elf.go_import_hash'?: string | undefined; 'process.elf.go_imports'?: unknown; 'process.elf.go_imports_names_entropy'?: string | number | undefined; 'process.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.elf.go_stripped'?: boolean | undefined; 'process.elf.header.abi_version'?: string | undefined; 'process.elf.header.class'?: string | undefined; 'process.elf.header.data'?: string | undefined; 'process.elf.header.entrypoint'?: string | number | undefined; 'process.elf.header.object_version'?: string | undefined; 'process.elf.header.os_abi'?: string | undefined; 'process.elf.header.type'?: string | undefined; 'process.elf.header.version'?: string | undefined; 'process.elf.import_hash'?: string | undefined; 'process.elf.imports'?: unknown[] | undefined; 'process.elf.imports_names_entropy'?: string | number | undefined; 'process.elf.imports_names_var_entropy'?: string | number | undefined; 'process.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.elf.shared_libraries'?: string[] | undefined; 'process.elf.telfhash'?: string | undefined; 'process.end'?: string | number | undefined; 'process.entity_id'?: string | undefined; 'process.entry_leader.args'?: string[] | undefined; 'process.entry_leader.args_count'?: string | number | undefined; 'process.entry_leader.attested_groups.name'?: string | undefined; 'process.entry_leader.attested_user.id'?: string | undefined; 'process.entry_leader.attested_user.name'?: string | undefined; 'process.entry_leader.command_line'?: string | undefined; 'process.entry_leader.entity_id'?: string | undefined; 'process.entry_leader.entry_meta.source.ip'?: string | undefined; 'process.entry_leader.entry_meta.type'?: string | undefined; 'process.entry_leader.executable'?: string | undefined; 'process.entry_leader.group.id'?: string | undefined; 'process.entry_leader.group.name'?: string | undefined; 'process.entry_leader.interactive'?: boolean | undefined; 'process.entry_leader.name'?: string | undefined; 'process.entry_leader.parent.entity_id'?: string | undefined; 'process.entry_leader.parent.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.entity_id'?: string | undefined; 'process.entry_leader.parent.session_leader.pid'?: string | number | undefined; 'process.entry_leader.parent.session_leader.start'?: string | number | undefined; 'process.entry_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.entry_leader.parent.start'?: string | number | undefined; 'process.entry_leader.parent.vpid'?: string | number | undefined; 'process.entry_leader.pid'?: string | number | undefined; 'process.entry_leader.real_group.id'?: string | undefined; 'process.entry_leader.real_group.name'?: string | undefined; 'process.entry_leader.real_user.id'?: string | undefined; 'process.entry_leader.real_user.name'?: string | undefined; 'process.entry_leader.same_as_process'?: boolean | undefined; 'process.entry_leader.saved_group.id'?: string | undefined; 'process.entry_leader.saved_group.name'?: string | undefined; 'process.entry_leader.saved_user.id'?: string | undefined; 'process.entry_leader.saved_user.name'?: string | undefined; 'process.entry_leader.start'?: string | number | undefined; 'process.entry_leader.supplemental_groups.id'?: string | undefined; 'process.entry_leader.supplemental_groups.name'?: string | undefined; 'process.entry_leader.tty'?: unknown; 'process.entry_leader.user.id'?: string | undefined; 'process.entry_leader.user.name'?: string | undefined; 'process.entry_leader.vpid'?: string | number | undefined; 'process.entry_leader.working_directory'?: string | undefined; 'process.env_vars'?: string[] | undefined; 'process.executable'?: string | undefined; 'process.exit_code'?: string | number | undefined; 'process.group_leader.args'?: string[] | undefined; 'process.group_leader.args_count'?: string | number | undefined; 'process.group_leader.command_line'?: string | undefined; 'process.group_leader.entity_id'?: string | undefined; 'process.group_leader.executable'?: string | undefined; 'process.group_leader.group.id'?: string | undefined; 'process.group_leader.group.name'?: string | undefined; 'process.group_leader.interactive'?: boolean | undefined; 'process.group_leader.name'?: string | undefined; 'process.group_leader.pid'?: string | number | undefined; 'process.group_leader.real_group.id'?: string | undefined; 'process.group_leader.real_group.name'?: string | undefined; 'process.group_leader.real_user.id'?: string | undefined; 'process.group_leader.real_user.name'?: string | undefined; 'process.group_leader.same_as_process'?: boolean | undefined; 'process.group_leader.saved_group.id'?: string | undefined; 'process.group_leader.saved_group.name'?: string | undefined; 'process.group_leader.saved_user.id'?: string | undefined; 'process.group_leader.saved_user.name'?: string | undefined; 'process.group_leader.start'?: string | number | undefined; 'process.group_leader.supplemental_groups.id'?: string | undefined; 'process.group_leader.supplemental_groups.name'?: string | undefined; 'process.group_leader.tty'?: unknown; 'process.group_leader.user.id'?: string | undefined; 'process.group_leader.user.name'?: string | undefined; 'process.group_leader.vpid'?: string | number | undefined; 'process.group_leader.working_directory'?: string | undefined; 'process.hash.md5'?: string | undefined; 'process.hash.sha1'?: string | undefined; 'process.hash.sha256'?: string | undefined; 'process.hash.sha384'?: string | undefined; 'process.hash.sha512'?: string | undefined; 'process.hash.ssdeep'?: string | undefined; 'process.hash.tlsh'?: string | undefined; 'process.interactive'?: boolean | undefined; 'process.io'?: unknown; 'process.macho.go_import_hash'?: string | undefined; 'process.macho.go_imports'?: unknown; 'process.macho.go_imports_names_entropy'?: string | number | undefined; 'process.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.macho.go_stripped'?: boolean | undefined; 'process.macho.import_hash'?: string | undefined; 'process.macho.imports'?: unknown[] | undefined; 'process.macho.imports_names_entropy'?: string | number | undefined; 'process.macho.imports_names_var_entropy'?: string | number | undefined; 'process.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.macho.symhash'?: string | undefined; 'process.name'?: string | undefined; 'process.parent.args'?: string[] | undefined; 'process.parent.args_count'?: string | number | undefined; 'process.parent.code_signature.digest_algorithm'?: string | undefined; 'process.parent.code_signature.exists'?: boolean | undefined; 'process.parent.code_signature.signing_id'?: string | undefined; 'process.parent.code_signature.status'?: string | undefined; 'process.parent.code_signature.subject_name'?: string | undefined; 'process.parent.code_signature.team_id'?: string | undefined; 'process.parent.code_signature.timestamp'?: string | number | undefined; 'process.parent.code_signature.trusted'?: boolean | undefined; 'process.parent.code_signature.valid'?: boolean | undefined; 'process.parent.command_line'?: string | undefined; 'process.parent.elf.architecture'?: string | undefined; 'process.parent.elf.byte_order'?: string | undefined; 'process.parent.elf.cpu_type'?: string | undefined; 'process.parent.elf.creation_date'?: string | number | undefined; 'process.parent.elf.exports'?: unknown[] | undefined; 'process.parent.elf.go_import_hash'?: string | undefined; 'process.parent.elf.go_imports'?: unknown; 'process.parent.elf.go_imports_names_entropy'?: string | number | undefined; 'process.parent.elf.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.go_stripped'?: boolean | undefined; 'process.parent.elf.header.abi_version'?: string | undefined; 'process.parent.elf.header.class'?: string | undefined; 'process.parent.elf.header.data'?: string | undefined; 'process.parent.elf.header.entrypoint'?: string | number | undefined; 'process.parent.elf.header.object_version'?: string | undefined; 'process.parent.elf.header.os_abi'?: string | undefined; 'process.parent.elf.header.type'?: string | undefined; 'process.parent.elf.header.version'?: string | undefined; 'process.parent.elf.import_hash'?: string | undefined; 'process.parent.elf.imports'?: unknown[] | undefined; 'process.parent.elf.imports_names_entropy'?: string | number | undefined; 'process.parent.elf.imports_names_var_entropy'?: string | number | undefined; 'process.parent.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'process.parent.elf.shared_libraries'?: string[] | undefined; 'process.parent.elf.telfhash'?: string | undefined; 'process.parent.end'?: string | number | undefined; 'process.parent.entity_id'?: string | undefined; 'process.parent.executable'?: string | undefined; 'process.parent.exit_code'?: string | number | undefined; 'process.parent.group.id'?: string | undefined; 'process.parent.group.name'?: string | undefined; 'process.parent.group_leader.entity_id'?: string | undefined; 'process.parent.group_leader.pid'?: string | number | undefined; 'process.parent.group_leader.start'?: string | number | undefined; 'process.parent.group_leader.vpid'?: string | number | undefined; 'process.parent.hash.md5'?: string | undefined; 'process.parent.hash.sha1'?: string | undefined; 'process.parent.hash.sha256'?: string | undefined; 'process.parent.hash.sha384'?: string | undefined; 'process.parent.hash.sha512'?: string | undefined; 'process.parent.hash.ssdeep'?: string | undefined; 'process.parent.hash.tlsh'?: string | undefined; 'process.parent.interactive'?: boolean | undefined; 'process.parent.macho.go_import_hash'?: string | undefined; 'process.parent.macho.go_imports'?: unknown; 'process.parent.macho.go_imports_names_entropy'?: string | number | undefined; 'process.parent.macho.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.go_stripped'?: boolean | undefined; 'process.parent.macho.import_hash'?: string | undefined; 'process.parent.macho.imports'?: unknown[] | undefined; 'process.parent.macho.imports_names_entropy'?: string | number | undefined; 'process.parent.macho.imports_names_var_entropy'?: string | number | undefined; 'process.parent.macho.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.macho.symhash'?: string | undefined; 'process.parent.name'?: string | undefined; 'process.parent.pe.architecture'?: string | undefined; 'process.parent.pe.company'?: string | undefined; 'process.parent.pe.description'?: string | undefined; 'process.parent.pe.file_version'?: string | undefined; 'process.parent.pe.go_import_hash'?: string | undefined; 'process.parent.pe.go_imports'?: unknown; 'process.parent.pe.go_imports_names_entropy'?: string | number | undefined; 'process.parent.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.go_stripped'?: boolean | undefined; 'process.parent.pe.imphash'?: string | undefined; 'process.parent.pe.import_hash'?: string | undefined; 'process.parent.pe.imports'?: unknown[] | undefined; 'process.parent.pe.imports_names_entropy'?: string | number | undefined; 'process.parent.pe.imports_names_var_entropy'?: string | number | undefined; 'process.parent.pe.original_file_name'?: string | undefined; 'process.parent.pe.pehash'?: string | undefined; 'process.parent.pe.product'?: string | undefined; 'process.parent.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.parent.pgid'?: string | number | undefined; 'process.parent.pid'?: string | number | undefined; 'process.parent.real_group.id'?: string | undefined; 'process.parent.real_group.name'?: string | undefined; 'process.parent.real_user.id'?: string | undefined; 'process.parent.real_user.name'?: string | undefined; 'process.parent.saved_group.id'?: string | undefined; 'process.parent.saved_group.name'?: string | undefined; 'process.parent.saved_user.id'?: string | undefined; 'process.parent.saved_user.name'?: string | undefined; 'process.parent.start'?: string | number | undefined; 'process.parent.supplemental_groups.id'?: string | undefined; 'process.parent.supplemental_groups.name'?: string | undefined; 'process.parent.thread.capabilities.effective'?: string[] | undefined; 'process.parent.thread.capabilities.permitted'?: string[] | undefined; 'process.parent.thread.id'?: string | number | undefined; 'process.parent.thread.name'?: string | undefined; 'process.parent.title'?: string | undefined; 'process.parent.tty'?: unknown; 'process.parent.uptime'?: string | number | undefined; 'process.parent.user.id'?: string | undefined; 'process.parent.user.name'?: string | undefined; 'process.parent.vpid'?: string | number | undefined; 'process.parent.working_directory'?: string | undefined; 'process.pe.architecture'?: string | undefined; 'process.pe.company'?: string | undefined; 'process.pe.description'?: string | undefined; 'process.pe.file_version'?: string | undefined; 'process.pe.go_import_hash'?: string | undefined; 'process.pe.go_imports'?: unknown; 'process.pe.go_imports_names_entropy'?: string | number | undefined; 'process.pe.go_imports_names_var_entropy'?: string | number | undefined; 'process.pe.go_stripped'?: boolean | undefined; 'process.pe.imphash'?: string | undefined; 'process.pe.import_hash'?: string | undefined; 'process.pe.imports'?: unknown[] | undefined; 'process.pe.imports_names_entropy'?: string | number | undefined; 'process.pe.imports_names_var_entropy'?: string | number | undefined; 'process.pe.original_file_name'?: string | undefined; 'process.pe.pehash'?: string | undefined; 'process.pe.product'?: string | undefined; 'process.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'process.pgid'?: string | number | undefined; 'process.pid'?: string | number | undefined; 'process.previous.args'?: string[] | undefined; 'process.previous.args_count'?: string | number | undefined; 'process.previous.executable'?: string | undefined; 'process.real_group.id'?: string | undefined; 'process.real_group.name'?: string | undefined; 'process.real_user.id'?: string | undefined; 'process.real_user.name'?: string | undefined; 'process.saved_group.id'?: string | undefined; 'process.saved_group.name'?: string | undefined; 'process.saved_user.id'?: string | undefined; 'process.saved_user.name'?: string | undefined; 'process.session_leader.args'?: string[] | undefined; 'process.session_leader.args_count'?: string | number | undefined; 'process.session_leader.command_line'?: string | undefined; 'process.session_leader.entity_id'?: string | undefined; 'process.session_leader.executable'?: string | undefined; 'process.session_leader.group.id'?: string | undefined; 'process.session_leader.group.name'?: string | undefined; 'process.session_leader.interactive'?: boolean | undefined; 'process.session_leader.name'?: string | undefined; 'process.session_leader.parent.entity_id'?: string | undefined; 'process.session_leader.parent.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.entity_id'?: string | undefined; 'process.session_leader.parent.session_leader.pid'?: string | number | undefined; 'process.session_leader.parent.session_leader.start'?: string | number | undefined; 'process.session_leader.parent.session_leader.vpid'?: string | number | undefined; 'process.session_leader.parent.start'?: string | number | undefined; 'process.session_leader.parent.vpid'?: string | number | undefined; 'process.session_leader.pid'?: string | number | undefined; 'process.session_leader.real_group.id'?: string | undefined; 'process.session_leader.real_group.name'?: string | undefined; 'process.session_leader.real_user.id'?: string | undefined; 'process.session_leader.real_user.name'?: string | undefined; 'process.session_leader.same_as_process'?: boolean | undefined; 'process.session_leader.saved_group.id'?: string | undefined; 'process.session_leader.saved_group.name'?: string | undefined; 'process.session_leader.saved_user.id'?: string | undefined; 'process.session_leader.saved_user.name'?: string | undefined; 'process.session_leader.start'?: string | number | undefined; 'process.session_leader.supplemental_groups.id'?: string | undefined; 'process.session_leader.supplemental_groups.name'?: string | undefined; 'process.session_leader.tty'?: unknown; 'process.session_leader.user.id'?: string | undefined; 'process.session_leader.user.name'?: string | undefined; 'process.session_leader.vpid'?: string | number | undefined; 'process.session_leader.working_directory'?: string | undefined; 'process.start'?: string | number | undefined; 'process.supplemental_groups.id'?: string | undefined; 'process.supplemental_groups.name'?: string | undefined; 'process.thread.capabilities.effective'?: string[] | undefined; 'process.thread.capabilities.permitted'?: string[] | undefined; 'process.thread.id'?: string | number | undefined; 'process.thread.name'?: string | undefined; 'process.title'?: string | undefined; 'process.tty'?: unknown; 'process.uptime'?: string | number | undefined; 'process.user.id'?: string | undefined; 'process.user.name'?: string | undefined; 'process.vpid'?: string | number | undefined; 'process.working_directory'?: string | undefined; 'registry.data.bytes'?: string | undefined; 'registry.data.strings'?: string[] | undefined; 'registry.data.type'?: string | undefined; 'registry.hive'?: string | undefined; 'registry.key'?: string | undefined; 'registry.path'?: string | undefined; 'registry.value'?: string | undefined; 'related.hash'?: string[] | undefined; 'related.hosts'?: string[] | undefined; 'related.ip'?: string[] | undefined; 'related.user'?: string[] | undefined; 'rule.author'?: string[] | undefined; 'rule.category'?: string | undefined; 'rule.description'?: string | undefined; 'rule.id'?: string | undefined; 'rule.license'?: string | undefined; 'rule.name'?: string | undefined; 'rule.reference'?: string | undefined; 'rule.ruleset'?: string | undefined; 'rule.uuid'?: string | undefined; 'rule.version'?: string | undefined; 'server.address'?: string | undefined; 'server.as.number'?: string | number | undefined; 'server.as.organization.name'?: string | undefined; 'server.bytes'?: string | number | undefined; 'server.domain'?: string | undefined; 'server.geo.city_name'?: string | undefined; 'server.geo.continent_code'?: string | undefined; 'server.geo.continent_name'?: string | undefined; 'server.geo.country_iso_code'?: string | undefined; 'server.geo.country_name'?: string | undefined; 'server.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'server.geo.name'?: string | undefined; 'server.geo.postal_code'?: string | undefined; 'server.geo.region_iso_code'?: string | undefined; 'server.geo.region_name'?: string | undefined; 'server.geo.timezone'?: string | undefined; 'server.ip'?: string | undefined; 'server.mac'?: string | undefined; 'server.nat.ip'?: string | undefined; 'server.nat.port'?: string | number | undefined; 'server.packets'?: string | number | undefined; 'server.port'?: string | number | undefined; 'server.registered_domain'?: string | undefined; 'server.subdomain'?: string | undefined; 'server.top_level_domain'?: string | undefined; 'server.user.domain'?: string | undefined; 'server.user.email'?: string | undefined; 'server.user.full_name'?: string | undefined; 'server.user.group.domain'?: string | undefined; 'server.user.group.id'?: string | undefined; 'server.user.group.name'?: string | undefined; 'server.user.hash'?: string | undefined; 'server.user.id'?: string | undefined; 'server.user.name'?: string | undefined; 'server.user.roles'?: string[] | undefined; 'service.address'?: string | undefined; 'service.environment'?: string | undefined; 'service.ephemeral_id'?: string | undefined; 'service.id'?: string | undefined; 'service.name'?: string | undefined; 'service.node.name'?: string | undefined; 'service.node.role'?: string | undefined; 'service.node.roles'?: string[] | undefined; 'service.origin.address'?: string | undefined; 'service.origin.environment'?: string | undefined; 'service.origin.ephemeral_id'?: string | undefined; 'service.origin.id'?: string | undefined; 'service.origin.name'?: string | undefined; 'service.origin.node.name'?: string | undefined; 'service.origin.node.role'?: string | undefined; 'service.origin.node.roles'?: string[] | undefined; 'service.origin.state'?: string | undefined; 'service.origin.type'?: string | undefined; 'service.origin.version'?: string | undefined; 'service.state'?: string | undefined; 'service.target.address'?: string | undefined; 'service.target.environment'?: string | undefined; 'service.target.ephemeral_id'?: string | undefined; 'service.target.id'?: string | undefined; 'service.target.name'?: string | undefined; 'service.target.node.name'?: string | undefined; 'service.target.node.role'?: string | undefined; 'service.target.node.roles'?: string[] | undefined; 'service.target.state'?: string | undefined; 'service.target.type'?: string | undefined; 'service.target.version'?: string | undefined; 'service.type'?: string | undefined; 'service.version'?: string | undefined; 'source.address'?: string | undefined; 'source.as.number'?: string | number | undefined; 'source.as.organization.name'?: string | undefined; 'source.bytes'?: string | number | undefined; 'source.domain'?: string | undefined; 'source.geo.city_name'?: string | undefined; 'source.geo.continent_code'?: string | undefined; 'source.geo.continent_name'?: string | undefined; 'source.geo.country_iso_code'?: string | undefined; 'source.geo.country_name'?: string | undefined; 'source.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'source.geo.name'?: string | undefined; 'source.geo.postal_code'?: string | undefined; 'source.geo.region_iso_code'?: string | undefined; 'source.geo.region_name'?: string | undefined; 'source.geo.timezone'?: string | undefined; 'source.ip'?: string | undefined; 'source.mac'?: string | undefined; 'source.nat.ip'?: string | undefined; 'source.nat.port'?: string | number | undefined; 'source.packets'?: string | number | undefined; 'source.port'?: string | number | undefined; 'source.registered_domain'?: string | undefined; 'source.subdomain'?: string | undefined; 'source.top_level_domain'?: string | undefined; 'source.user.domain'?: string | undefined; 'source.user.email'?: string | undefined; 'source.user.full_name'?: string | undefined; 'source.user.group.domain'?: string | undefined; 'source.user.group.id'?: string | undefined; 'source.user.group.name'?: string | undefined; 'source.user.hash'?: string | undefined; 'source.user.id'?: string | undefined; 'source.user.name'?: string | undefined; 'source.user.roles'?: string[] | undefined; 'span.id'?: string | undefined; tags?: string[] | undefined; 'threat.enrichments'?: { indicator?: unknown; 'matched.atomic'?: string | undefined; 'matched.field'?: string | undefined; 'matched.id'?: string | undefined; 'matched.index'?: string | undefined; 'matched.occurred'?: string | number | undefined; 'matched.type'?: string | undefined; }[] | undefined; 'threat.feed.dashboard_id'?: string | undefined; 'threat.feed.description'?: string | undefined; 'threat.feed.name'?: string | undefined; 'threat.feed.reference'?: string | undefined; 'threat.framework'?: string | undefined; 'threat.group.alias'?: string[] | undefined; 'threat.group.id'?: string | undefined; 'threat.group.name'?: string | undefined; 'threat.group.reference'?: string | undefined; 'threat.indicator.as.number'?: string | number | undefined; 'threat.indicator.as.organization.name'?: string | undefined; 'threat.indicator.confidence'?: string | undefined; 'threat.indicator.description'?: string | undefined; 'threat.indicator.email.address'?: string | undefined; 'threat.indicator.file.accessed'?: string | number | undefined; 'threat.indicator.file.attributes'?: string[] | undefined; 'threat.indicator.file.code_signature.digest_algorithm'?: string | undefined; 'threat.indicator.file.code_signature.exists'?: boolean | undefined; 'threat.indicator.file.code_signature.signing_id'?: string | undefined; 'threat.indicator.file.code_signature.status'?: string | undefined; 'threat.indicator.file.code_signature.subject_name'?: string | undefined; 'threat.indicator.file.code_signature.team_id'?: string | undefined; 'threat.indicator.file.code_signature.timestamp'?: string | number | undefined; 'threat.indicator.file.code_signature.trusted'?: boolean | undefined; 'threat.indicator.file.code_signature.valid'?: boolean | undefined; 'threat.indicator.file.created'?: string | number | undefined; 'threat.indicator.file.ctime'?: string | number | undefined; 'threat.indicator.file.device'?: string | undefined; 'threat.indicator.file.directory'?: string | undefined; 'threat.indicator.file.drive_letter'?: string | undefined; 'threat.indicator.file.elf.architecture'?: string | undefined; 'threat.indicator.file.elf.byte_order'?: string | undefined; 'threat.indicator.file.elf.cpu_type'?: string | undefined; 'threat.indicator.file.elf.creation_date'?: string | number | undefined; 'threat.indicator.file.elf.exports'?: unknown[] | undefined; 'threat.indicator.file.elf.go_import_hash'?: string | undefined; 'threat.indicator.file.elf.go_imports'?: unknown; 'threat.indicator.file.elf.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.go_stripped'?: boolean | undefined; 'threat.indicator.file.elf.header.abi_version'?: string | undefined; 'threat.indicator.file.elf.header.class'?: string | undefined; 'threat.indicator.file.elf.header.data'?: string | undefined; 'threat.indicator.file.elf.header.entrypoint'?: string | number | undefined; 'threat.indicator.file.elf.header.object_version'?: string | undefined; 'threat.indicator.file.elf.header.os_abi'?: string | undefined; 'threat.indicator.file.elf.header.type'?: string | undefined; 'threat.indicator.file.elf.header.version'?: string | undefined; 'threat.indicator.file.elf.import_hash'?: string | undefined; 'threat.indicator.file.elf.imports'?: unknown[] | undefined; 'threat.indicator.file.elf.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.elf.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.elf.sections'?: { chi2?: string | number | undefined; entropy?: string | number | undefined; flags?: string | undefined; name?: string | undefined; physical_offset?: string | undefined; physical_size?: string | number | undefined; type?: string | undefined; var_entropy?: string | number | undefined; virtual_address?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.elf.segments'?: { sections?: string | undefined; type?: string | undefined; }[] | undefined; 'threat.indicator.file.elf.shared_libraries'?: string[] | undefined; 'threat.indicator.file.elf.telfhash'?: string | undefined; 'threat.indicator.file.extension'?: string | undefined; 'threat.indicator.file.fork_name'?: string | undefined; 'threat.indicator.file.gid'?: string | undefined; 'threat.indicator.file.group'?: string | undefined; 'threat.indicator.file.hash.md5'?: string | undefined; 'threat.indicator.file.hash.sha1'?: string | undefined; 'threat.indicator.file.hash.sha256'?: string | undefined; 'threat.indicator.file.hash.sha384'?: string | undefined; 'threat.indicator.file.hash.sha512'?: string | undefined; 'threat.indicator.file.hash.ssdeep'?: string | undefined; 'threat.indicator.file.hash.tlsh'?: string | undefined; 'threat.indicator.file.inode'?: string | undefined; 'threat.indicator.file.mime_type'?: string | undefined; 'threat.indicator.file.mode'?: string | undefined; 'threat.indicator.file.mtime'?: string | number | undefined; 'threat.indicator.file.name'?: string | undefined; 'threat.indicator.file.owner'?: string | undefined; 'threat.indicator.file.path'?: string | undefined; 'threat.indicator.file.pe.architecture'?: string | undefined; 'threat.indicator.file.pe.company'?: string | undefined; 'threat.indicator.file.pe.description'?: string | undefined; 'threat.indicator.file.pe.file_version'?: string | undefined; 'threat.indicator.file.pe.go_import_hash'?: string | undefined; 'threat.indicator.file.pe.go_imports'?: unknown; 'threat.indicator.file.pe.go_imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.go_stripped'?: boolean | undefined; 'threat.indicator.file.pe.imphash'?: string | undefined; 'threat.indicator.file.pe.import_hash'?: string | undefined; 'threat.indicator.file.pe.imports'?: unknown[] | undefined; 'threat.indicator.file.pe.imports_names_entropy'?: string | number | undefined; 'threat.indicator.file.pe.imports_names_var_entropy'?: string | number | undefined; 'threat.indicator.file.pe.original_file_name'?: string | undefined; 'threat.indicator.file.pe.pehash'?: string | undefined; 'threat.indicator.file.pe.product'?: string | undefined; 'threat.indicator.file.pe.sections'?: { entropy?: string | number | undefined; name?: string | undefined; physical_size?: string | number | undefined; var_entropy?: string | number | undefined; virtual_size?: string | number | undefined; }[] | undefined; 'threat.indicator.file.size'?: string | number | undefined; 'threat.indicator.file.target_path'?: string | undefined; 'threat.indicator.file.type'?: string | undefined; 'threat.indicator.file.uid'?: string | undefined; 'threat.indicator.file.x509.alternative_names'?: string[] | undefined; 'threat.indicator.file.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.file.x509.issuer.country'?: string[] | undefined; 'threat.indicator.file.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.file.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.not_after'?: string | number | undefined; 'threat.indicator.file.x509.not_before'?: string | number | undefined; 'threat.indicator.file.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.file.x509.public_key_curve'?: string | undefined; 'threat.indicator.file.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.file.x509.public_key_size'?: string | number | undefined; 'threat.indicator.file.x509.serial_number'?: string | undefined; 'threat.indicator.file.x509.signature_algorithm'?: string | undefined; 'threat.indicator.file.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.file.x509.subject.country'?: string[] | undefined; 'threat.indicator.file.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.file.x509.subject.locality'?: string[] | undefined; 'threat.indicator.file.x509.subject.organization'?: string[] | undefined; 'threat.indicator.file.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.file.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.file.x509.version_number'?: string | undefined; 'threat.indicator.first_seen'?: string | number | undefined; 'threat.indicator.geo.city_name'?: string | undefined; 'threat.indicator.geo.continent_code'?: string | undefined; 'threat.indicator.geo.continent_name'?: string | undefined; 'threat.indicator.geo.country_iso_code'?: string | undefined; 'threat.indicator.geo.country_name'?: string | undefined; 'threat.indicator.geo.location'?: string | { type: string; coordinates: number[]; } | { lat: number; lon: number; } | { location: number[]; } | { location: string; } | undefined; 'threat.indicator.geo.name'?: string | undefined; 'threat.indicator.geo.postal_code'?: string | undefined; 'threat.indicator.geo.region_iso_code'?: string | undefined; 'threat.indicator.geo.region_name'?: string | undefined; 'threat.indicator.geo.timezone'?: string | undefined; 'threat.indicator.ip'?: string | undefined; 'threat.indicator.last_seen'?: string | number | undefined; 'threat.indicator.marking.tlp'?: string | undefined; 'threat.indicator.marking.tlp_version'?: string | undefined; 'threat.indicator.modified_at'?: string | number | undefined; 'threat.indicator.name'?: string | undefined; 'threat.indicator.port'?: string | number | undefined; 'threat.indicator.provider'?: string | undefined; 'threat.indicator.reference'?: string | undefined; 'threat.indicator.registry.data.bytes'?: string | undefined; 'threat.indicator.registry.data.strings'?: string[] | undefined; 'threat.indicator.registry.data.type'?: string | undefined; 'threat.indicator.registry.hive'?: string | undefined; 'threat.indicator.registry.key'?: string | undefined; 'threat.indicator.registry.path'?: string | undefined; 'threat.indicator.registry.value'?: string | undefined; 'threat.indicator.scanner_stats'?: string | number | undefined; 'threat.indicator.sightings'?: string | number | undefined; 'threat.indicator.type'?: string | undefined; 'threat.indicator.url.domain'?: string | undefined; 'threat.indicator.url.extension'?: string | undefined; 'threat.indicator.url.fragment'?: string | undefined; 'threat.indicator.url.full'?: string | undefined; 'threat.indicator.url.original'?: string | undefined; 'threat.indicator.url.password'?: string | undefined; 'threat.indicator.url.path'?: string | undefined; 'threat.indicator.url.port'?: string | number | undefined; 'threat.indicator.url.query'?: string | undefined; 'threat.indicator.url.registered_domain'?: string | undefined; 'threat.indicator.url.scheme'?: string | undefined; 'threat.indicator.url.subdomain'?: string | undefined; 'threat.indicator.url.top_level_domain'?: string | undefined; 'threat.indicator.url.username'?: string | undefined; 'threat.indicator.x509.alternative_names'?: string[] | undefined; 'threat.indicator.x509.issuer.common_name'?: string[] | undefined; 'threat.indicator.x509.issuer.country'?: string[] | undefined; 'threat.indicator.x509.issuer.distinguished_name'?: string | undefined; 'threat.indicator.x509.issuer.locality'?: string[] | undefined; 'threat.indicator.x509.issuer.organization'?: string[] | undefined; 'threat.indicator.x509.issuer.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.issuer.state_or_province'?: string[] | undefined; 'threat.indicator.x509.not_after'?: string | number | undefined; 'threat.indicator.x509.not_before'?: string | number | undefined; 'threat.indicator.x509.public_key_algorithm'?: string | undefined; 'threat.indicator.x509.public_key_curve'?: string | undefined; 'threat.indicator.x509.public_key_exponent'?: string | number | undefined; 'threat.indicator.x509.public_key_size'?: string | number | undefined; 'threat.indicator.x509.serial_number'?: string | undefined; 'threat.indicator.x509.signature_algorithm'?: string | undefined; 'threat.indicator.x509.subject.common_name'?: string[] | undefined; 'threat.indicator.x509.subject.country'?: string[] | undefined; 'threat.indicator.x509.subject.distinguished_name'?: string | undefined; 'threat.indicator.x509.subject.locality'?: string[] | undefined; 'threat.indicator.x509.subject.organization'?: string[] | undefined; 'threat.indicator.x509.subject.organizational_unit'?: string[] | undefined; 'threat.indicator.x509.subject.state_or_province'?: string[] | undefined; 'threat.indicator.x509.version_number'?: string | undefined; 'threat.software.alias'?: string[] | undefined; 'threat.software.id'?: string | undefined; 'threat.software.name'?: string | undefined; 'threat.software.platforms'?: string[] | undefined; 'threat.software.reference'?: string | undefined; 'threat.software.type'?: string | undefined; 'threat.tactic.id'?: string[] | undefined; 'threat.tactic.name'?: string[] | undefined; 'threat.tactic.reference'?: string[] | undefined; 'threat.technique.id'?: string[] | undefined; 'threat.technique.name'?: string[] | undefined; 'threat.technique.reference'?: string[] | undefined; 'threat.technique.subtechnique.id'?: string[] | undefined; 'threat.technique.subtechnique.name'?: string[] | undefined; 'threat.technique.subtechnique.reference'?: string[] | undefined; 'tls.cipher'?: string | undefined; 'tls.client.certificate'?: string | undefined; 'tls.client.certificate_chain'?: string[] | undefined; 'tls.client.hash.md5'?: string | undefined; 'tls.client.hash.sha1'?: string | undefined; 'tls.client.hash.sha256'?: string | undefined; 'tls.client.issuer'?: string | undefined; 'tls.client.ja3'?: string | undefined; 'tls.client.not_after'?: string | number | undefined; 'tls.client.not_before'?: string | number | undefined; 'tls.client.server_name'?: string | undefined; 'tls.client.subject'?: string | undefined; 'tls.client.supported_ciphers'?: string[] | undefined; 'tls.client.x509.alternative_names'?: string[] | undefined; 'tls.client.x509.issuer.common_name'?: string[] | undefined; 'tls.client.x509.issuer.country'?: string[] | undefined; 'tls.client.x509.issuer.distinguished_name'?: string | undefined; 'tls.client.x509.issuer.locality'?: string[] | undefined; 'tls.client.x509.issuer.organization'?: string[] | undefined; 'tls.client.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.client.x509.issuer.state_or_province'?: string[] | undefined; 'tls.client.x509.not_after'?: string | number | undefined; 'tls.client.x509.not_before'?: string | number | undefined; 'tls.client.x509.public_key_algorithm'?: string | undefined; 'tls.client.x509.public_key_curve'?: string | undefined; 'tls.client.x509.public_key_exponent'?: string | number | undefined; 'tls.client.x509.public_key_size'?: string | number | undefined; 'tls.client.x509.serial_number'?: string | undefined; 'tls.client.x509.signature_algorithm'?: string | undefined; 'tls.client.x509.subject.common_name'?: string[] | undefined; 'tls.client.x509.subject.country'?: string[] | undefined; 'tls.client.x509.subject.distinguished_name'?: string | undefined; 'tls.client.x509.subject.locality'?: string[] | undefined; 'tls.client.x509.subject.organization'?: string[] | undefined; 'tls.client.x509.subject.organizational_unit'?: string[] | undefined; 'tls.client.x509.subject.state_or_province'?: string[] | undefined; 'tls.client.x509.version_number'?: string | undefined; 'tls.curve'?: string | undefined; 'tls.established'?: boolean | undefined; 'tls.next_protocol'?: string | undefined; 'tls.resumed'?: boolean | undefined; 'tls.server.certificate'?: string | undefined; 'tls.server.certificate_chain'?: string[] | undefined; 'tls.server.hash.md5'?: string | undefined; 'tls.server.hash.sha1'?: string | undefined; 'tls.server.hash.sha256'?: string | undefined; 'tls.server.issuer'?: string | undefined; 'tls.server.ja3s'?: string | undefined; 'tls.server.not_after'?: string | number | undefined; 'tls.server.not_before'?: string | number | undefined; 'tls.server.subject'?: string | undefined; 'tls.server.x509.alternative_names'?: string[] | undefined; 'tls.server.x509.issuer.common_name'?: string[] | undefined; 'tls.server.x509.issuer.country'?: string[] | undefined; 'tls.server.x509.issuer.distinguished_name'?: string | undefined; 'tls.server.x509.issuer.locality'?: string[] | undefined; 'tls.server.x509.issuer.organization'?: string[] | undefined; 'tls.server.x509.issuer.organizational_unit'?: string[] | undefined; 'tls.server.x509.issuer.state_or_province'?: string[] | undefined; 'tls.server.x509.not_after'?: string | number | undefined; 'tls.server.x509.not_before'?: string | number | undefined; 'tls.server.x509.public_key_algorithm'?: string | undefined; 'tls.server.x509.public_key_curve'?: string | undefined; 'tls.server.x509.public_key_exponent'?: string | number | undefined; 'tls.server.x509.public_key_size'?: string | number | undefined; 'tls.server.x509.serial_number'?: string | undefined; 'tls.server.x509.signature_algorithm'?: string | undefined; 'tls.server.x509.subject.common_name'?: string[] | undefined; 'tls.server.x509.subject.country'?: string[] | undefined; 'tls.server.x509.subject.distinguished_name'?: string | undefined; 'tls.server.x509.subject.locality'?: string[] | undefined; 'tls.server.x509.subject.organization'?: string[] | undefined; 'tls.server.x509.subject.organizational_unit'?: string[] | undefined; 'tls.server.x509.subject.state_or_province'?: string[] | undefined; 'tls.server.x509.version_number'?: string | undefined; 'tls.version'?: string | undefined; 'tls.version_protocol'?: string | undefined; 'trace.id'?: string | undefined; 'transaction.id'?: string | undefined; 'url.domain'?: string | undefined; 'url.extension'?: string | undefined; 'url.fragment'?: string | undefined; 'url.full'?: string | undefined; 'url.original'?: string | undefined; 'url.password'?: string | undefined; 'url.path'?: string | undefined; 'url.port'?: string | number | undefined; 'url.query'?: string | undefined; 'url.registered_domain'?: string | undefined; 'url.scheme'?: string | undefined; 'url.subdomain'?: string | undefined; 'url.top_level_domain'?: string | undefined; 'url.username'?: string | undefined; 'user.changes.domain'?: string | undefined; 'user.changes.email'?: string | undefined; 'user.changes.full_name'?: string | undefined; 'user.changes.group.domain'?: string | undefined; 'user.changes.group.id'?: string | undefined; 'user.changes.group.name'?: string | undefined; 'user.changes.hash'?: string | undefined; 'user.changes.id'?: string | undefined; 'user.changes.name'?: string | undefined; 'user.changes.roles'?: string[] | undefined; 'user.domain'?: string | undefined; 'user.effective.domain'?: string | undefined; 'user.effective.email'?: string | undefined; 'user.effective.full_name'?: string | undefined; 'user.effective.group.domain'?: string | undefined; 'user.effective.group.id'?: string | undefined; 'user.effective.group.name'?: string | undefined; 'user.effective.hash'?: string | undefined; 'user.effective.id'?: string | undefined; 'user.effective.name'?: string | undefined; 'user.effective.roles'?: string[] | undefined; 'user.email'?: string | undefined; 'user.full_name'?: string | undefined; 'user.group.domain'?: string | undefined; 'user.group.id'?: string | undefined; 'user.group.name'?: string | undefined; 'user.hash'?: string | undefined; 'user.id'?: string | undefined; 'user.name'?: string | undefined; 'user.risk.calculated_level'?: string | undefined; 'user.risk.calculated_score'?: number | undefined; 'user.risk.calculated_score_norm'?: number | undefined; 'user.risk.static_level'?: string | undefined; 'user.risk.static_score'?: number | undefined; 'user.risk.static_score_norm'?: number | undefined; 'user.roles'?: string[] | undefined; 'user.target.domain'?: string | undefined; 'user.target.email'?: string | undefined; 'user.target.full_name'?: string | undefined; 'user.target.group.domain'?: string | undefined; 'user.target.group.id'?: string | undefined; 'user.target.group.name'?: string | undefined; 'user.target.hash'?: string | undefined; 'user.target.id'?: string | undefined; 'user.target.name'?: string | undefined; 'user.target.roles'?: string[] | undefined; 'user_agent.device.name'?: string | undefined; 'user_agent.name'?: string | undefined; 'user_agent.original'?: string | undefined; 'user_agent.os.family'?: string | undefined; 'user_agent.os.full'?: string | undefined; 'user_agent.os.kernel'?: string | undefined; 'user_agent.os.name'?: string | undefined; 'user_agent.os.platform'?: string | undefined; 'user_agent.os.type'?: string | undefined; 'user_agent.os.version'?: string | undefined; 'user_agent.version'?: string | undefined; 'vulnerability.category'?: string[] | undefined; 'vulnerability.classification'?: string | undefined; 'vulnerability.description'?: string | undefined; 'vulnerability.enumeration'?: string | undefined; 'vulnerability.id'?: string | undefined; 'vulnerability.reference'?: string | undefined; 'vulnerability.report_id'?: string | undefined; 'vulnerability.scanner.vendor'?: string | undefined; 'vulnerability.score.base'?: number | undefined; 'vulnerability.score.environmental'?: number | undefined; 'vulnerability.score.temporal'?: number | undefined; 'vulnerability.score.version'?: string | undefined; 'vulnerability.severity'?: string | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }) | ({ 'kibana.alert.job_id': string; } & { 'kibana.alert.anomaly_score'?: number[] | undefined; 'kibana.alert.anomaly_timestamp'?: string | number | undefined; 'kibana.alert.is_interim'?: boolean | undefined; 'kibana.alert.top_influencers'?: { influencer_field_name?: string | undefined; influencer_field_value?: string | undefined; influencer_score?: number | undefined; initial_influencer_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; timestamp?: string | number | undefined; }[] | undefined; 'kibana.alert.top_records'?: { actual?: number | undefined; by_field_name?: string | undefined; by_field_value?: string | undefined; detector_index?: number | undefined; field_name?: string | undefined; function?: string | undefined; initial_record_score?: number | undefined; is_interim?: boolean | undefined; job_id?: string | undefined; over_field_name?: string | undefined; over_field_value?: string | undefined; partition_field_name?: string | undefined; partition_field_value?: string | undefined; record_score?: number | undefined; timestamp?: string | number | undefined; typical?: number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.datafeed_results'?: { datafeed_id?: string | undefined; datafeed_state?: string | undefined; job_id?: string | undefined; job_state?: string | undefined; }[] | undefined; 'kibana.alert.delayed_data_results'?: { annotation?: string | undefined; end_timestamp?: string | number | undefined; job_id?: string | undefined; missed_docs_count?: string | number | undefined; }[] | undefined; 'kibana.alert.job_errors_results'?: { errors?: unknown; job_id?: string | undefined; }[] | undefined; 'kibana.alert.mml_results'?: { job_id?: string | undefined; log_time?: string | number | undefined; memory_status?: string | undefined; model_bytes?: string | number | undefined; model_bytes_exceeded?: string | number | undefined; model_bytes_memory_limit?: string | number | undefined; peak_model_bytes?: string | number | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; }) | ({} & { 'kibana.alert.results'?: { description?: string | undefined; health_status?: string | undefined; issues?: unknown; node_name?: string | undefined; transform_id?: string | undefined; transform_state?: string | undefined; }[] | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; })" ], "path": "packages/kbn-alerts-as-data-utils/src/schemas/index.ts", "deprecated": false, @@ -360,7 +360,7 @@ "label": "ObservabilityApmAlert", "description": [], "signature": [ - "{} & { 'agent.name'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" + "{} & { 'agent.name'?: string | undefined; 'container.id'?: string | undefined; 'error.grouping_key'?: string | undefined; 'error.grouping_name'?: string | undefined; 'host.name'?: string | undefined; 'kibana.alert.context'?: unknown; 'kibana.alert.evaluation.threshold'?: string | number | undefined; 'kibana.alert.evaluation.value'?: string | number | undefined; 'kibana.alert.evaluation.values'?: (string | number)[] | undefined; 'kibana.alert.group'?: { field?: string[] | undefined; value?: string[] | undefined; }[] | undefined; labels?: unknown; 'processor.event'?: string | undefined; 'service.environment'?: string | undefined; 'service.language.name'?: string | undefined; 'service.name'?: string | undefined; 'transaction.name'?: string | undefined; 'transaction.type'?: string | undefined; } & { '@timestamp': string | number; 'kibana.alert.instance.id': string; 'kibana.alert.rule.category': string; 'kibana.alert.rule.consumer': string; 'kibana.alert.rule.name': string; 'kibana.alert.rule.producer': string; 'kibana.alert.rule.revision': string | number; 'kibana.alert.rule.rule_type_id': string; 'kibana.alert.rule.uuid': string; 'kibana.alert.status': string; 'kibana.alert.uuid': string; 'kibana.space_ids': string[]; } & { 'event.action'?: string | undefined; 'event.kind'?: string | undefined; 'kibana.alert.action_group'?: string | undefined; 'kibana.alert.case_ids'?: string[] | undefined; 'kibana.alert.consecutive_matches'?: string | number | undefined; 'kibana.alert.duration.us'?: string | number | undefined; 'kibana.alert.end'?: string | number | undefined; 'kibana.alert.flapping'?: boolean | undefined; 'kibana.alert.flapping_history'?: boolean[] | undefined; 'kibana.alert.last_detected'?: string | number | undefined; 'kibana.alert.maintenance_window_ids'?: string[] | undefined; 'kibana.alert.reason'?: string | undefined; 'kibana.alert.rule.execution.uuid'?: string | undefined; 'kibana.alert.rule.parameters'?: unknown; 'kibana.alert.rule.tags'?: string[] | undefined; 'kibana.alert.start'?: string | number | undefined; 'kibana.alert.time_range'?: { gte?: string | number | undefined; lte?: string | number | undefined; } | undefined; 'kibana.alert.url'?: string | undefined; 'kibana.alert.workflow_assignee_ids'?: string[] | undefined; 'kibana.alert.workflow_status'?: string | undefined; 'kibana.alert.workflow_tags'?: string[] | undefined; 'kibana.version'?: string | undefined; tags?: string[] | undefined; } & {} & { 'ecs.version'?: string | undefined; 'kibana.alert.risk_score'?: number | undefined; 'kibana.alert.rule.author'?: string | undefined; 'kibana.alert.rule.created_at'?: string | number | undefined; 'kibana.alert.rule.created_by'?: string | undefined; 'kibana.alert.rule.description'?: string | undefined; 'kibana.alert.rule.enabled'?: string | undefined; 'kibana.alert.rule.from'?: string | undefined; 'kibana.alert.rule.interval'?: string | undefined; 'kibana.alert.rule.license'?: string | undefined; 'kibana.alert.rule.note'?: string | undefined; 'kibana.alert.rule.references'?: string[] | undefined; 'kibana.alert.rule.rule_id'?: string | undefined; 'kibana.alert.rule.rule_name_override'?: string | undefined; 'kibana.alert.rule.to'?: string | undefined; 'kibana.alert.rule.type'?: string | undefined; 'kibana.alert.rule.updated_at'?: string | number | undefined; 'kibana.alert.rule.updated_by'?: string | undefined; 'kibana.alert.rule.version'?: string | undefined; 'kibana.alert.severity'?: string | undefined; 'kibana.alert.suppression.docs_count'?: string | number | undefined; 'kibana.alert.suppression.end'?: string | number | undefined; 'kibana.alert.suppression.start'?: string | number | undefined; 'kibana.alert.suppression.terms.field'?: string[] | undefined; 'kibana.alert.suppression.terms.value'?: string[] | undefined; 'kibana.alert.system_status'?: string | undefined; 'kibana.alert.workflow_reason'?: string | undefined; 'kibana.alert.workflow_status_updated_at'?: string | number | undefined; 'kibana.alert.workflow_user'?: string | undefined; }" ], "path": "packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_apm_schema.ts", "deprecated": false, diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 2114d009dcc9b3..bb1b6361b6f469 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-04-04 +date: 2024-04-05 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 76bccc345f69c6..22d6ccf9b9d91e 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-04-04 +date: 2024-04-05 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 36bb6054d5c56a..59f3dee60ade4a 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-04-04 +date: 2024-04-05 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 14ec8d72fa965a..e0ba30bb373687 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-04-04 +date: 2024-04-05 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 b88443990b371a..866963e0fc6f6c 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-04-04 +date: 2024-04-05 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 886d61d71be93f..312d36f2b55a4c 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-04-04 +date: 2024-04-05 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 0444610c65a045..ae092c6dd9a5b2 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-04-04 +date: 2024-04-05 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 9cf7100e7b3eb3..c69ac5cd93cf3f 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-04-04 +date: 2024-04-05 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 da83ae4290e0a4..d485de539deda9 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-04-04 +date: 2024-04-05 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 e06ae852cadccf..99d9fcdea79c1f 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-04-04 +date: 2024-04-05 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 67c4dd8ad01f98..278a78d209138d 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-04-04 +date: 2024-04-05 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 38204c1b2276d4..e1d7abf9ae8b6d 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-04-04 +date: 2024-04-05 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 a84b8813a45001..1c2fd957f028c8 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -881,6 +881,38 @@ ], "returnComment": [] }, + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.Instance.hostName", + "type": "Function", + "tags": [], + "label": "hostName", + "description": [], + "signature": [ + "(hostName: string) => this" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/apm-synthtrace-client", + "id": "def-common.Instance.hostName.$1", + "type": "string", + "tags": [], + "label": "hostName", + "description": [], + "signature": [ + "string" + ], + "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "@kbn/apm-synthtrace-client", "id": "def-common.Instance.podId", @@ -2622,7 +2654,7 @@ "label": "LogDocument", "description": [], "signature": [ - "{ '@timestamp'?: number | undefined; } & Partial<{ 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'trace.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; }>" + "{ '@timestamp'?: number | undefined; } & Partial<{ 'input.type': string; 'log.file.path'?: string | undefined; 'service.name'?: string | undefined; 'data_stream.namespace': string; 'data_stream.type': string; 'data_stream.dataset': string; message?: string | undefined; 'error.message'?: string | undefined; 'event.original'?: string | undefined; 'event.dataset': string; 'log.level'?: string | undefined; 'host.name'?: string | undefined; 'container.id'?: string | undefined; 'trace.id'?: string | undefined; 'agent.id'?: string | undefined; 'agent.name'?: string | undefined; 'orchestrator.cluster.name'?: string | undefined; 'orchestrator.cluster.id'?: string | undefined; 'orchestrator.resource.id'?: string | undefined; 'orchestrator.namespace'?: string | undefined; 'container.name'?: string | undefined; 'cloud.provider'?: string | undefined; 'cloud.region'?: string | undefined; 'cloud.availability_zone'?: string | undefined; 'cloud.project.id'?: string | undefined; 'cloud.instance.id'?: string | undefined; 'error.stack_trace'?: string | undefined; 'error.exception.stacktrace'?: string | undefined; 'error.log.stacktrace'?: string | undefined; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 902d53ca75a5a8..482cc467e1274f 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 189 | 0 | 189 | 28 | +| 191 | 0 | 191 | 28 | ## Common diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 3f328b7117cf22..07541711ebecc4 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-04-04 +date: 2024-04-05 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 7d26fca65286d8..f25d75d2ac57d6 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-04-04 +date: 2024-04-05 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 9c92c273547a53..9384b8838e8fd5 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-04-04 +date: 2024-04-05 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 66f711c18a24fc..ef12a1d7a46418 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-04-04 +date: 2024-04-05 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 4b80fe8f77b652..c77618554919bc 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-04-04 +date: 2024-04-05 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 e85606a4cb25ee..d71ba1005161c0 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-04-04 +date: 2024-04-05 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 74757e2e790b02..f9ec9911659ad1 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-04-04 +date: 2024-04-05 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 a1fd7cf98c490b..d7607cae4d8209 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-04-04 +date: 2024-04-05 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 38539a74f18825..856a151e542085 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-04-04 +date: 2024-04-05 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 7180b15681d0ec..e03498ccf165ac 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-04-04 +date: 2024-04-05 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 516e82f94a5840..86d7544239b24c 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-04-04 +date: 2024-04-05 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 f2ce26060e46ac..ffc4392b66b32e 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-04-04 +date: 2024-04-05 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 460a6cb62dce6e..709a469557923f 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-04-04 +date: 2024-04-05 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 b0189c421c1676..ec950ecca629c9 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-04-04 +date: 2024-04-05 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 fa1336bc39aec0..8277352e5473f3 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-04-04 +date: 2024-04-05 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 9239b3a64ad30f..86fcc387702ec6 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-04-04 +date: 2024-04-05 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 d7a5f3935cacce..0e4705b5ec3c91 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-04-04 +date: 2024-04-05 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 d401a626af739d..9a70626a73b5bd 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-04-04 +date: 2024-04-05 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 cb4ddbb14685a4..c995fe6ab813a8 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-04-04 +date: 2024-04-05 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 7e83a2a691bc6a..d7877797021492 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-04-04 +date: 2024-04-05 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 e43eac2f5436f0..788952d793d9c2 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-04-04 +date: 2024-04-05 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 d2ff4f348efdf6..28dc81cf27ee99 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-04-04 +date: 2024-04-05 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 90da65fce361dc..14bbef87b3740b 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-04-04 +date: 2024-04-05 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 1770bcaef4791a..bfe0f3c9c09db9 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-04-04 +date: 2024-04-05 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 a80528b73aa5ef..bf6aff45ce5c35 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-04-04 +date: 2024-04-05 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 829abb38a216b1..c36555a48c3c8f 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-04-04 +date: 2024-04-05 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 90e1cef57c34eb..2ff3e78b29f8ad 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-04-04 +date: 2024-04-05 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 d4452af0a249d9..92184b3bf48bd7 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-04-04 +date: 2024-04-05 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 40585883854148..7935bfce45fd68 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-04-04 +date: 2024-04-05 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 0775f745086355..3b5dff08b65e2c 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-04-04 +date: 2024-04-05 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 d582e17273129d..3837c6fd987914 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-04-04 +date: 2024-04-05 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 0e95ab5d616378..58e75f10c57321 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-04-04 +date: 2024-04-05 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 0bf634b01349bf..6dcb0e7426fb0e 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-04-04 +date: 2024-04-05 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 d75dc14644d6dd..51afe9526c19df 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-04-04 +date: 2024-04-05 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 b68d2968d7d97f..59c87af77e9a92 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-04-04 +date: 2024-04-05 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 51bbc7b2101743..7b3d4e71c21823 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-04-04 +date: 2024-04-05 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 86b6cda8627c8d..3e361ad8e83429 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-04-04 +date: 2024-04-05 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 05eb04dd5ab39c..f76ab446ba02a4 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-04-04 +date: 2024-04-05 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 b9e56b8e7a7b68..c02489a676e2fc 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-04-04 +date: 2024-04-05 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 3f3f1e76ec6b68..80968195c82f84 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-04-04 +date: 2024-04-05 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 52bd3cc8932741..fd2c28edcab563 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-04-04 +date: 2024-04-05 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 0b1b95be006e08..0c2d7280817157 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-04-04 +date: 2024-04-05 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 515f7d3df0eb47..ff9aa9fd40f963 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-04-04 +date: 2024-04-05 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 c381c29ae0d481..23a6f2315c671d 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-04-04 +date: 2024-04-05 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 0f33a512b6059b..44efedac452ff5 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-04-04 +date: 2024-04-05 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 25fec8ef99712d..30e5af8062c228 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-04-04 +date: 2024-04-05 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 1e691005ca5475..8cadd1fb4d0c16 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 0249d454c835a1..088c37bef62754 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index 4b79640b8faa0f..74e8f07aa2f815 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-04-04 +date: 2024-04-05 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 78864a9cb4fe3e..a22d7e844051fc 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-04-04 +date: 2024-04-05 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 9acee21175428c..c9b9e3a89b24d6 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-04-04 +date: 2024-04-05 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 966099f2e76c7c..5b74c73e5e89f7 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-04-04 +date: 2024-04-05 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 06ba9c0d521b6b..590dd18f36bb1b 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-04-04 +date: 2024-04-05 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 a8d6482ebd4032..ff5dd081caa023 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-04-04 +date: 2024-04-05 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 9580ad44465cf6..6d0dcb3a13ccf5 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-04-04 +date: 2024-04-05 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 7ee15ff2bfc14e..26b1370aeb485c 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-04-04 +date: 2024-04-05 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 e750d2ce6b4781..a77e65642564be 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-04-04 +date: 2024-04-05 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 55e563a0c06883..ec2fc52b6ad8e8 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-04-04 +date: 2024-04-05 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 ebe6c9871825af..2f82d9e61eff27 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-04-04 +date: 2024-04-05 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 d28f490384f693..2ba4d1dd731acc 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-04-04 +date: 2024-04-05 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 8c1ba9d72a9d38..29a618f2c07161 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-04-04 +date: 2024-04-05 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 d50ec370859547..76a004963a4334 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-04-04 +date: 2024-04-05 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 cb2558a95cedfb..ef0351893d5e78 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-04-04 +date: 2024-04-05 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 fca5a69a95e0c2..1a95da8e14d5f7 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-04-04 +date: 2024-04-05 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 f7313c3101f2ab..03e78848e09df3 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-04-04 +date: 2024-04-05 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 d10d0df2a52f39..6734f298e5630b 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-04-04 +date: 2024-04-05 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 b187881a40088c..eb5ea622095b01 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-04-04 +date: 2024-04-05 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 ed38d91a2d33d4..e248b45007f4d2 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-04-04 +date: 2024-04-05 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 34e39d1ad36f93..d9bee0e71ef001 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-04-04 +date: 2024-04-05 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 b1954ee756a457..14ac594c2e7a45 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-04-04 +date: 2024-04-05 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 47e818237a58f3..0ca4c28c92fd5d 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-04-04 +date: 2024-04-05 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 75b708ad9a09dc..109493801987f4 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-04-04 +date: 2024-04-05 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 8850cd740f5e9c..7745ae0dfdc08c 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-04-04 +date: 2024-04-05 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 6cd2b9536ae100..7d2772c4de9d2d 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-04-04 +date: 2024-04-05 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 85815866a251dc..68a087a21b339e 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-04-04 +date: 2024-04-05 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 fcd30ed95098f5..699374467baf2f 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-04-04 +date: 2024-04-05 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 887a77edd7a408..c44bfaa0dc331a 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-04-04 +date: 2024-04-05 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 4c007410975417..07cbe86c624157 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-04-04 +date: 2024-04-05 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 07013ae5e34488..a354abf6611f21 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-04-04 +date: 2024-04-05 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 9ed1422d491753..8edb9cce1f2657 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-04-04 +date: 2024-04-05 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 a0130f108b27fb..851135bf676219 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-04-04 +date: 2024-04-05 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 5f19d915de992f..2e040362a46275 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-04-04 +date: 2024-04-05 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 52a045d91f3ae8..4c89f00113ec2b 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-04-04 +date: 2024-04-05 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 3ba4bb05717ffe..69e615d4060bda 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-04-04 +date: 2024-04-05 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 4ddc99852dc161..1f654ebc15a0a8 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-04-04 +date: 2024-04-05 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 429d6c5b192127..90e48852f60044 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-04-04 +date: 2024-04-05 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 31dabf354c0b97..13016547b3c882 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-04-04 +date: 2024-04-05 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 35bdb8aeb519cb..0d097d92272060 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-04-04 +date: 2024-04-05 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 20e670f4c28110..faac9a1c7d1791 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-04-04 +date: 2024-04-05 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 6b29f90fde7b8c..92e7aa2fc1f5a8 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-04-04 +date: 2024-04-05 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 1818f1f5d23793..a698861693af55 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-04-04 +date: 2024-04-05 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 5d2de419d4b5f0..0fc19e54a03a05 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-04-04 +date: 2024-04-05 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 b5e9d14d65c766..d70924681e8a04 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 57d7b830f34ad5..59523fcb371f57 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-04-04 +date: 2024-04-05 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 929989bc0c9104..8dbc1fe6e57a71 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" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | 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 e971b32f259ce7..33fd5ae67512c4 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-04-04 +date: 2024-04-05 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 a9dcf5ae7ffac8..010a2d1c10529f 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -3821,51 +3821,51 @@ }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/indices/register_list_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/indices/register_get_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_datastream_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts" + "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts" + "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/settings/register_load_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_list_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/stats/register_stats_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_privileges_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/indices/register_list_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_get_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/indices/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/inference_models/register_get_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_datastream_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts" }, { "plugin": "indexManagement", @@ -3873,15 +3873,19 @@ }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_list_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/settings/register_load_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_privileges_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/stats/register_stats_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_mapping_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts" + }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/templates/register_get_routes.ts" }, { "plugin": "remoteClusters", @@ -4439,6 +4443,14 @@ "plugin": "rollup", "path": "x-pack/plugins/rollup/server/routes/api/jobs/register_get_route.ts" }, + { + "plugin": "searchNotebooks", + "path": "x-pack/plugins/search_notebooks/server/routes/index.ts" + }, + { + "plugin": "searchNotebooks", + "path": "x-pack/plugins/search_notebooks/server/routes/index.ts" + }, { "plugin": "serverlessSearch", "path": "x-pack/plugins/serverless_search/server/routes/api_key_routes.ts" @@ -6389,6 +6401,10 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/server/routes/internal/bulk_delete.ts" }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_create_route.ts" + }, { "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_delete_route.ts" @@ -6401,6 +6417,18 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_post_route.ts" }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" + }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" + }, + { + "plugin": "indexManagement", + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" + }, { "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/indices/register_clear_cache_route.ts" @@ -6449,22 +6477,6 @@ "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/routes/api/templates/register_simulate_route.ts" }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_create_route.ts" - }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" - }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" - }, - { - "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_create_route.ts" - }, { "plugin": "remoteClusters", "path": "x-pack/plugins/remote_clusters/server/routes/api/add_route.ts" @@ -8221,31 +8233,31 @@ }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_put_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/indices/register_create_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/data_streams/register_put_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_execute_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/indices/register_create_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/component_templates/register_update_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/enrich_policies/register_execute_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/settings/register_update_route.ts" }, { "plugin": "indexManagement", - "path": "x-pack/plugins/index_management/server/routes/api/mapping/register_update_mapping_route.ts" + "path": "x-pack/plugins/index_management/server/routes/api/templates/register_update_route.ts" }, { "plugin": "remoteClusters", @@ -11138,7 +11150,7 @@ "label": "access", "description": [], "signature": [ - "\"public\" | \"internal\"" + "\"internal\" | \"public\"" ], "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, @@ -12242,7 +12254,7 @@ "\nDefines intended request origin of the route:\n- public. The route is public, declared stable and intended for external access.\n In the future, may require an incomming request to contain a specified header.\n- internal. The route is internal and intended for internal access only.\n\nDefaults to 'internal' If not declared," ], "signature": [ - "\"public\" | \"internal\" | undefined" + "\"internal\" | \"public\" | undefined" ], "path": "packages/core/http/core-http-server/src/router/route.ts", "deprecated": false, @@ -14505,7 +14517,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -14784,7 +14796,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -15763,7 +15775,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -15890,7 +15902,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -16145,7 +16157,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -18673,7 +18685,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | undefined; }" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -18741,7 +18753,7 @@ "section": "def-common.RouteConfigOptions", "text": "RouteConfigOptions" }, - ", \"access\"> | undefined; access: \"public\" | \"internal\"; enableQueryVersion?: boolean | undefined; }" + ", \"access\"> | undefined; access: \"internal\" | \"public\"; enableQueryVersion?: boolean | 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 7692baf276fce2..056f2fb8058d18 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 2bd239f2eca8f4..2c4a063ec39ce7 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-04-04 +date: 2024-04-05 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 5d4e4365e2a9ef..87115786c7d87a 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-04-04 +date: 2024-04-05 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 abdfa9d7c02f89..b2a01045cefdf2 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-04-04 +date: 2024-04-05 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 8436104b7433e1..b2a2c2547a09c3 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-04-04 +date: 2024-04-05 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 ac82658234cf77..ad69558e38097e 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-04-04 +date: 2024-04-05 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 23baa86ab4e77c..be9bbec845327c 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-04-04 +date: 2024-04-05 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 c968e3ffde04b1..9cc38948118821 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-04-04 +date: 2024-04-05 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 40d2ca9bad5d2e..9dff5ec581a930 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-04-04 +date: 2024-04-05 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 b35ff7aea3ed72..6833a9c48f373c 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-04-04 +date: 2024-04-05 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 4e78d936c67143..e3ab82ddd48aad 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-04-04 +date: 2024-04-05 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 a7bfc8a2f265df..927a73eb32e45b 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-04-04 +date: 2024-04-05 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 b86f67bd02a4b7..fcd27b037d4334 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-04-04 +date: 2024-04-05 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 ed65e0384a8502..f5eeb9945fb6ee 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-04-04 +date: 2024-04-05 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 7900e3c16db863..0a4c284aac2fd0 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-04-04 +date: 2024-04-05 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 f1ec1fe3d51a54..d7ed8a306f2edf 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-04-04 +date: 2024-04-05 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 de9eac98950c3d..bca87ba816b4f3 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-04-04 +date: 2024-04-05 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 c3a122ffa3b032..97cdc209f4ea0c 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-04-04 +date: 2024-04-05 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 f82959f91ca07c..8c69d8ede5b430 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-04-04 +date: 2024-04-05 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 126abdf672b059..39b347f02a81ee 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-04-04 +date: 2024-04-05 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 b9ecffe339b803..3fceb97a471fd5 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-04-04 +date: 2024-04-05 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 a5d7a5eca033be..5204ed754e1445 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_core_metrics_server.devdocs.json index 94105c95f94cde..6dfa3e47827bfd 100644 --- a/api_docs/kbn_core_metrics_server.devdocs.json +++ b/api_docs/kbn_core_metrics_server.devdocs.json @@ -908,7 +908,7 @@ "\nProtocol(s) used by the Elasticsearch Client" ], "signature": [ - "\"none\" | \"http\" | \"mixed\" | \"https\"" + "\"none\" | \"mixed\" | \"http\" | \"https\"" ], "path": "packages/core/metrics/core-metrics-server/src/metrics.ts", "deprecated": false, diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index e8f2456d77ca70..d4bc46b48398f1 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-04-04 +date: 2024-04-05 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 c28869817fc7b9..42d29b8d757369 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-04-04 +date: 2024-04-05 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 a8d8972805f8c9..30b4b9f57ce268 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-04-04 +date: 2024-04-05 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 363c39292f66a0..f4f86e11f28161 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-04-04 +date: 2024-04-05 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 bfccf6229f1bba..0c5aeb280238fa 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-04-04 +date: 2024-04-05 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 7a33b68a7305f1..c6ea98cdd16e44 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-04-04 +date: 2024-04-05 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 0244f1ca73f31d..95665506816099 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-04-04 +date: 2024-04-05 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 ae150b2422eae5..4e689b16cc2d76 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-04-04 +date: 2024-04-05 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 74787c2551b807..7d3bd7536e36e2 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-04-04 +date: 2024-04-05 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 eefb98a0d5f897..0c2720e497972a 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-04-04 +date: 2024-04-05 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 7a70240992e6b5..408cb49d315c9e 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-04-04 +date: 2024-04-05 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 eca63292f0f725..2dbcfb888b9d1b 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-04-04 +date: 2024-04-05 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 d70379ded68fed..0554dbcea284f5 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-04-04 +date: 2024-04-05 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 1480019cef9cb9..18bb11633d9321 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-04-04 +date: 2024-04-05 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 046e02364fd406..adab3185de512a 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-04-04 +date: 2024-04-05 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 621cd6aa18bf2e..b73ef6758806ab 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-04-04 +date: 2024-04-05 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 1efaa76748fb88..b91b408ac6bd12 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-04-04 +date: 2024-04-05 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 a3e9ed1cf35536..19b884ac945926 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-04-04 +date: 2024-04-05 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 5e04fba29b4bce..f3bcfa1041d1ab 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-04-04 +date: 2024-04-05 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 40028a12be096f..c7a0217b2504dc 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-04-04 +date: 2024-04-05 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 bdaefe6ec84ca3..202ad088031234 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-04-04 +date: 2024-04-05 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 0a4fad9032ef3b..b03eeaed0b6fca 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-04-04 +date: 2024-04-05 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 5aa0e327304ff3..a5425bb07cd3b7 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-04-04 +date: 2024-04-05 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 41633b6e46d87d..3d9281c41e9914 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-04-04 +date: 2024-04-05 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 a8243774a17e28..65d32e48f5ad1b 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index 1b5ec3ef53fcce..d37ffb442e3c1c 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -3380,6 +3380,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-api-browser", + "id": "def-common.SimpleSavedObject.createdBy", + "type": "string", + "tags": [], + "label": "createdBy", + "description": [ + "The user that created this object" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-api-browser", "id": "def-common.SimpleSavedObject.namespaces", diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 3639a5634e9619..5a6ad3b34baa05 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.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 | |-------------------|-----------|------------------------|-----------------| -| 111 | 1 | 0 | 0 | +| 112 | 1 | 0 | 0 | ## Common diff --git a/api_docs/kbn_core_saved_objects_api_server.devdocs.json b/api_docs/kbn_core_saved_objects_api_server.devdocs.json index e7c756b1cdfa1b..3f524f09e985df 100644 --- a/api_docs/kbn_core_saved_objects_api_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_server.devdocs.json @@ -2191,6 +2191,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-api-server", + "id": "def-common.SavedObject.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [ + "The ID of the user who created this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-api-server", "id": "def-common.SavedObject.updated_at", diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 800155dd96489b..e557c96839463a 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_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 | |-------------------|-----------|------------------------|-----------------| -| 353 | 1 | 5 | 2 | +| 354 | 1 | 5 | 2 | ## Common 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 15fa7f6ed60202..5b6be97a066c21 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json index 33bc322e68a695..000b94aa9f7e6f 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_base_server_internal.devdocs.json @@ -2812,10 +2812,10 @@ }, { "parentPluginId": "@kbn/core-saved-objects-base-server-internal", - "id": "def-common.HASH_TO_VERSION_MAP.infracustomdashboards6eed22cbe14594bad8c076fa864930de", + "id": "def-common.HASH_TO_VERSION_MAP.infracustomdashboards1eb3c9e1888b8daea8495769e8d3ba2d", "type": "string", "tags": [], - "label": "'infra-custom-dashboards|6eed22cbe14594bad8c076fa864930de'", + "label": "'infra-custom-dashboards|1eb3c9e1888b8daea8495769e8d3ba2d'", "description": [], "path": "packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts", "deprecated": false, 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 462d78fab78d82..91ae12880996e2 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-04-04 +date: 2024-04-05 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 c61445039789bb..66883fcbbdc184 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-04-04 +date: 2024-04-05 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 e85e22f051ad49..569758c6428bf7 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-04-04 +date: 2024-04-05 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 0d1192d79d0cb6..4099c27f32df9f 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-04-04 +date: 2024-04-05 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 9c707d6a57e6b4..86f84f00171688 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index 0ea3d3dfa2bb78..8d0decd21111b9 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1097,6 +1097,10 @@ "plugin": "@kbn/core-saved-objects-api-browser", "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-api-browser", + "path": "packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts" + }, { "plugin": "@kbn/core-saved-objects-api-server", "path": "packages/core/saved-objects/core-saved-objects-api-server/src/saved_objects_repository.ts" @@ -1169,6 +1173,10 @@ "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" }, + { + "plugin": "@kbn/core-saved-objects-browser-internal", + "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts" + }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index d4623bdba78fbf..96554a9192e53b 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-04-04 +date: 2024-04-05 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 40d312c37b9cd7..ecb0096a83329d 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-04-04 +date: 2024-04-05 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 ab77d92a78189f..297e43a93e5a9d 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-04-04 +date: 2024-04-05 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 fd36a4168bfccd..0f34920394d1de 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-04-04 +date: 2024-04-05 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 729ff84c0d140f..bf1e3e9817388d 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index 83494416de5124..1b0d6a4a66507e 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -4594,6 +4594,32 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.ISavedObjectsSecurityExtension.getCurrentUser", + "type": "Function", + "tags": [], + "label": "getCurrentUser", + "description": [ + "\nRetrieves the current user from the request context if available" + ], + "signature": [ + "() => ", + { + "pluginId": "@kbn/core-security-common", + "scope": "common", + "docId": "kibKbnCoreSecurityCommonPluginApi", + "section": "def-common.AuthenticatedUser", + "text": "AuthenticatedUser" + }, + " | null" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/extensions/security.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false @@ -5656,6 +5682,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObject.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [ + "The ID of the user who created this object." + ], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/server_types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-server", "id": "def-common.SavedObject.updated_at", @@ -6515,6 +6557,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObjectDoc.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/serialization.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-server", "id": "def-common.SavedObjectDoc.originId", @@ -8777,6 +8833,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObjectsRawDocSource.created_by", + "type": "string", + "tags": [], + "label": "created_by", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/serialization.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-server", "id": "def-common.SavedObjectsRawDocSource.references", diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 245de363f8d12a..9cdcfb54432f91 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_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 | |-------------------|-----------|------------------------|-----------------| -| 555 | 1 | 130 | 4 | +| 559 | 1 | 132 | 4 | ## Common diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 4ccee9ccbab3ba..249133afa131db 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-04-04 +date: 2024-04-05 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 bb67ee3626efeb..3fa1445c7f7791 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-04-04 +date: 2024-04-05 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 8d4b3a0b966344..9dc22fc70b5bec 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-04-04 +date: 2024-04-05 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 fbf4488be652ab..85cc472ca8907c 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-04-04 +date: 2024-04-05 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 8b9ebcd8b1fb65..5f99ada03dda19 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-04-04 +date: 2024-04-05 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 4300675fc5a20a..bee362e8cba823 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-04-04 +date: 2024-04-05 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 36af7def5bb239..83d60385e24038 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-04-04 +date: 2024-04-05 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 07ba04a09271d9..1711347c8b7c9a 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-04-04 +date: 2024-04-05 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 f9c4df32c45300..8a9b8c0ee871cf 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-04-04 +date: 2024-04-05 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 463106c8b747d2..a3d53db041c49e 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-04-04 +date: 2024-04-05 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 674006b1f0ebb1..7684dacd908ef9 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-04-04 +date: 2024-04-05 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 8fd0765591aa0b..793895e97489e8 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-04-04 +date: 2024-04-05 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 e4668cac2959fd..bbb33fca5b1ba8 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-04-04 +date: 2024-04-05 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 978c6f7ba1d5b4..f5abee77217479 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-04-04 +date: 2024-04-05 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 e8edb84fc12eab..4d5f6b036d3f63 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-04-04 +date: 2024-04-05 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 c6942a05ea8f57..f7d3b7220841d1 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-04-04 +date: 2024-04-05 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 22e021606087a3..3e78e8702eab11 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-04-04 +date: 2024-04-05 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 36da73ba5ffbbc..87aee4b36bf62d 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-04-04 +date: 2024-04-05 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 60401a6fb46a67..0572fdb98d6d06 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-04-04 +date: 2024-04-05 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 bcebdf5a1133fb..f9e0ef62f58fbd 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-04-04 +date: 2024-04-05 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 a83716e5f4a80b..5f9917d7ae5751 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-04-04 +date: 2024-04-05 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 69420c56f191ff..1edfb2a4da96b3 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-04-04 +date: 2024-04-05 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 5df6f20911fb56..1d6d0a18a3516e 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-04-04 +date: 2024-04-05 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 35bd547380be5b..dcbb386707aba7 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-04-04 +date: 2024-04-05 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 fd7e64ea400fe1..ad17b64706e739 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-04-04 +date: 2024-04-05 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 a19d5f0e4b2b6c..3430f1b708f76c 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-04-04 +date: 2024-04-05 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 89476970526f97..733852dbf28027 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-04-04 +date: 2024-04-05 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 bc25f6aa6a7a60..c71391252ee714 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-04-04 +date: 2024-04-05 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 6d476c661a1d27..358bed64431ed8 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-04-04 +date: 2024-04-05 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 479aa7770b9937..e0ad5700280c35 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-04-04 +date: 2024-04-05 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 f6fd603f14ce9c..ca026a001f7f2a 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-04-04 +date: 2024-04-05 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 bf760ef2d47d6d..36082cd582ab19 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-04-04 +date: 2024-04-05 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 fe88e63ef272fb..07c37e09f9af32 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 0634c690bcef46..c19287f7e5a36d 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 3716052ebea223..bd0840de0041b5 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2024-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 2c73beaf0c2969..8a33a9fb68c016 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-04-04 +date: 2024-04-05 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 6a334817778c56..fdcbc65c92f641 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-04-04 +date: 2024-04-05 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 50589caa252ba1..bd03bd88363278 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-04-04 +date: 2024-04-05 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 54070a3c5108ab..c27867129f296e 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-04-04 +date: 2024-04-05 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 875ac804441494..93cb7c24d43f83 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-04-04 +date: 2024-04-05 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 bfe5391766b2f5..375f36fb055e36 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-04-04 +date: 2024-04-05 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 2089200c1760c9..e24e8448cfe8e6 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-04-04 +date: 2024-04-05 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 1f51692316bf55..15b83ad8de80fe 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-04-04 +date: 2024-04-05 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 57dfa6b8fa0368..92497b385d381d 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-04-04 +date: 2024-04-05 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 bfe96b197f1830..9ecf98335f818d 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_datemath.devdocs.json index 71d5b783708c0b..dd5303cfd095e9 100644 --- a/api_docs/kbn_datemath.devdocs.json +++ b/api_docs/kbn_datemath.devdocs.json @@ -200,7 +200,7 @@ "label": "UnitsMap", "description": [], "signature": [ - "{ m: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; y: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; M: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; w: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; d: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; h: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; s: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"calendar\" | \"mixed\"; base: number; }; }" + "{ m: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; y: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; M: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; w: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; d: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; h: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; s: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; ms: { weight: number; type: \"fixed\" | \"mixed\" | \"calendar\"; base: number; }; }" ], "path": "packages/kbn-datemath/index.ts", "deprecated": false, diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index ff84a75362bc39..0376a01f24e611 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-04-04 +date: 2024-04-05 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 7a9edde8062533..131ab78b21d653 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-04-04 +date: 2024-04-05 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 d363fd0104fe49..13d8be1345d8c8 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-04-04 +date: 2024-04-05 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 79b8d02443fb18..36f516a8b2fed3 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-04-04 +date: 2024-04-05 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 ccd07a99ef8ba4..b6318f6bc8cf6c 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-04-04 +date: 2024-04-05 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 c62b74acfa3c01..12a16a4d97ae3f 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-04-04 +date: 2024-04-05 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 f3b38cf83a3d3b..d9e3c3bf01856a 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-04-04 +date: 2024-04-05 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 436280e7a189b4..25aa05b2ac2f69 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-04-04 +date: 2024-04-05 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 94d4e5f0429cf0..28a6ebd40bb842 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-04-04 +date: 2024-04-05 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 fc88f2ed17425a..dbb6b25124b3ca 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-04-04 +date: 2024-04-05 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 1fcd4abedb3ac6..25f6706ddf352b 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-04-04 +date: 2024-04-05 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 7aa1105880d259..dc51623a38396a 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-04-04 +date: 2024-04-05 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 6adaae6d316339..623645175b4839 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-04-04 +date: 2024-04-05 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 3aa69a0090cc4b..b8cb2284489e49 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-04-04 +date: 2024-04-05 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 7bc83a76b2a9ee..b65224f374d866 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-04-04 +date: 2024-04-05 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 0bf6c84e8908d7..2c0055c971f388 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-04-04 +date: 2024-04-05 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 115a65b208745e..18c628720edb4b 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-04-04 +date: 2024-04-05 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 9b17c19a8666d7..d5ff7a4e68cdcd 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-04-04 +date: 2024-04-05 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 c2b9b2465442fd..a229244524d06f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index f502678bb6f95b..103057f60e95a7 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-04-04 +date: 2024-04-05 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 d996e89d037399..e1b7ce0334ca45 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-04-04 +date: 2024-04-05 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 d775d369d3bef5..0264f487638da1 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-04-04 +date: 2024-04-05 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 798a8aa6399e91..4e7c0174611b66 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-04-04 +date: 2024-04-05 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 00246e9acde43c..362b131a5588b1 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-04-04 +date: 2024-04-05 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 5f9c624b36421b..38d2ba2f5ffdba 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-04-04 +date: 2024-04-05 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 ada7ba004907ba..5d48c363b7d9b1 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-04-04 +date: 2024-04-05 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 a48b5c8b84b44c..3db0ab672c9c3a 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 4f300d35a8b9e5..9dfbda5dcc11c8 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-04-04 +date: 2024-04-05 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 e168f6dbf3acf9..c15940686291f5 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-04-04 +date: 2024-04-05 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 dd8329aeddaa4a..df731c6b821584 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-04-04 +date: 2024-04-05 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 a99f31cbfa0c1a..4dbcb3e9f570c2 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-04-04 +date: 2024-04-05 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 3d53027e6d33c9..90683089548fea 100644 --- a/api_docs/kbn_es_types.devdocs.json +++ b/api_docs/kbn_es_types.devdocs.json @@ -236,27 +236,27 @@ "label": "AggregateOf", "description": [], "signature": [ - "Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends readonly any[] ? (readonly any[] & Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends readonly any[] ? (readonly any[] & Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string>)[number] : Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string>)[number] : Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends ArrayLike ? (ArrayLike & Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends ArrayLike ? (ArrayLike & Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string>)[number] : Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string>)[number] : Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends object ? Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string> extends object ? Pick & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationContainer extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationContainer extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationContainer[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationContainer extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationContainer extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationContainer extends { top_hits: ", "AggregationsTopHitsAggregation", "; } ? HitsOf : ", "SearchHitsMetadata", @@ -277,11 +277,13 @@ "signature": [ "{ [TAggregationName in keyof TAggregationMap]: Required[TAggregationName] extends AggregationsAggregationContainer ? ", "ValuesType", - " & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf; composite: { after_key: CompositeKeysOf; buckets: ({ doc_count: number; key: CompositeKeysOf; } & SubAggregateOf)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed, string>; date_range: MaybeKeyed & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf; filters: { buckets: TAggregationMap[TAggregationName] extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf)[] : TAggregationMap[TAggregationName] extends { filters: { filters: Record; }; } ? { [key in keyof TAggregationMap[TAggregationName][\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf; } & (TAggregationMap[TAggregationName] extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record> : unknown) & (TAggregationMap[TAggregationName] extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf)[]; }; global: { doc_count: number; } & SubAggregateOf; histogram: MaybeKeyed, string>; ip_range: MaybeKeyed; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: TAggregationMap[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; } & SubAggregateOf)[]; }; nested: { doc_count: number; } & SubAggregateOf; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf; percentiles: { values: TAggregationMap[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: TAggregationMap[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: TAggregationMap[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf; sampler: { doc_count: number; } & SubAggregateOf; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: TAggregationMap[TAggregationName] extends { top_hits: ", + " & { adjacency_matrix: { buckets: ({ key: string; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; auto_date_histogram: { interval: string; buckets: ({ key: number; key_as_string: string; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; avg: { value: number | null; value_as_string?: string | undefined; }; avg_bucket: { value: number | null; }; boxplot: { min: number | null; max: number | null; q1: number | null; q2: number | null; q3: number | null; }; bucket_correlation: { value: number | null; }; bucket_count_ks_test: { less: number; greater: number; two_sided: number; }; bucket_script: { value: unknown; }; cardinality: { value: number; }; change_point: { bucket?: { key: string; } | undefined; type: Record; }; children: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; composite: { after_key: CompositeKeysOf[TAggregationName]>; buckets: ({ doc_count: number; key: CompositeKeysOf[TAggregationName]>; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; cumulative_cardinality: { value: number; }; cumulative_sum: { value: number; }; date_histogram: MaybeKeyed[TAggregationName], { key: number; key_as_string: string; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>, string>; date_range: MaybeKeyed[TAggregationName], Partial<{ from: string | number; from_as_string: string; }> & Partial<{ to: string | number; to_as_string: string; }> & { doc_count: number; key: string; }, string>; derivative: { value: number | null; } | undefined; extended_stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_of_squares_as_string: string; variance_population_as_string: string; variance_sampling_as_string: string; std_deviation_as_string: string; std_deviation_population_as_string: string; std_deviation_sampling_as_string: string; std_deviation_bounds_as_string: { upper: string; lower: string; upper_population: string; lower_population: string; upper_sampling: string; lower_sampling: string; }; }); extended_stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number | null; sum_of_squares: number | null; variance: number | null; variance_population: number | null; variance_sampling: number | null; std_deviation: number | null; std_deviation_population: number | null; std_deviation_sampling: number | null; std_deviation_bounds: { upper: number | null; lower: number | null; upper_population: number | null; lower_population: number | null; upper_sampling: number | null; lower_sampling: number | null; }; }; filter: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; filters: { buckets: Required[TAggregationName] extends { filters: { filters: any[]; }; } ? ({ doc_count: number; } & SubAggregateOf<{ filters: { filters: any[]; }; } & Required[TAggregationName], TDocument>)[] : Required[TAggregationName] extends { filters: { filters: Record; }; } ? { [key in keyof ({ filters: { filters: Record; }; } & Required[TAggregationName])[\"filters\"][\"filters\"]]: { doc_count: number; } & SubAggregateOf<{ filters: { filters: Record; }; } & Required[TAggregationName], TDocument>; } & ({ filters: { filters: Record; }; } & Required[TAggregationName] extends { filters: { other_bucket_key: infer TOtherBucketKey; }; } ? Record; }; } & Required[TAggregationName], TDocument>> : unknown) & ({ filters: { filters: Record; }; } & Required[TAggregationName] extends { filters: { other_bucket: true; }; } ? { _other: { doc_count: number; } & SubAggregateOf<{ filters: { other_bucket: true; }; } & { filters: { filters: Record; }; } & Required[TAggregationName], TDocument>; } : unknown) : unknown; }; geo_bounds: { top_left: { lat: number | null; lon: number | null; }; bottom_right: { lat: number | null; lon: number | null; }; }; geo_centroid: { count: number; location: { lat: number; lon: number; }; }; geo_distance: MaybeKeyed[TAggregationName], { from: number; to?: number | undefined; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>, string>; geo_hash: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; geotile_grid: { buckets: ({ doc_count: number; key: string; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; global: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; histogram: MaybeKeyed[TAggregationName], { key: number; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>, string>; ip_range: MaybeKeyed[TAggregationName], { key: string; from?: string | undefined; to?: string | undefined; doc_count: number; }, Required[TAggregationName] extends { ip_range: { ranges: (infer TRangeType)[]; }; } ? TRangeType extends { key: infer TKeys; } ? TKeys : string : string>; inference: { value: number; prediction_probability: number; prediction_score: number; }; max: { value: number | null; value_as_string?: string | undefined; }; max_bucket: { value: number | null; }; min: { value: number | null; value_as_string?: string | undefined; }; min_bucket: { value: number | null; }; median_absolute_deviation: { value: number | null; }; moving_avg: { value: number | null; } | undefined; moving_fn: { value: number | null; }; moving_percentiles: Required[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record | undefined; missing: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; multi_terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string[]; key_as_string: string; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; nested: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; normalize: { value: number | null; value_as_string?: string | undefined; }; parent: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; percentiles: { values: Required[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; percentile_ranks: { values: Required[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; percentiles_bucket: { values: Required[TAggregationName] extends Record ? { key: number; value: number | null; }[] : Record; }; range: MaybeKeyed[TAggregationName], { key: string; from?: number | undefined; from_as_string?: string | undefined; to?: number | undefined; to_as_string?: string | undefined; doc_count: number; }, Required[TAggregationName] extends { range: { ranges: (infer TRangeType)[]; }; } ? TRangeType extends { key: infer TKeys; } ? TKeys : string : string>; rare_terms: ({ key: string | number; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>)[]; rate: { value: number | null; }; reverse_nested: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; random_sampler: { seed: number; probability: number; doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; sampler: { doc_count: number; } & SubAggregateOf[TAggregationName], TDocument>; scripted_metric: { value: unknown; }; serial_diff: { value: number | null; value_as_string?: string | undefined; }; significant_terms: { doc_count: number; bg_count: number; buckets: ({ key: string | number; score: number; doc_count: number; bg_count: number; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; significant_text: { doc_count: number; buckets: { key: string; doc_count: number; score: number; bg_count: number; }[]; }; stats: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; } & ({} | { min_as_string: string; max_as_string: string; avg_as_string: string; sum_as_string: string; }); stats_bucket: { count: number; min: number | null; max: number | null; avg: number | null; sum: number; }; string_stats: { count: number; min_length: number | null; max_length: number | null; avg_length: number | null; entropy: number | null; distribution: Record; }; sum: { value: number | null; value_as_string?: string | undefined; }; sum_bucket: { value: number | null; }; terms: { doc_count_error_upper_bound: number; sum_other_doc_count: number; buckets: ({ doc_count: number; key: string | number; key_as_string?: string | undefined; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; categorize_text: { buckets: ({ doc_count: number; key: string | number; regex?: string | undefined; max_matching_length: number; } & SubAggregateOf[TAggregationName], TDocument>)[]; }; top_hits: { hits: { total: { value: number; relation: \"gte\" | \"eq\"; }; max_score: number | null; hits: Required[TAggregationName] extends { top_hits: ", "AggregationsTopHitsAggregation", - "; } ? HitsOf : ", + "; } ? HitsOf<({ top_hits: ", + "AggregationsTopHitsAggregation", + "; } & Required[TAggregationName])[\"top_hits\"], TDocument> : ", "SearchHitsMetadata", - "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude, \"aggs\" | \"aggregations\"> & string>> : never; }" + "; }; }; top_metrics: { top: { sort: string[] | number[]; metrics: Record[TAggregationName]>, string | number | null>; }[]; }; weighted_avg: { value: number | null; }; value_count: { value: number; }; }, Exclude[TAggregationName]>, \"aggs\" | \"aggregations\"> & string>> : never; }" ], "path": "packages/kbn-es-types/src/search.ts", "deprecated": false, diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 36c48028151574..044e28e5429790 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-04-04 +date: 2024-04-05 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 03647410380729..0723a86a3fce7b 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-04-04 +date: 2024-04-05 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 55415b84745287..5719df02c9e9fc 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index 78d80ff2b3b276..8c7213b9cc2788 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-04-04 +date: 2024-04-05 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 862c5704684db0..35a4771356ed9a 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-04-04 +date: 2024-04-05 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 f05a66d2a24e2c..49268deea39395 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-04-04 +date: 2024-04-05 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 c9bd4f82a476ad..cb939c174e8fd1 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 4046094ae7c210..10136eb2e7cfaf 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index ae499595e2b954..cccf22c3934875 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-04-04 +date: 2024-04-05 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 d101b60b49311c..e6f5483900930a 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-04-04 +date: 2024-04-05 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 06b6e671238f03..1ae8a7171470fa 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-04-04 +date: 2024-04-05 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 7deb9c067bd96e..1e506a37295ae9 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-04-04 +date: 2024-04-05 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 853d52a2bc6eb6..21ced2cee2aab8 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-04-04 +date: 2024-04-05 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 ebb9167261b124..77b3fec5fa2662 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-04-04 +date: 2024-04-05 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 fd914174be678f..fa5b29a3892950 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-04-04 +date: 2024-04-05 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 1a632af2c77024..374a60ffa41f53 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-04-04 +date: 2024-04-05 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 05af41c685f6bf..8258548601c4ec 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 809da820858822..d97b5cf2e12695 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-04-04 +date: 2024-04-05 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 7c903a17d7aada..8bd9d36f875f14 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-04-04 +date: 2024-04-05 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 81b1bf4d9e106d..1ac985f82305ca 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-04-04 +date: 2024-04-05 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 b2a8cdd33c908b..f2ce0a1f1ba1a8 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-04-04 +date: 2024-04-05 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 075f38b9d410de..acff31836a3944 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-04-04 +date: 2024-04-05 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 b8ccbe90c48d55..5097873093f278 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-04-04 +date: 2024-04-05 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 5e97b9a4138e82..06c233f35cef4d 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-04-04 +date: 2024-04-05 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 bfa90d0ebd1203..5502ed2bb5a782 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-04-04 +date: 2024-04-05 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 8690685b170fc9..085841bf3fc8a2 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index a9d5f688bf3e1d..528ade2c58d998 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-04-04 +date: 2024-04-05 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 5c48751950efde..b462494d0a764b 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index cf429ed53f4419..df8cb3b022d0f0 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index c759f772fe3d6d..96fe78e49155f8 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-04-04 +date: 2024-04-05 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 4b24845937a164..dad91d5b67c9f5 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-04-04 +date: 2024-04-05 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 113c38b76c5610..3ae8112be83601 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-04-04 +date: 2024-04-05 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 4e5e44c372894a..98df86cd6b4bfb 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-04-04 +date: 2024-04-05 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 c97063b21e0446..9786d5a8d36f97 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-04-04 +date: 2024-04-05 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 bd0aa963eb2ccb..599c593993cc3e 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-04-04 +date: 2024-04-05 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 ad05c192bb3204..95f2f033637b79 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-04-04 +date: 2024-04-05 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 231dacd52e0afc..fcbae396db34c7 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-04-04 +date: 2024-04-05 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 1121bdc707cd33..0cc48b9cdfe3a1 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-04-04 +date: 2024-04-05 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 345f77649c0ee2..b03c1bb1cbe78b 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-04-04 +date: 2024-04-05 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 9dacca27a4f3c2..59ef185faf6574 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-04-04 +date: 2024-04-05 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 1aba8f05c23e4e..dadc831b179626 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-04-04 +date: 2024-04-05 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 dc0469f9dc0084..7f87658116e9db 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-04-04 +date: 2024-04-05 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 2dec840e3a1de4..496e411e6fde7f 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-04-04 +date: 2024-04-05 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 11a9e3d28d3f33..5d0101d69ce0e6 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-04-04 +date: 2024-04-05 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 0b137e6cd5cd5f..a6c9a925e474ce 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-04-04 +date: 2024-04-05 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 bae2cc811b7df1..40fe93841e1c88 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-04-04 +date: 2024-04-05 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 46f9e63de8970d..705aa8b7895566 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-04-04 +date: 2024-04-05 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 dba904f9528faf..368e77d5efd54d 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-04-04 +date: 2024-04-05 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 24735336e3d0a2..2ad6edde6f2735 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-04-04 +date: 2024-04-05 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 fc8c14ec003881..c4ae3671992641 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-04-04 +date: 2024-04-05 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 85911bdbb829e4..961015b0b6855e 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-04-04 +date: 2024-04-05 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 eb74732696292e..47e5d3072ede9d 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-04-04 +date: 2024-04-05 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 d5f37f277b7ae8..80249269c7b581 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-04-04 +date: 2024-04-05 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 aca8d9dbeb6825..2e746c95b40483 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-04-04 +date: 2024-04-05 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 5325d009043521..bd065870f676f8 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_ml_anomaly_utils.devdocs.json index 3b7bcd4009fb1a..1b48327b8d078c 100644 --- a/api_docs/kbn_ml_anomaly_utils.devdocs.json +++ b/api_docs/kbn_ml_anomaly_utils.devdocs.json @@ -3029,7 +3029,7 @@ "\nThe type of the anomaly result, such as bucket, influencer or record." ], "signature": [ - "\"bucket\" | \"record\" | \"influencer\"" + "\"record\" | \"bucket\" | \"influencer\"" ], "path": "x-pack/packages/ml/anomaly_utils/types.ts", "deprecated": false, diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 75baad0d1f8bcc..cfacd68c206336 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-04-04 +date: 2024-04-05 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 0bae960f074a54..2542cb7702d0f6 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-04-04 +date: 2024-04-05 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 56068fa396b936..f2263ab92330b4 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-04-04 +date: 2024-04-05 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 643982ea2ea306..20b52df9fd0ece 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-04-04 +date: 2024-04-05 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 07473e76d437f7..06fc3486ef4514 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-04-04 +date: 2024-04-05 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 bcaaa839007d44..071095d01e1f04 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-04-04 +date: 2024-04-05 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 0b6c34a9fdbf65..7a884181ab37b6 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-04-04 +date: 2024-04-05 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 d7b8398696cd1d..3199210837fec1 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-04-04 +date: 2024-04-05 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 b53360c7ccadf6..9e35cebfe0b8b2 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-04-04 +date: 2024-04-05 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 3ee3aa08de0045..62012c729452c1 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-04-04 +date: 2024-04-05 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 6a38ae0b66927f..e06b055187cf0f 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-04-04 +date: 2024-04-05 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 0309086a9f439b..c2646f0d78e4c0 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-04-04 +date: 2024-04-05 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 5d87ecdae18718..9cdac5d546631e 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-04-04 +date: 2024-04-05 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 bade7d5c590eba..9fa7bdefea71b1 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-04-04 +date: 2024-04-05 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 52c87f0b4a2443..4d7e85827f92e2 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-04-04 +date: 2024-04-05 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 50e6c4b25534c5..7740b47069ec23 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-04-04 +date: 2024-04-05 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 59bf93ceeed8a4..bd43a608142443 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-04-04 +date: 2024-04-05 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 5ea85176ad934c..d40f3eb159ebee 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-04-04 +date: 2024-04-05 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 750b81160af8ec..2c9343e42bf399 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-04-04 +date: 2024-04-05 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 960817e1b3adde..0ceaba218cc5e9 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-04-04 +date: 2024-04-05 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 a1331bc9e2dbac..95798b6d24e44c 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-04-04 +date: 2024-04-05 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 69d339a6c08b0b..ad1e9838e8c042 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_ml_trained_models_utils.devdocs.json index 65b97833c4397e..6b1cb2fe6a2772 100644 --- a/api_docs/kbn_ml_trained_models_utils.devdocs.json +++ b/api_docs/kbn_ml_trained_models_utils.devdocs.json @@ -376,6 +376,22 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/ml-trained-models-utils", + "id": "def-common.InferenceAPIConfigResponse", + "type": "Type", + "tags": [], + "label": "InferenceAPIConfigResponse", + "description": [], + "signature": [ + "{ model_id: string; task_type: \"text_embedding\" | \"sparse_embedding\"; task_settings: { model?: string | undefined; }; } & ", + "InferenceServiceSettings" + ], + "path": "x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/ml-trained-models-utils", "id": "def-common.ModelDefinitionResponse", diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 97070c3e79184d..8db7af49d45002 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 33 | 0 | 28 | 0 | +| 34 | 0 | 29 | 1 | ## Common diff --git a/api_docs/kbn_ml_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index 4d0e9a785da806..96ecae9d186c73 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-04-04 +date: 2024-04-05 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 32bf7b5620576f..d9bc71df015790 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-04-04 +date: 2024-04-05 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 c54dd7288473e1..c233b22e83f3d9 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_monaco.devdocs.json index 73ac68935c52b0..fe022a1f19064a 100644 --- a/api_docs/kbn_monaco.devdocs.json +++ b/api_docs/kbn_monaco.devdocs.json @@ -1066,6 +1066,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.CONSOLE_OUTPUT_LANG_ID", + "type": "string", + "tags": [], + "label": "CONSOLE_OUTPUT_LANG_ID", + "description": [], + "signature": [ + "\"consoleOutput\"" + ], + "path": "packages/kbn-monaco/src/console/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/monaco", + "id": "def-common.CONSOLE_OUTPUT_THEME_ID", + "type": "string", + "tags": [], + "label": "CONSOLE_OUTPUT_THEME_ID", + "description": [], + "signature": [ + "\"consoleOutputTheme\"" + ], + "path": "packages/kbn-monaco/src/console/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/monaco", "id": "def-common.CONSOLE_THEME_ID", diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index ae1f3e76c84406..d8a689e99f0a58 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.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 | |-------------------|-----------|------------------------|-----------------| -| 105 | 0 | 105 | 2 | +| 107 | 0 | 107 | 2 | ## Common diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index baa3046394c042..9192ec4101b4b5 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-04-04 +date: 2024-04-05 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 077592c1465992..06eee8c27d870d 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-04-04 +date: 2024-04-05 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 5cf7f22495d969..aa6f520ca1ae19 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-04-04 +date: 2024-04-05 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 5bf486e596d322..7884e8d6ef5521 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index bcaee509e05243..2e933a398c71d4 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-04-04 +date: 2024-04-05 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 c3260fe04072a4..edd3a3a69adc02 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-04-04 +date: 2024-04-05 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 e92997ef5132bc..4a64a348989872 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-04-04 +date: 2024-04-05 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 efd754475135ca..fa08c85a8ef791 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-04-04 +date: 2024-04-05 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 8d33ca576b58ff..3e19ffbe505cf0 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-04-04 +date: 2024-04-05 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 b0440f78f2aba0..3a299b958caee9 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-04-04 +date: 2024-04-05 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 201b80cad4bd91..e8d36663caad93 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-04-04 +date: 2024-04-05 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 f09389a626dc74..8b9f0d81aedebb 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-04-04 +date: 2024-04-05 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 9a409db7f2bacc..212263a1c0ae66 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-04-04 +date: 2024-04-05 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 55ecd9194bd3b1..95ace0275ac323 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index b6e6bfd5a59dd8..d0f8950bf71354 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.devdocs.json b/api_docs/kbn_presentation_publishing.devdocs.json index 3a4c9ce79e15ac..c91d60103bdc87 100644 --- a/api_docs/kbn_presentation_publishing.devdocs.json +++ b/api_docs/kbn_presentation_publishing.devdocs.json @@ -724,7 +724,7 @@ }, ">" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -738,7 +738,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -846,7 +846,7 @@ "text": "PublishesTimeRange" } ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -860,7 +860,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -886,7 +886,7 @@ "text": "PublishesUnifiedSearch" } ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -900,7 +900,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1088,7 +1088,7 @@ "text": "PublishesWritableUnifiedSearch" } ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1102,7 +1102,7 @@ "signature": [ "unknown" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1437,27 +1437,11 @@ "signature": [ "(rawState: ", "SerializedTimeRange", - ", parentApi?: unknown) => { appliedTimeRange$: ", - { - "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.TimeRange", - "text": "TimeRange" - }, - " | undefined>; cleanupTimeRange: () => void; serializeTimeRange: () => ", + ") => { serialize: () => ", "SerializedTimeRange", - "; timeRangeApi: ", + "; api: ", "PublishesWritableTimeRange", - "; timeRangeComparators: ", + "; comparators: ", { "pluginId": "@kbn/presentation-publishing", "scope": "common", @@ -1469,7 +1453,7 @@ "SerializedTimeRange", ">; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/initialize_time_range.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1483,22 +1467,7 @@ "signature": [ "SerializedTimeRange" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "@kbn/presentation-publishing", - "id": "def-common.initializeTimeRange.$2", - "type": "Unknown", - "tags": [], - "label": "parentApi", - "description": [], - "signature": [ - "unknown" - ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/initialize_time_range.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1580,6 +1549,131 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged", + "type": "Function", + "tags": [], + "label": "onFetchContextChanged", + "description": [], + "signature": [ + "({\n api,\n onFetch,\n fetchOnSetup,\n}: { api: unknown; onFetch: (fetchContext: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.FetchContext", + "text": "FetchContext" + }, + ", isCanceled: () => boolean) => void; fetchOnSetup: boolean; }) => () => void" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1", + "type": "Object", + "tags": [], + "label": "{\n api,\n onFetch,\n fetchOnSetup,\n}", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1.api", + "type": "Unknown", + "tags": [], + "label": "api", + "description": [], + "signature": [ + "unknown" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1.onFetch", + "type": "Function", + "tags": [], + "label": "onFetch", + "description": [], + "signature": [ + "(fetchContext: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.FetchContext", + "text": "FetchContext" + }, + ", isCanceled: () => boolean) => void" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1.onFetch.$1", + "type": "Object", + "tags": [], + "label": "fetchContext", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.FetchContext", + "text": "FetchContext" + } + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1.onFetch.$2", + "type": "Function", + "tags": [], + "label": "isCanceled", + "description": [], + "signature": [ + "() => boolean" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.onFetchContextChanged.$1.fetchOnSetup", + "type": "boolean", + "tags": [], + "label": "fetchOnSetup", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.runComparators", @@ -1982,6 +2076,130 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext", + "type": "Interface", + "tags": [], + "label": "FetchContext", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.isReload", + "type": "boolean", + "tags": [], + "label": "isReload", + "description": [], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.filters", + "type": "Array", + "tags": [], + "label": "filters", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Filter", + "text": "Filter" + }, + "[] | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.query", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.searchSessionId", + "type": "string", + "tags": [], + "label": "searchSessionId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.timeRange", + "type": "Object", + "tags": [], + "label": "timeRange", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.FetchContext.timeslice", + "type": "Object", + "tags": [], + "label": "timeslice", + "description": [], + "signature": [ + "[number, number] | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/presentation-publishing", "id": "def-common.HasDisableTriggers", @@ -4648,7 +4866,7 @@ "tags": [], "label": "PublishesTimeRange", "description": [], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -5012,7 +5230,28 @@ }, " | undefined>; }; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/presentation-publishing", + "id": "def-common.PublishesTimeRange.timeslice$", + "type": "Object", + "tags": [], + "label": "timeslice$", + "description": [], + "signature": [ + { + "pluginId": "@kbn/presentation-publishing", + "scope": "common", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-common.PublishingSubject", + "text": "PublishingSubject" + }, + "<[number, number] | undefined> | undefined" + ], + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false } @@ -5923,7 +6162,7 @@ }, " | undefined>; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -6053,7 +6292,7 @@ }, " | undefined) => void; }" ], - "path": "packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts", + "path": "packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index d0626471ea5dc4..9b57d463292093 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-04-04 +date: 2024-04-05 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 | |-------------------|-----------|------------------------|-----------------| -| 175 | 0 | 146 | 6 | +| 189 | 0 | 160 | 6 | ## Common diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 085ad76d35212a..a44f0f6b4a81dc 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-04-04 +date: 2024-04-05 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 4d27f8261b564e..ad09c4a74bc600 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-04-04 +date: 2024-04-05 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 c2cb99a274fa7d..4ba3bb9192a11c 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index b1a2f9f88ab2b5..dcef7f2489cdba 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-04-04 +date: 2024-04-05 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 60c0ebc7fd828e..3948b84b3aa2e6 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-04-04 +date: 2024-04-05 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 fd7e7cead95801..cdf951e3c9b677 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-04-04 +date: 2024-04-05 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 b7e329eeb9e5ab..f9bf783ce5d2a1 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-04-04 +date: 2024-04-05 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 50d195138b1953..d72dcf4eeed6c8 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-04-04 +date: 2024-04-05 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 ff73488fae6a01..ff892ec95aa65c 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-04-04 +date: 2024-04-05 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 b02e552ac19b00..a0c5a17b86b182 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-04-04 +date: 2024-04-05 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 9c1ec962338fc6..3b57d33f9c8550 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-04-04 +date: 2024-04-05 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 9d6fa8da92d5db..c0e69bbeca12fc 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-04-04 +date: 2024-04-05 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 8c2ddb3a567641..84e8e9c9e4caf4 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-04-04 +date: 2024-04-05 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 7c1a07a7c50960..fdb25e4f251ef6 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index 01a4f7724ecee1..c14cb824f160c5 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-04-04 +date: 2024-04-05 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 c97f1f1ee22f9f..3d981555774360 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-04-04 +date: 2024-04-05 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 83e39d9fc585dc..567ccbb85670f8 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-04-04 +date: 2024-04-05 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 572ee1737ebb8d..053b60a549dd74 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-04-04 +date: 2024-04-05 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 1ed4e788e71ccf..f7968174b463d2 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-04-04 +date: 2024-04-05 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 4639c5f9b21110..07efc4cfc3664a 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-04-04 +date: 2024-04-05 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 c35e7f454981da..51689edd2c5e64 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-04-04 +date: 2024-04-05 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 840bfea76242f4..2346e04fd74489 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-04-04 +date: 2024-04-05 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 87961c55a17fd8..b310f4332271d3 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-04-04 +date: 2024-04-05 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 991be218e40a7b..2c6abd540b83d3 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-04-04 +date: 2024-04-05 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 33cd96ce19fb84..c97a69881ddb11 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 26a8fd5ea9a407..406a4b1e049991 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-04-04 +date: 2024-04-05 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 2a4219f5847b0e..1430b26df252a6 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-04-04 +date: 2024-04-05 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 1a75762ee90f1d..e3ca1a5b15a1a6 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-04-04 +date: 2024-04-05 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 5e38f0ea66e14c..1fa5a5be79c9ad 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-04-04 +date: 2024-04-05 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 55a9386b113d21..99f11cef988b48 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-04-04 +date: 2024-04-05 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 dd6a979950c9ab..a1014d6857cd82 100644 --- a/api_docs/kbn_search_connectors.devdocs.json +++ b/api_docs/kbn_search_connectors.devdocs.json @@ -5161,7 +5161,7 @@ "label": "rule", "description": [], "signature": [ - "\"<\" | \">\" | \"contains\" | \"equals\" | \"regex\" | \"ends_with\" | \"starts_with\"" + "\"contains\" | \"<\" | \">\" | \"equals\" | \"regex\" | \"ends_with\" | \"starts_with\"" ], "path": "packages/kbn-search-connectors/types/connectors.ts", "deprecated": false, @@ -6747,7 +6747,7 @@ "label": "FilteringRuleRule", "description": [], "signature": [ - "\"<\" | \">\" | \"contains\" | \"equals\" | \"regex\" | \"ends_with\" | \"starts_with\"" + "\"contains\" | \"<\" | \">\" | \"equals\" | \"regex\" | \"ends_with\" | \"starts_with\"" ], "path": "packages/kbn-search-connectors/types/connectors.ts", "deprecated": false, diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index d7db1f5c5bb82e..597ee7e1f291c9 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index 39308a3907e975..6bc9f78dd46274 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-04-04 +date: 2024-04-05 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 279bacac4e4eb5..8473854f7a64fe 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-04-04 +date: 2024-04-05 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 ee6a135309faee..69317ba44c81b0 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 393586e4f002f3..ec1b9ffe12451d 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-04-04 +date: 2024-04-05 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 06cce097c2d0a2..208a6630497396 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index baefff4db652cf..c628c5d138e99a 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 3a42a50e3124e0..edf2858ef84f27 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index bcd94b226abe58..3771d22de8db28 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-04-04 +date: 2024-04-05 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 dc6de08b1579d6..016e04982e1d28 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-04-04 +date: 2024-04-05 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 952a6e24b4c317..93432293f271ed 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-04-04 +date: 2024-04-05 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 c81c1d91b980b7..bfefd4376e64cb 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-04-04 +date: 2024-04-05 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 e5c08bc882fbb8..accd22b3cf3df8 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-04-04 +date: 2024-04-05 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 221b86e9d9459a..277caafde4e9a0 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-04-04 +date: 2024-04-05 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 761474fa35b4f9..94a3798142ca00 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-04-04 +date: 2024-04-05 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 1d1efbcbc0912a..04dcad16d743ed 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-04-04 +date: 2024-04-05 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 83db384190940c..cd08648e101f00 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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"html\" | \"stop\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"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\"" ], "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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"html\" | \"stop\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"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\"" ], "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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"html\" | \"stop\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"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\"" ], "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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"stop\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"big\" | \"link\" | \"small\" | \"sub\" | \"sup\" | \"desc\" | \"filter\" | \"text\" | \"map\" | \"head\" | \"slot\" | \"style\" | \"title\" | \"meta\" | \"summary\" | \"data\" | \"pattern\" | \"template\" | \"span\" | \"main\" | \"path\" | \"form\" | \"body\" | \"q\" | \"label\" | \"html\" | \"stop\" | \"progress\" | \"article\" | \"image\" | \"menu\" | \"base\" | React.ComponentType | \"s\" | \"legend\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | \"p\" | \"canvas\" | \"svg\" | \"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\" | \"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\"" ], "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 058513948bce61..7d8bbcaacb1a28 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index fef48d9d8fa259..6316b04bffa6ba 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2024-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index fb99584c32f76d..fdc9d113181afa 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-04-04 +date: 2024-04-05 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 c81df93508ffc4..bf96b5c8619800 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-04-04 +date: 2024-04-05 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 0f6ce10905475d..28934d3507f390 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-04-04 +date: 2024-04-05 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 8f39b614bedfed..9cf9a018646fc0 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-04-04 +date: 2024-04-05 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 0ead90af234afb..d772c0413f5f29 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-04-04 +date: 2024-04-05 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 796936e3a7c90c..a18a57d2fe414e 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-04-04 +date: 2024-04-05 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 7751e76e1486c2..75604b2dec1c23 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-04-04 +date: 2024-04-05 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 e89fb3483ef96a..c7d5a09a7144ea 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-04-04 +date: 2024-04-05 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 e72edd6e3f64c6..c01c4cb7cbd63c 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-04-04 +date: 2024-04-05 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 c4e2508f849247..08a7648500c690 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-04-04 +date: 2024-04-05 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 a5a3256cf2eb08..fef86edf7c4a14 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-04-04 +date: 2024-04-05 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 7ecfa3b9f7551b..3166067a6b0d92 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-04-04 +date: 2024-04-05 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 a44da9905a22b7..de13300e5faef3 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-04-04 +date: 2024-04-05 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 3500b58da09714..727fd9a91df979 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-04-04 +date: 2024-04-05 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 2d8f533492ad48..6845e7d3b240b2 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-04-04 +date: 2024-04-05 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 d111849c9b0caf..4c276902277d33 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-04-04 +date: 2024-04-05 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 e3a6911e188d19..e5ca5276f77673 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-04-04 +date: 2024-04-05 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 e53415ffc6d4ad..39f15d27c84206 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-04-04 +date: 2024-04-05 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 d3061497c3e384..97c463362d740d 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-04-04 +date: 2024-04-05 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 b36a05374e4ad4..cd07aaf707ab4c 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-04-04 +date: 2024-04-05 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 44e96eb41b63f3..99303f2d0aea14 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-04-04 +date: 2024-04-05 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 f4409a9fd49d70..9a139b24e460d6 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-04-04 +date: 2024-04-05 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 38ebe0e8d365d8..186091ec2f38c2 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-04-04 +date: 2024-04-05 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 cb71d663c83707..63f4096327a6c2 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-04-04 +date: 2024-04-05 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 3c633c5d89ad7e..d43365fe5bcb29 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-04-04 +date: 2024-04-05 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 d2ddb5904e7bc6..ec5977512e5e66 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-04-04 +date: 2024-04-05 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 2dbb13fef3daf1..01d7f5635e9d81 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-04-04 +date: 2024-04-05 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 f3c9df941efac1..4fdea9a24943e2 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-04-04 +date: 2024-04-05 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 120ee5326fe936..410452c13d3cad 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-04-04 +date: 2024-04-05 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 7aa9f2e8c39486..e8128bf8f83e3b 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-04-04 +date: 2024-04-05 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 308252a21e0fae..57363b6cd657c5 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-04-04 +date: 2024-04-05 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 d895b89cd5efe6..4e9e616065167e 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-04-04 +date: 2024-04-05 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 bb8f8232039873..88e669bffe8536 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-04-04 +date: 2024-04-05 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 21c0b0a27c5f77..3c2f13f76d567f 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-04-04 +date: 2024-04-05 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 581fc6fa5a6e2e..bb0350ec448984 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-04-04 +date: 2024-04-05 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 c0b6d5d49c8670..9efad1bc383a82 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-04-04 +date: 2024-04-05 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 cb466bcbdec212..fa5965a9911b2d 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-04-04 +date: 2024-04-05 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 065214c7cd46ac..a8839332faca4b 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-04-04 +date: 2024-04-05 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 be392065a5ea9d..6bb6841ad24dbd 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-04-04 +date: 2024-04-05 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 bec0644a901dee..caec4625d0f44e 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-04-04 +date: 2024-04-05 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 32a26509975b76..e4887f35d2711d 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-04-04 +date: 2024-04-05 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 2a7e4bcba520a6..3440272d8307fd 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-04-04 +date: 2024-04-05 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 7c72cac8a4f437..b1ae18d1c019fd 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-04-04 +date: 2024-04-05 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 bb2233e77aa4f9..9773dacaec1826 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-04-04 +date: 2024-04-05 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 4c424e4c5ecb44..60492495522f64 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-04-04 +date: 2024-04-05 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 68272bd2eaed19..71129ae25171e7 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-04-04 +date: 2024-04-05 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 df9cfff4d1273d..61a89906c0e9a4 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-04-04 +date: 2024-04-05 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 503af2d29fa5c6..b6a4111b3f0011 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-04-04 +date: 2024-04-05 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 b10486a2d02aba..5bf028cf03f987 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-04-04 +date: 2024-04-05 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 919155e516c4aa..b0d5671910c957 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-04-04 +date: 2024-04-05 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 7771e78048cc36..8295cc870d76dd 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json index cc154eb46469fc..763a0aea95d8ff 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.devdocs.json @@ -259,7 +259,7 @@ "The background color of the prompt; defaults to `plain`." ], "signature": [ - "\"warning\" | \"success\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"plain\" | \"transparent\" | undefined" + "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined" ], "path": "packages/shared-ux/prompt/no_data_views/types/index.d.ts", "deprecated": false, 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 0bfe3b9b966665..6e20f773ea56d9 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-04-04 +date: 2024-04-05 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 1a825a080a8e3b..8255598196c709 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-04-04 +date: 2024-04-05 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 f86367521fe157..9330685f249ee1 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-04-04 +date: 2024-04-05 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 df2abc50439d7e..a116101c02774c 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-04-04 +date: 2024-04-05 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 b4ec3cf5c7d4a7..741064d528fde4 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-04-04 +date: 2024-04-05 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 ae466643f52205..83502404ad9660 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-04-04 +date: 2024-04-05 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 f9917f4dc1c63b..f68145938360d5 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_shared_ux_tabbed_modal.devdocs.json new file mode 100644 index 00000000000000..75761ef8367a5e --- /dev/null +++ b/api_docs/kbn_shared_ux_tabbed_modal.devdocs.json @@ -0,0 +1,174 @@ +{ + "id": "@kbn/shared-ux-tabbed-modal", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.TabbedModal", + "type": "Function", + "tags": [], + "label": "TabbedModal", + "description": [], + "signature": [ + "({\n tabs,\n defaultSelectedTabId,\n ...rest\n}: Omit<", + "IModalContextProviderProps", + ", \"children\"> & ", + "ITabbedModalInner", + ") => JSX.Element" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.TabbedModal.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n tabs,\n defaultSelectedTabId,\n ...rest\n}", + "description": [], + "signature": [ + "Omit<", + "IModalContextProviderProps", + ", \"children\"> & ", + "ITabbedModalInner" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration", + "type": "Interface", + "tags": [], + "label": "IModalTabDeclaration", + "description": [], + "signature": [ + { + "pluginId": "@kbn/shared-ux-tabbed-modal", + "scope": "common", + "docId": "kibKbnSharedUxTabbedModalPluginApi", + "section": "def-common.IModalTabDeclaration", + "text": "IModalTabDeclaration" + }, + " extends ", + "EuiTabProps", + ",", + "ITabDeclaration", + "" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration.description", + "type": "string", + "tags": [], + "label": "description", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration.datatestsubj", + "type": "string", + "tags": [], + "label": "'data-test-subj'", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration.content", + "type": "Function", + "tags": [], + "label": "content", + "description": [], + "signature": [ + "(props: { state: S; dispatch: ", + "IDispatchFunction", + "; }) => React.ReactElement>" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration.content.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "{ state: S; dispatch: ", + "IDispatchFunction", + "; }" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "@kbn/shared-ux-tabbed-modal", + "id": "def-common.IModalTabDeclaration.modalActionBtn", + "type": "Object", + "tags": [], + "label": "modalActionBtn", + "description": [], + "signature": [ + "IModalTabActionBtn" + ], + "path": "packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_shared_ux_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx new file mode 100644 index 00000000000000..9cb00703da8e3f --- /dev/null +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -0,0 +1,33 @@ +--- +#### +#### 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: kibKbnSharedUxTabbedModalPluginApi +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-04-05 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] +--- +import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 8 | 0 | 8 | 4 | + +## Common + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index d58a7d9f8cfc33..6cd79b19dd9fd4 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index d39f2f91ba63b0..0195d02ade7130 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_analytics.mdx b/api_docs/kbn_solution_nav_analytics.mdx index 28d8abf18fdc5a..a1dc22461ce8ec 100644 --- a/api_docs/kbn_solution_nav_analytics.mdx +++ b/api_docs/kbn_solution_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-analytics title: "@kbn/solution-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-analytics plugin -date: 2024-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-analytics'] --- import kbnSolutionNavAnalyticsObj from './kbn_solution_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_es.mdx b/api_docs/kbn_solution_nav_es.mdx index 0ff3314ab74b02..62aa545f1c9d05 100644 --- a/api_docs/kbn_solution_nav_es.mdx +++ b/api_docs/kbn_solution_nav_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-es title: "@kbn/solution-nav-es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-es plugin -date: 2024-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-es'] --- import kbnSolutionNavEsObj from './kbn_solution_nav_es.devdocs.json'; diff --git a/api_docs/kbn_solution_nav_oblt.mdx b/api_docs/kbn_solution_nav_oblt.mdx index bb488bd9e7c3b2..b3031f019344cb 100644 --- a/api_docs/kbn_solution_nav_oblt.mdx +++ b/api_docs/kbn_solution_nav_oblt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-solution-nav-oblt title: "@kbn/solution-nav-oblt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/solution-nav-oblt plugin -date: 2024-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/solution-nav-oblt'] --- import kbnSolutionNavObltObj from './kbn_solution_nav_oblt.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 6ce7231a37dd09..9e7d0d4ec3e6e0 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-04-04 +date: 2024-04-05 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 c5a67cba6baf83..1ef8f9ae144ec0 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-04-04 +date: 2024-04-05 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 44f7bc1d6ed856..786199eb778b56 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-04-04 +date: 2024-04-05 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 e83d8bbb038db0..c3131c6da19132 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-04-04 +date: 2024-04-05 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 ea165b88d54778..c1ba39dbee788a 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-04-04 +date: 2024-04-05 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 0248db6ee478df..186d1a940e738b 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-04-04 +date: 2024-04-05 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 17abf536d7ba99..f48cf8b8d6563e 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-04-04 +date: 2024-04-05 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 830f9626421d1c..e5bd6481b2c011 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-04-04 +date: 2024-04-05 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 8124fbf9f0203b..bfc0989df2ef7e 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-04-04 +date: 2024-04-05 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 701b77d31236ba..84cb889b1be381 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index d78fd9e6c247db..8afc70baf2fa87 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 07874c39c4fdac..100f4a6c67e46d 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-04-04 +date: 2024-04-05 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 51f662a999b49f..2e4c1b439c0e95 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-04-04 +date: 2024-04-05 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 3edf31b7f96d34..d31e33edc8740e 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 1d20b5580aa750..6768690aa0b9b1 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-04-04 +date: 2024-04-05 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 2c549752c40250..54a9112db5bb85 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-04-04 +date: 2024-04-05 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 62af66f76ebd15..2812dcce5914db 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-04-04 +date: 2024-04-05 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 840ff6765832f7..2ccc1922427172 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_ui_theme.devdocs.json index f7b49a9d755a3a..1d1fb378e9a9ea 100644 --- a/api_docs/kbn_ui_theme.devdocs.json +++ b/api_docs/kbn_ui_theme.devdocs.json @@ -79,11 +79,11 @@ }, { "plugin": "@kbn/monaco", - "path": "packages/kbn-monaco/src/console/theme.ts" + "path": "packages/kbn-monaco/src/console/theme/shared.ts" }, { "plugin": "@kbn/monaco", - "path": "packages/kbn-monaco/src/console/theme.ts" + "path": "packages/kbn-monaco/src/console/theme/shared.ts" }, { "plugin": "securitySolution", diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index a8396dd90b58cb..782461e364dee1 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index 5759c30ef5c9c2..43f3883dcbd64f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index 661fc1ed27596d..df447f3b5dd70c 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_unified_field_list.devdocs.json index 33652a3831e490..b0e81999d5b6ae 100644 --- a/api_docs/kbn_unified_field_list.devdocs.json +++ b/api_docs/kbn_unified_field_list.devdocs.json @@ -4105,7 +4105,7 @@ "label": "type", "description": [], "signature": [ - "\"other\" | \"normal\" | undefined" + "\"normal\" | \"other\" | undefined" ], "path": "packages/kbn-unified-field-list/src/components/field_stats/field_top_values_bucket.tsx", "deprecated": false, diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 42760972fc799d..3506e8de784e6c 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-04-04 +date: 2024-04-05 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 98796e825f38d7..15b82b4060a89f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index a1addde0e20f6c..f7c8491e481fc9 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-04-04 +date: 2024-04-05 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.devdocs.json b/api_docs/kbn_user_profile_components.devdocs.json index 9194672b1b8846..aa2231d1ee83cc 100644 --- a/api_docs/kbn_user_profile_components.devdocs.json +++ b/api_docs/kbn_user_profile_components.devdocs.json @@ -878,6 +878,14 @@ "section": "def-common.ThemeServiceSetup", "text": "ThemeServiceSetup" }, + "; i18n: ", + { + "pluginId": "@kbn/core-i18n-browser", + "scope": "common", + "docId": "kibKbnCoreI18nBrowserPluginApi", + "section": "def-common.I18nStart", + "text": "I18nStart" + }, "; }" ], "path": "packages/kbn-user-profile-components/src/services.tsx", @@ -910,9 +918,15 @@ "\nHandler from the '@kbn/kibana-react-plugin/public' Plugin\n\n```\nimport { toMountPoint } from '@kbn/kibana-react-plugin/public';\n```" ], "signature": [ - "(node: React.ReactNode, options?: { theme$: ", - "Observable", - "<{ readonly darkMode: boolean; }>; } | undefined) => ", + "(node: React.ReactNode, params: ", + { + "pluginId": "@kbn/react-kibana-mount", + "scope": "common", + "docId": "kibKbnReactKibanaMountPluginApi", + "section": "def-common.ToMountPointParams", + "text": "ToMountPointParams" + }, + ") => ", { "pluginId": "@kbn/core-mount-utils-browser", "scope": "common", @@ -925,6 +939,7 @@ "path": "packages/kbn-user-profile-components/src/services.tsx", "deprecated": false, "trackAdoption": false, + "returnComment": [], "children": [ { "parentPluginId": "@kbn/user-profile-components", @@ -934,43 +949,51 @@ "label": "node", "description": [], "signature": [ - "React.ReactNode" + "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" ], - "path": "packages/kbn-user-profile-components/src/services.tsx", + "path": "packages/react/kibana_mount/to_mount_point.tsx", "deprecated": false, - "trackAdoption": false, - "isRequired": false + "trackAdoption": false }, { "parentPluginId": "@kbn/user-profile-components", "id": "def-common.UserProfilesKibanaDependencies.toMountPoint.$2", "type": "Object", "tags": [], - "label": "options", + "label": "params", "description": [], - "path": "packages/kbn-user-profile-components/src/services.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ + "signature": [ + "{ i18n: ", + { + "pluginId": "@kbn/core-i18n-browser", + "scope": "common", + "docId": "kibKbnCoreI18nBrowserPluginApi", + "section": "def-common.I18nStart", + "text": "I18nStart" + }, + "; analytics?: ", + { + "pluginId": "@kbn/core-analytics-browser", + "scope": "common", + "docId": "kibKbnCoreAnalyticsBrowserPluginApi", + "section": "def-common.AnalyticsServiceStart", + "text": "AnalyticsServiceStart" + }, + " | undefined; theme: ", { - "parentPluginId": "@kbn/user-profile-components", - "id": "def-common.UserProfilesKibanaDependencies.toMountPoint.$2.theme$", - "type": "Object", - "tags": [], - "label": "theme$", - "description": [], - "signature": [ - "Observable", - "<{ readonly darkMode: boolean; }>" - ], - "path": "packages/kbn-user-profile-components/src/services.tsx", - "deprecated": false, - "trackAdoption": false - } - ] + "pluginId": "@kbn/react-kibana-context-common", + "scope": "common", + "docId": "kibKbnReactKibanaContextCommonPluginApi", + "section": "def-common.ThemeServiceStart", + "text": "ThemeServiceStart" + }, + "; }" + ], + "path": "packages/react/kibana_mount/to_mount_point.tsx", + "deprecated": false, + "trackAdoption": false } - ], - "returnComment": [] + ] } ], "initialIsOpen": false diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 1f66a40080df9b..9b814aa7ab1ae2 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.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 | |-------------------|-----------|------------------------|-----------------| -| 81 | 1 | 22 | 2 | +| 80 | 1 | 21 | 2 | ## Common diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index b772aca3e51f63..2931f1e8f5b274 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-04-04 +date: 2024-04-05 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 811195569e83b1..c051580312e818 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-04-04 +date: 2024-04-05 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 1db14aff3bbed4..a4a1a6151f14b4 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.devdocs.json b/api_docs/kbn_visualization_ui_components.devdocs.json index 6b12deb3220203..23856ff369c198 100644 --- a/api_docs/kbn_visualization_ui_components.devdocs.json +++ b/api_docs/kbn_visualization_ui_components.devdocs.json @@ -441,7 +441,7 @@ "label": "DragDropBuckets", "description": [], "signature": [ - "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"plain\" | \"transparent\" | undefined; }) => JSX.Element" + "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined; }) => JSX.Element" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, @@ -553,7 +553,7 @@ "label": "bgColor", "description": [], "signature": [ - "\"warning\" | \"success\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"plain\" | \"transparent\" | undefined" + "\"warning\" | \"success\" | \"plain\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | undefined" ], "path": "packages/kbn-visualization-ui-components/components/drag_drop_bucket/buckets.tsx", "deprecated": false, diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index d67312c4588314..2b107ae66cd43c 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-04-04 +date: 2024-04-05 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 9b13e088e96da2..0183ad36cef9c8 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-04-04 +date: 2024-04-05 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 abdd8ecf6dffd8..fef0795bc1a0b3 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-04-04 +date: 2024-04-05 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 9b4e8d63968b5b..4d5ce54eabf1bf 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-04-04 +date: 2024-04-05 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 6b52c577922c01..ba1fe795660614 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-04-04 +date: 2024-04-05 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 856e5e22efca7d..7288db16c5cf82 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index bdc3a33ad9ca10..43fbab84ee60c2 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -511,18 +511,6 @@ "deprecated": true, "trackAdoption": false, "references": [ - { - "plugin": "share", - "path": "src/plugins/share/public/services/share_menu_manager.tsx" - }, - { - "plugin": "share", - "path": "src/plugins/share/public/services/share_menu_manager.tsx" - }, - { - "plugin": "share", - "path": "src/plugins/share/public/services/share_menu_manager.tsx" - }, { "plugin": "uiActions", "path": "src/plugins/ui_actions/public/context_menu/open_context_menu.tsx" @@ -711,18 +699,6 @@ "plugin": "security", "path": "x-pack/plugins/security/public/management/role_mappings/role_mappings_management_app.tsx" }, - { - "plugin": "security", - "path": "x-pack/plugins/security/public/account_management/account_management_app.tsx" - }, - { - "plugin": "security", - "path": "x-pack/plugins/security/public/account_management/account_management_app.tsx" - }, - { - "plugin": "security", - "path": "x-pack/plugins/security/public/account_management/account_management_app.tsx" - }, { "plugin": "security", "path": "x-pack/plugins/security/public/authentication/access_agreement/access_agreement_page.tsx" @@ -1946,6 +1922,76 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.Markdown", + "type": "Function", + "tags": [], + "label": "Markdown", + "description": [], + "signature": [ + "(props: ", + "MarkdownProps", + ") => JSX.Element" + ], + "path": "src/plugins/kibana_react/public/markdown/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.Markdown.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "MarkdownProps" + ], + "path": "src/plugins/kibana_react/public/markdown/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "kibanaReact", + "id": "def-public.MarkdownSimple", + "type": "Function", + "tags": [], + "label": "MarkdownSimple", + "description": [], + "signature": [ + "(props: ", + "MarkdownSimpleProps", + ") => JSX.Element" + ], + "path": "src/plugins/kibana_react/public/markdown/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "kibanaReact", + "id": "def-public.MarkdownSimple.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "MarkdownSimpleProps" + ], + "path": "src/plugins/kibana_react/public/markdown/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "kibanaReact", "id": "def-public.NoDataCard", @@ -2446,14 +2492,6 @@ "plugin": "licensing", "path": "x-pack/plugins/licensing/public/expired_banner.tsx" }, - { - "plugin": "security", - "path": "x-pack/plugins/security/public/account_management/account_management_app.tsx" - }, - { - "plugin": "security", - "path": "x-pack/plugins/security/public/account_management/account_management_app.tsx" - }, { "plugin": "security", "path": "x-pack/plugins/security/public/session/session_expiration_toast.tsx" @@ -2462,14 +2500,6 @@ "plugin": "security", "path": "x-pack/plugins/security/public/session/session_expiration_toast.tsx" }, - { - "plugin": "navigation", - "path": "src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx" - }, - { - "plugin": "navigation", - "path": "src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/utils/saved_objects_utils/confirm_modal_promise.tsx" @@ -2606,14 +2636,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx" }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx" - }, { "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_listing/dashboard_listing_table.tsx" @@ -2698,14 +2720,6 @@ "plugin": "cases", "path": "x-pack/plugins/cases/public/common/use_cases_toast.tsx" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx" - }, { "plugin": "cases", "path": "x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.tsx" @@ -3070,14 +3084,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/bulk_actions/use_bulk_actions.tsx" }, - { - "plugin": "cloudLinks", - "path": "x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx" - }, - { - "plugin": "cloudLinks", - "path": "x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx" - }, { "plugin": "synthetics", "path": "x-pack/plugins/observability_solution/synthetics/public/apps/synthetics/state/monitor_list/toast_title.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 85338ba86ee788..bbcf0cb98ac0c7 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.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 | |-------------------|-----------|------------------------|-----------------| -| 149 | 0 | 117 | 1 | +| 153 | 0 | 121 | 3 | ## Client diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index e8d0362e5fa55b..dc72c95ea3e6de 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-04-04 +date: 2024-04-05 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 973984bc1ca4f7..1610e8acad8ba8 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-04-04 +date: 2024-04-05 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 8f8fcc6f6d91fa..71907198d393a2 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -1297,7 +1297,7 @@ "label": "mode", "description": [], "signature": [ - "\"full\" | \"custom\" | \"dataBounds\"" + "\"custom\" | \"full\" | \"dataBounds\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -5464,7 +5464,7 @@ "label": "changeType", "description": [], "signature": [ - "\"layers\" | \"initial\" | \"unchanged\" | \"reduced\" | \"extended\" | \"reorder\"" + "\"extended\" | \"layers\" | \"initial\" | \"unchanged\" | \"reduced\" | \"reorder\"" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -5755,7 +5755,7 @@ "\nThe change type indicates what was changed in this table compared to the currently active table of this layer." ], "signature": [ - "\"layers\" | \"initial\" | \"unchanged\" | \"reduced\" | \"extended\" | \"reorder\"" + "\"extended\" | \"layers\" | \"initial\" | \"unchanged\" | \"reduced\" | \"reorder\"" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -6696,7 +6696,15 @@ "signature": [ "((state: T, layerId: string, type: ", "LayerType", - ", indexPatternId: string, extraArg?: ExtraAppendLayerArg | undefined) => T) | undefined" + ", indexPatternId: string, extraArg?: ExtraAppendLayerArg | undefined, seriesType?: ", + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.SeriesType", + "text": "SeriesType" + }, + " | undefined) => T) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -6776,6 +6784,28 @@ "deprecated": false, "trackAdoption": false, "isRequired": false + }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.appendLayer.$6", + "type": "CompoundType", + "tags": [], + "label": "seriesType", + "description": [], + "signature": [ + { + "pluginId": "visualizations", + "scope": "common", + "docId": "kibVisualizationsPluginApi", + "section": "def-common.SeriesType", + "text": "SeriesType" + }, + " | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -7880,7 +7910,7 @@ "label": "getAddLayerButtonComponent", "description": [], "signature": [ - "((props: AddLayerButtonProps) => React.ReactElement> | null) | undefined" + "((props: AddLayerButtonProps) => React.ReactElement, string | React.JSXElementConstructor> | null) | undefined" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -7894,7 +7924,7 @@ "label": "props", "description": [], "signature": [ - "AddLayerButtonProps" + "AddLayerButtonProps" ], "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, @@ -10600,7 +10630,7 @@ "label": "AxisExtentMode", "description": [], "signature": [ - "\"full\" | \"custom\" | \"dataBounds\"" + "\"custom\" | \"full\" | \"dataBounds\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, @@ -11917,7 +11947,7 @@ "label": "YScaleType", "description": [], "signature": [ - "\"log\" | \"time\" | \"linear\" | \"sqrt\"" + "\"log\" | \"sqrt\" | \"time\" | \"linear\"" ], "path": "src/plugins/chart_expressions/expression_xy/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index e84fba71cf1206..42aca5451e38ca 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.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 | |-------------------|-----------|------------------------|-----------------| -| 669 | 0 | 568 | 61 | +| 670 | 0 | 569 | 61 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 067cc8a22d4200..c31c001083aff3 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-04-04 +date: 2024-04-05 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 05a303da90ba00..16de8eeebfc524 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-04-04 +date: 2024-04-05 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 2f9af1a4f9fe1a..82ce36f2348cf8 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-04-04 +date: 2024-04-05 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 6ac5f7264ebe69..0e68596573a50a 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-04-04 +date: 2024-04-05 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 443f49f9913eef..9ec5c057ba1c28 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 6a0e9e6779584c..d7b67cd50882b9 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-04-04 +date: 2024-04-05 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 adf38c1b0b049a..91031a315e24c4 100644 --- a/api_docs/logs_shared.devdocs.json +++ b/api_docs/logs_shared.devdocs.json @@ -6002,7 +6002,7 @@ "label": "LogEntryAfterCursor", "description": [], "signature": [ - "{ after: { time: string; tiebreaker: number; } | \"first\"; }" + "{ after: \"first\" | { time: string; tiebreaker: number; }; }" ], "path": "x-pack/plugins/observability_solution/logs_shared/common/log_entry/log_entry_cursor.ts", "deprecated": false, diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 63710c8a5f6326..d14d242932a4c3 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index edc765fee890c0..635e557103b943 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 84bd208f7ca171..f202ceec5d7c1c 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-04-04 +date: 2024-04-05 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 25a02e9e540e9b..7d385707c7c0dd 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-04-04 +date: 2024-04-05 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 c7baaf19284e28..674a4939a66c99 100644 --- a/api_docs/metrics_data_access.devdocs.json +++ b/api_docs/metrics_data_access.devdocs.json @@ -670,7 +670,7 @@ "label": "awsEC2SnapshotMetricTypes", "description": [], "signature": [ - "(\"rx\" | \"tx\" | \"cpu\" | \"diskIOReadBytes\" | \"diskIOWriteBytes\")[]" + "(\"tx\" | \"rx\" | \"cpu\" | \"diskIOReadBytes\" | \"diskIOWriteBytes\")[]" ], "path": "x-pack/plugins/metrics_data_access/common/inventory_models/aws_ec2/metrics/index.ts", "deprecated": false, @@ -730,7 +730,7 @@ "label": "containerSnapshotMetricTypes", "description": [], "signature": [ - "(\"memory\" | \"rx\" | \"tx\" | \"cpu\")[]" + "(\"memory\" | \"tx\" | \"rx\" | \"cpu\")[]" ], "path": "x-pack/plugins/metrics_data_access/common/inventory_models/container/metrics/index.ts", "deprecated": false, @@ -745,7 +745,7 @@ "label": "hostSnapshotMetricTypes", "description": [], "signature": [ - "(\"memory\" | \"rx\" | \"normalizedLoad1m\" | \"memoryFree\" | \"tx\" | \"logRate\" | \"cpu\" | \"diskLatency\" | \"diskSpaceUsage\" | \"load\" | \"memoryTotal\")[]" + "(\"memory\" | \"tx\" | \"rx\" | \"normalizedLoad1m\" | \"memoryFree\" | \"logRate\" | \"cpu\" | \"diskLatency\" | \"diskSpaceUsage\" | \"load\" | \"memoryTotal\")[]" ], "path": "x-pack/plugins/metrics_data_access/common/inventory_models/host/metrics/index.ts", "deprecated": false, @@ -1382,7 +1382,7 @@ "label": "podSnapshotMetricTypes", "description": [], "signature": [ - "(\"memory\" | \"rx\" | \"tx\" | \"cpu\")[]" + "(\"memory\" | \"tx\" | \"rx\" | \"cpu\")[]" ], "path": "x-pack/plugins/metrics_data_access/common/inventory_models/kubernetes/pod/metrics/index.ts", "deprecated": false, @@ -1397,7 +1397,7 @@ "label": "SnapshotMetricType", "description": [], "signature": [ - "\"count\" | \"custom\" | \"memory\" | \"rx\" | \"normalizedLoad1m\" | \"memoryFree\" | \"tx\" | \"logRate\" | \"cpu\" | \"s3BucketSize\" | \"s3NumberOfObjects\" | \"s3TotalRequests\" | \"s3UploadBytes\" | \"s3DownloadBytes\" | \"diskLatency\" | \"diskSpaceUsage\" | \"load\" | \"memoryTotal\" | \"diskIOReadBytes\" | \"diskIOWriteBytes\" | \"rdsLatency\" | \"rdsConnections\" | \"rdsQueriesExecuted\" | \"rdsActiveTransactions\" | \"sqsMessagesVisible\" | \"sqsMessagesDelayed\" | \"sqsMessagesEmpty\" | \"sqsMessagesSent\" | \"sqsOldestMessage\"" + "\"count\" | \"memory\" | \"custom\" | \"tx\" | \"rx\" | \"normalizedLoad1m\" | \"memoryFree\" | \"logRate\" | \"cpu\" | \"s3BucketSize\" | \"s3NumberOfObjects\" | \"s3TotalRequests\" | \"s3UploadBytes\" | \"s3DownloadBytes\" | \"diskLatency\" | \"diskSpaceUsage\" | \"load\" | \"memoryTotal\" | \"diskIOReadBytes\" | \"diskIOWriteBytes\" | \"rdsLatency\" | \"rdsConnections\" | \"rdsQueriesExecuted\" | \"rdsActiveTransactions\" | \"sqsMessagesVisible\" | \"sqsMessagesDelayed\" | \"sqsMessagesEmpty\" | \"sqsMessagesSent\" | \"sqsOldestMessage\"" ], "path": "x-pack/plugins/metrics_data_access/common/inventory_models/types.ts", "deprecated": false, diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 9a22c53a1e18cd..914c7fdbd68f93 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-04-04 +date: 2024-04-05 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 f2b2a33589b9d8..7f8c9ac024dd61 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -2165,7 +2165,7 @@ "label": "AlertingService", "description": [], "signature": [ - "{ preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", + "{ preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", "AnomalyDetectionRuleState", " | undefined) => Promise<{ payload: ", "AnomalyDetectionAlertPayload", @@ -2474,7 +2474,7 @@ "section": "def-common.KibanaRequest", "text": "KibanaRequest" }, - "): { preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"bucket\" | \"record\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", + "): { preview: (args_0: Readonly<{} & { timeRange: string; alertParams: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>; sampleSize: number; }>) => Promise; execute: (params: Readonly<{} & { severity: number; jobSelection: Readonly<{} & { groupIds: string[]; jobIds: string[]; }>; resultType: \"record\" | \"bucket\" | \"influencer\"; includeInterim: boolean; lookbackInterval: string | null; topNBuckets: number | null; }>, spaceId: string, state?: ", "AnomalyDetectionRuleState", " | undefined) => Promise<{ payload: ", "AnomalyDetectionAlertPayload", diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index fa36202150f45f..21005c5ffaec79 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-04-04 +date: 2024-04-05 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 1b3cfc9d17731a..2265cf0d533a7d 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-04-04 +date: 2024-04-05 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 f3a4d455cb2778..e9b0ae364d1e94 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-04-04 +date: 2024-04-05 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 c31119d0da2b6c..584d178d4328d8 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-04-04 +date: 2024-04-05 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 59b8acd7c588cc..2b15141118802a 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-04-04 +date: 2024-04-05 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 50764899cb974e..3d90aa912fb5b9 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-04-04 +date: 2024-04-05 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 4cc4219f8293c1..293a2a7fc1cfd2 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-04-04 +date: 2024-04-05 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 e76cba7addeb6d..0afa11cb7d9988 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-04-04 +date: 2024-04-05 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 3e9a4958240bb8..6ef7f0dfa28522 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -8450,7 +8450,7 @@ "label": "options", "description": [], "signature": [ - "{ tags: string[]; access?: \"public\" | \"internal\" | undefined; }" + "{ tags: string[]; access?: \"internal\" | \"public\" | undefined; }" ], "path": "x-pack/plugins/observability_solution/observability/server/routes/types.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index b72bbccc1cd6d8..465a131d0fae6b 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-04-04 +date: 2024-04-05 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 c8bbfbd5080ef5..fb609b87644e8e 100644 --- a/api_docs/observability_a_i_assistant.devdocs.json +++ b/api_docs/observability_a_i_assistant.devdocs.json @@ -237,6 +237,146 @@ "returnComment": [], "initialIsOpen": false }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionRequestMessage", + "type": "Function", + "tags": [], + "label": "createFunctionRequestMessage", + "description": [], + "signature": [ + "({\n name,\n args,\n}: { name: string; args: unknown; }) => ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.MessageAddEvent", + "text": "MessageAddEvent" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionRequestMessage.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n args,\n}", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionRequestMessage.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionRequestMessage.$1.args", + "type": "Unknown", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_request_message.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionResponseMessage", + "type": "Function", + "tags": [], + "label": "createFunctionResponseMessage", + "description": [], + "signature": [ + "({\n name,\n content,\n data,\n}: { name: string; content: unknown; data?: unknown; }) => ", + { + "pluginId": "observabilityAIAssistant", + "scope": "common", + "docId": "kibObservabilityAIAssistantPluginApi", + "section": "def-common.MessageAddEvent", + "text": "MessageAddEvent" + } + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionResponseMessage.$1", + "type": "Object", + "tags": [], + "label": "{\n name,\n content,\n data,\n}", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionResponseMessage.$1.name", + "type": "string", + "tags": [], + "label": "name", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionResponseMessage.$1.content", + "type": "Unknown", + "tags": [], + "label": "content", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityAIAssistant", + "id": "def-public.createFunctionResponseMessage.$1.data", + "type": "Unknown", + "tags": [], + "label": "data", + "description": [], + "signature": [ + "unknown" + ], + "path": "x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/create_function_response_message.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "observabilityAIAssistant", "id": "def-public.createScreenContextAction", diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index 996929746fa096..d8951dfe5e4d45 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.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 | |-------------------|-----------|------------------------|-----------------| -| 233 | 1 | 231 | 25 | +| 242 | 1 | 240 | 25 | ## Client diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 6731dbe9fd64f8..40e6a2710bac60 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index da25ab0c9e3fa0..a8730c39147dc6 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-04-04 +date: 2024-04-05 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 48efed82852a3a..d1ce1a13174349 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-04-04 +date: 2024-04-05 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 5b7c1aacd0581e..f08d554f4d46ab 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-04-04 +date: 2024-04-05 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 98589c5564d4c1..46edd5952b8367 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-04-04 +date: 2024-04-05 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 1dfe00f613e423..c5ef2cd51f5d7c 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-04-04 +date: 2024-04-05 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 98c88fcc7c8f10..e36df22955a492 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-04-04 +date: 2024-04-05 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 b2c969b843bd26..a9087829ca65d9 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-04-04 +date: 2024-04-05 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 | |--------------|----------|------------------------| -| 777 | 666 | 41 | +| 779 | 668 | 41 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 46826 | 234 | 35535 | 1806 | +| 46881 | 234 | 35583 | 1816 | ## Plugin Directory @@ -32,7 +32,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 67 | 0 | 4 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 854 | 1 | 822 | 54 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 125 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 127 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 9 | 0 | 9 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Asset manager plugin for entity assets (inventory, topology, etc) | 9 | 0 | 9 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | @@ -56,11 +56,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 108 | 0 | 105 | 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. | 3283 | 31 | 2619 | 23 | +| | [@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. | 3285 | 31 | 2619 | 23 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | 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. | 1069 | 0 | 370 | 4 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | 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. | 1070 | 0 | 370 | 4 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 31 | 3 | 25 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin introduces the concept of dataset quality, where users can easily get an overview on the datasets they have. | 10 | 0 | 10 | 5 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 15 | 0 | 9 | 2 | @@ -68,7 +68,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 35 | 0 | 33 | 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 | 45 | 0 | 31 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 559 | 1 | 453 | 10 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 559 | 1 | 453 | 8 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 23 | 0 | 23 | 1 | | | [@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/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 5 | 0 | 5 | 0 | @@ -96,7 +96,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 1233 | 3 | 1113 | 57 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1235 | 3 | 1115 | 59 | | 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 | @@ -114,11 +114,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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/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) | - | 149 | 0 | 117 | 1 | +| | [@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 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 609 | 3 | 416 | 9 | | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 669 | 0 | 568 | 61 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 670 | 0 | 569 | 61 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | @@ -140,7 +140,7 @@ 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) | - | 670 | 2 | 661 | 14 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 233 | 1 | 231 | 25 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 242 | 1 | 240 | 25 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 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. | 21 | 0 | 21 | 1 | @@ -166,6 +166,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 32 | 0 | 8 | 4 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin hosting shared features for connectors | 19 | 0 | 19 | 3 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. | 4 | 0 | 4 | 0 | | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | - | 15 | 0 | 9 | 0 | | 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. | 409 | 0 | 199 | 2 | @@ -193,7 +194,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 240 | 1 | 196 | 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 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 592 | 1 | 566 | 59 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 592 | 1 | 566 | 60 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 149 | 0 | 103 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 212 | 0 | 145 | 11 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains services reliant on the plugin lifecycle for the unified doc viewer component (see @kbn/unified-doc-viewer). | 10 | 0 | 7 | 2 | @@ -245,7 +246,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) | - | 44 | 0 | 44 | 8 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 189 | 0 | 189 | 28 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 191 | 0 | 191 | 28 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-qa](https://github.com/orgs/elastic/teams/kibana-qa) | - | 12 | 0 | 12 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 4 | 0 | 1 | 0 | @@ -388,8 +389,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 2 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 25 | 1 | 24 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 111 | 1 | 0 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 353 | 1 | 5 | 2 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 112 | 1 | 0 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 354 | 1 | 5 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 223 | 0 | 180 | 11 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | @@ -401,7 +402,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 128 | 0 | 94 | 45 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 555 | 1 | 130 | 4 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 559 | 1 | 132 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 72 | 0 | 71 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 14 | 0 | 14 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 6 | 0 | @@ -555,11 +556,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 8 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 2 | 0 | 1 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 34 | 0 | 0 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 33 | 0 | 28 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 34 | 0 | 29 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 18 | 0 | 18 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 31 | 1 | 24 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 22 | 0 | 16 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 105 | 0 | 105 | 2 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 107 | 0 | 107 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 55 | 1 | 50 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 10 | 0 | 10 | 2 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 99 | 1 | 99 | 0 | @@ -575,7 +576,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 41 | 0 | 40 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 175 | 0 | 146 | 6 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 189 | 0 | 160 | 6 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 161 | 0 | 48 | 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 | @@ -682,6 +683,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 1 | 0 | 1 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 15 | 0 | 4 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 8 | 0 | 8 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 16 | 0 | 6 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 165 | 0 | 165 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 6 | 0 | @@ -711,7 +713,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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 | 293 | 0 | 269 | 10 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 13 | 0 | 9 | 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 | 22 | 2 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 80 | 1 | 21 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 37 | 0 | 16 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 26 | 0 | 15 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 3f0cb50d04aa52..fc5f0ffca44c5f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 78c7e422c2c073..9d16c1911c559b 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-04-04 +date: 2024-04-05 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 0a433c5ff67b93..33271d6d6f4f98 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-04-04 +date: 2024-04-05 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 19afdd47bd3b56..7ac3df644c473d 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-04-04 +date: 2024-04-05 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 7f34640f1f465d..52ee123fe15b63 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-04-04 +date: 2024-04-05 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 75e609bb9a051e..89f9eef6e9c0b6 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-04-04 +date: 2024-04-05 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 12ba8df32349c1..bb2015b2d5c7d9 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-04-04 +date: 2024-04-05 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 ff8c85c70c4b8e..e440d3dfeb0415 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-04-04 +date: 2024-04-05 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 f5f4254a031a83..703b7d805600ef 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-04-04 +date: 2024-04-05 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 29316e8b2cfe88..b558ee98572e71 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-04-04 +date: 2024-04-05 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 922b2a606d5c7d..fefb1e7aedc64c 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-04-04 +date: 2024-04-05 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 28a24ca68ff70d..1b4950344b9919 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-04-04 +date: 2024-04-05 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 7edc5f7c1fbb9d..b4b998900a6629 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-04-04 +date: 2024-04-05 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 6ec60421384772..be9ca3a27e6783 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-04-04 +date: 2024-04-05 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 f5c14302f4216e..8a5253bce3d5a4 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-04-04 +date: 2024-04-05 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 9a4ff9dcde820d..55e6501fdb9c19 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-04-04 +date: 2024-04-05 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 50f0230c167fd6..3c6bd3bed86f49 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-04-04 +date: 2024-04-05 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 a8b5e1576d09bd..f0bf6b7b7876fb 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_notebooks.devdocs.json b/api_docs/search_notebooks.devdocs.json new file mode 100644 index 00000000000000..6603e14c714173 --- /dev/null +++ b/api_docs/search_notebooks.devdocs.json @@ -0,0 +1,86 @@ +{ + "id": "searchNotebooks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "searchNotebooks", + "id": "def-server.SearchNotebooksPluginSetup", + "type": "Interface", + "tags": [], + "label": "SearchNotebooksPluginSetup", + "description": [], + "path": "x-pack/plugins/search_notebooks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "searchNotebooks", + "id": "def-server.SearchNotebooksPluginStart", + "type": "Interface", + "tags": [], + "label": "SearchNotebooksPluginStart", + "description": [], + "path": "x-pack/plugins/search_notebooks/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "searchNotebooks", + "id": "def-common.PLUGIN_ID", + "type": "string", + "tags": [], + "label": "PLUGIN_ID", + "description": [], + "signature": [ + "\"searchNotebooks\"" + ], + "path": "x-pack/plugins/search_notebooks/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "searchNotebooks", + "id": "def-common.PLUGIN_NAME", + "type": "string", + "tags": [], + "label": "PLUGIN_NAME", + "description": [], + "signature": [ + "\"searchNotebooks\"" + ], + "path": "x-pack/plugins/search_notebooks/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx new file mode 100644 index 00000000000000..492646c8d9c7af --- /dev/null +++ b/api_docs/search_notebooks.mdx @@ -0,0 +1,38 @@ +--- +#### +#### 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: kibSearchNotebooksPluginApi +slug: /kibana-dev-docs/api/searchNotebooks +title: "searchNotebooks" +image: https://source.unsplash.com/400x175/?github +description: API docs for the searchNotebooks plugin +date: 2024-04-05 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] +--- +import searchNotebooksObj from './search_notebooks.devdocs.json'; + +Plugin to provide access to and rendering of python notebooks for use in the persistent developer console. + +Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 4 | 0 | 4 | 0 | + +## Server + +### Setup + + +### Start + + +## Common + +### Consts, variables and types + + diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index 708c68a84e7471..8609d785bfaca0 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 4ef1c2949771d5..a27e95501571b2 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 40ccd27675c62c..4b689e725f52a1 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-04-04 +date: 2024-04-05 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 2922e307531eb6..2d14743a32da73 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-04-04 +date: 2024-04-05 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 8deafa085bae21..16690e38826fc5 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-04-04 +date: 2024-04-05 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 e046fa4d21993a..110eae5f4876d3 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-04-04 +date: 2024-04-05 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 8b92876ed64703..89a3a12243e72e 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-04-04 +date: 2024-04-05 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 0add5e88cb1e9b..1c2ac9f66b279e 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-04-04 +date: 2024-04-05 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 9861c69d609588..2762782a88d23a 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index faeaba865adde7..b86a5c3ba6680f 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index e16f4852e4b039..4ac80d02de6107 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 2a86c754984c62..15c54812a74f16 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-04-04 +date: 2024-04-05 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 5b2565e072758b..6230efc054ab87 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-04-04 +date: 2024-04-05 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 5e68aa9d02c1ff..1e73d7d46fbc14 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-04-04 +date: 2024-04-05 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 7e51bed6398187..869a54b03ce5be 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-04-04 +date: 2024-04-05 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 6d17415f63a18a..2825f13606ff81 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-04-04 +date: 2024-04-05 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 4eac8e6de48036..56061c4ebc3369 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-04-04 +date: 2024-04-05 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 9aed86f3e1164a..52ec589beab746 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-04-04 +date: 2024-04-05 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 a78b56f2db1040..d69d900150d1eb 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-04-04 +date: 2024-04-05 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 8f16a452b371af..328cb8080cf6e8 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index bc8f1fb9b841c5..f08fd79ca512ab 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 763bb9ed0403e3..a1ddbf57d6fa6b 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-04-04 +date: 2024-04-05 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 1462609a7ef4f2..115268ed41036d 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-04-04 +date: 2024-04-05 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 1beb8efdc00dc3..0d19c490cfe471 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-04-04 +date: 2024-04-05 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 40568e83232137..4e41078dfc3771 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -6241,7 +6241,11 @@ "section": "def-common.AlertConsumers", "text": "AlertConsumers" }, - "[] | undefined; } & Partial React.ReactNode | JSX.Element) | undefined; } & Partial>" ], @@ -8049,9 +8053,47 @@ "label": "getAlertsStateTable", "description": [], "signature": [ - "(props: ", - "AlertsTableStateProps", - " & ", + "(props: { alertsTableConfigurationRegistry: ", + { + "pluginId": "triggersActionsUi", + "scope": "public", + "docId": "kibTriggersActionsUiPluginApi", + "section": "def-public.AlertsTableConfigurationRegistryContract", + "text": "AlertsTableConfigurationRegistryContract" + }, + "; configurationId: string; id: string; featureIds: ", + { + "pluginId": "@kbn/rule-data-utils", + "scope": "common", + "docId": "kibKbnRuleDataUtilsPluginApi", + "section": "def-common.AlertConsumers", + "text": "AlertConsumers" + }, + "[]; query: Pick<", + "QueryDslQueryContainer", + ", \"ids\" | \"bool\">; pageSize?: number | undefined; browserFields?: ", + { + "pluginId": "ruleRegistry", + "scope": "common", + "docId": "kibRuleRegistryPluginApi", + "section": "def-common.BrowserFields", + "text": "BrowserFields" + }, + " | undefined; onUpdate?: ((args: ", + "TableUpdateHandlerArgs", + ") => void) | undefined; onLoaded?: (() => void) | undefined; runtimeMappings?: ", + "MappingRuntimeFields", + " | undefined; showAlertStatusWithFlapping?: boolean | undefined; toolbarVisibility?: ", + "EuiDataGridToolBarVisibilityOptions", + " | undefined; shouldHighlightRow?: ((alert: ", + "EcsFieldsResponse", + ") => boolean) | undefined; dynamicRowHeight?: boolean | undefined; lastReloadRequestTime?: number | undefined; renderCellPopover?: ((props: ", + "EuiDataGridCellPopoverElementProps", + " & { alert: ", + "EcsFieldsResponse", + "; }) => React.ReactNode | JSX.Element) | undefined; } & Omit, \"renderCellPopover\"> & ", "LazyLoadProps", ") => React.ReactElement<", "AlertsTableStateProps", @@ -8069,8 +8111,47 @@ "label": "props", "description": [], "signature": [ - "AlertsTableStateProps", - " & ", + "{ alertsTableConfigurationRegistry: ", + { + "pluginId": "triggersActionsUi", + "scope": "public", + "docId": "kibTriggersActionsUiPluginApi", + "section": "def-public.AlertsTableConfigurationRegistryContract", + "text": "AlertsTableConfigurationRegistryContract" + }, + "; configurationId: string; id: string; featureIds: ", + { + "pluginId": "@kbn/rule-data-utils", + "scope": "common", + "docId": "kibKbnRuleDataUtilsPluginApi", + "section": "def-common.AlertConsumers", + "text": "AlertConsumers" + }, + "[]; query: Pick<", + "QueryDslQueryContainer", + ", \"ids\" | \"bool\">; pageSize?: number | undefined; browserFields?: ", + { + "pluginId": "ruleRegistry", + "scope": "common", + "docId": "kibRuleRegistryPluginApi", + "section": "def-common.BrowserFields", + "text": "BrowserFields" + }, + " | undefined; onUpdate?: ((args: ", + "TableUpdateHandlerArgs", + ") => void) | undefined; onLoaded?: (() => void) | undefined; runtimeMappings?: ", + "MappingRuntimeFields", + " | undefined; showAlertStatusWithFlapping?: boolean | undefined; toolbarVisibility?: ", + "EuiDataGridToolBarVisibilityOptions", + " | undefined; shouldHighlightRow?: ((alert: ", + "EcsFieldsResponse", + ") => boolean) | undefined; dynamicRowHeight?: boolean | undefined; lastReloadRequestTime?: number | undefined; renderCellPopover?: ((props: ", + "EuiDataGridCellPopoverElementProps", + " & { alert: ", + "EcsFieldsResponse", + "; }) => React.ReactNode | JSX.Element) | undefined; } & Omit, \"renderCellPopover\"> & ", "LazyLoadProps" ], "path": "x-pack/plugins/triggers_actions_ui/public/plugin.ts", diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 4a6d6b7f7b4e80..73aa7086ea4ad0 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 592 | 1 | 566 | 59 | +| 592 | 1 | 566 | 60 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 013cb9305f3521..a6faef13000ca9 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-04-04 +date: 2024-04-05 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 beeefae21c6241..ca84326538b026 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-04-04 +date: 2024-04-05 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 085a880fc7dbaf..f4c05c45fdf2b2 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-04-04 +date: 2024-04-05 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 7716239c21c949..a53c6f0187ee49 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-04-04 +date: 2024-04-05 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 cddc66fce56011..ab575c866c7187 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-04-04 +date: 2024-04-05 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 5633828071e80c..c94f923848d6a6 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-04-04 +date: 2024-04-05 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 162e6c13626252..263e785b832b41 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-04-04 +date: 2024-04-05 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 c6643a7b9d7690..5d4b167c489e36 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-04-04 +date: 2024-04-05 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 8b33dfa804e9c3..d1f2535341e67b 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-04-04 +date: 2024-04-05 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 24861ece5645f8..a3ddf399057bfa 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-04-04 +date: 2024-04-05 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 beda97471f333a..d4e486d9138e08 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-04-04 +date: 2024-04-05 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 d9db3069e4c9a7..4e4006eab155fe 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-04-04 +date: 2024-04-05 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 9f92da22885680..2281766200514c 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-04-04 +date: 2024-04-05 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 b17f0926e807fd..2a289719896fb8 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-04-04 +date: 2024-04-05 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 cd537dbe3fff0b..1a5b5549e7a194 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-04-04 +date: 2024-04-05 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 8745e9107670db..1bd223b9e6489c 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-04-04 +date: 2024-04-05 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 23bd4f56edc914..bd370f02561d16 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-04-04 +date: 2024-04-05 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 e81371d3ec4397..9b03924d956b79 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-04-04 +date: 2024-04-05 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 9ecb49b78f914e..f9feea0ce824b6 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-04-04 +date: 2024-04-05 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 5b692672979276..aed8dd03fad5ab 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 3ff4136b76a0e1..f4516aa8eec4a3 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -9653,7 +9653,7 @@ "label": "mode", "description": [], "signature": [ - "\"full\" | \"custom\" | \"dataBounds\"" + "\"custom\" | \"full\" | \"dataBounds\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -14001,7 +14001,7 @@ "label": "yLeftScale", "description": [], "signature": [ - "\"log\" | \"time\" | \"linear\" | \"sqrt\" | undefined" + "\"log\" | \"sqrt\" | \"time\" | \"linear\" | undefined" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, @@ -14015,7 +14015,7 @@ "label": "yRightScale", "description": [], "signature": [ - "\"log\" | \"time\" | \"linear\" | \"sqrt\" | undefined" + "\"log\" | \"sqrt\" | \"time\" | \"linear\" | undefined" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/configurations.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 322571159fddf9..b0a679675962ad 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-04-04 +date: 2024-04-05 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/docs/developer/advanced/upgrading-nodejs.asciidoc b/docs/developer/advanced/upgrading-nodejs.asciidoc index dea7c557042994..546d5ae46f164c 100644 --- a/docs/developer/advanced/upgrading-nodejs.asciidoc +++ b/docs/developer/advanced/upgrading-nodejs.asciidoc @@ -19,7 +19,7 @@ These files must be updated when upgrading Node.js: - {kib-repo}blob/{branch}/WORKSPACE.bazel[`WORKSPACE.bazel`] - The version is specified in the `node_version` property. Besides this property, the list of files under `node_repositories` must be updated along with their respective SHA256 hashes. These can be found in the `SHASUMS256.txt` file inside the public `kibana-custom-node-artifacts` GCP bucket. - Example for Node.js v20.11.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.11.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.11.1/SHASUMS256.txt] + Example for Node.js v20.12.1: https://storage.googleapis.com/kibana-custom-node-artifacts/node-glibc-217/dist/v20.12.1/SHASUMS256.txt[kibana-custom-node-artifacts/node-glibc-217/dist/v20.12.1/SHASUMS256.txt] See PR {kib-repo}pull/128123[#128123] for an example of how the Node.js version has been upgraded previously. @@ -43,7 +43,7 @@ The only difference between the offical Node.js build and our custom build, is t ==== How to start a new build To generate a new custom Node.js build, https://buildkite.com/elastic/kibana-custom-node-dot-js-builds#new[start a new build] on our dedicated Buildkite pipeline (requires Elastic employee permissions). -Give it a clear name (e.g. `Node 20.11.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.11.1`. +Give it a clear name (e.g. `Node 20.12.1`) and remember so set the custom `OVERRIDE_TARGET_VERSION` environment variable to the desired Node.js version - e.g. `OVERRIDE_TARGET_VERSION=20.12.1`. You find the "Environment Variables" field by expanding "Options >" in the "New Build" dialog. === Backporting diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 472ad01dc9ce14..3bbc594a21c5ae 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -757,6 +757,10 @@ It uses Chromium and Puppeteer underneath to run the browser in headless mode. |This plugin contains common assets and endpoints for the use of connectors in Kibana. Primarily used by the enterprise_search and serverless_search plugins. +|{kib-repo}blob/{branch}/x-pack/plugins/search_notebooks/README.mdx[searchNotebooks] +|This plugin contains endpoints and components for rendering search python notebooks in the persistent dev console. + + |{kib-repo}blob/{branch}/x-pack/plugins/search_playground/README.md[searchPlayground] |The Search Playground is a tool for developers to experiment with their own data using LLMs. diff --git a/docs/user/alerting/create-and-manage-rules.asciidoc b/docs/user/alerting/create-and-manage-rules.asciidoc index b1a99f856546b9..35e554b0205fce 100644 --- a/docs/user/alerting/create-and-manage-rules.asciidoc +++ b/docs/user/alerting/create-and-manage-rules.asciidoc @@ -97,7 +97,7 @@ For example, you can have actions that create an {opsgenie} alert when rule cond [[alerting-concepts-suppressing-duplicate-notifications]] [TIP] ============================================== -If you are not using alert summaries, actions are triggered per alert and a rule can end up generating a large number of actions. Take the following example where a rule is monitoring three servers every minute for CPU usage > 0.9, and the action frequency is `On check intervals`: +If you are not using alert summaries, actions are generated per alert and a rule can end up generating a large number of actions. Take the following example where a rule is monitoring three servers every minute for CPU usage > 0.9, and the action frequency is `On check intervals`: * Minute 1: server X123 > 0.9. _One email_ is sent for server X123. * Minute 2: X123 and Y456 > 0.9. _Two emails_ are sent, one for X123 and one for Y456. @@ -131,44 +131,25 @@ For more information about common action variables, refer to <>. - -[float] -[[importing-and-exporting-rules]] -=== Import and export rules - -To import and export rules, use <>. - -[NOTE] -============================================== -Some rule types cannot be exported through this interface: - -**Security rules** can be imported and exported using the {security-guide}/rules-ui-management.html#import-export-rules-ui[Security UI]. - -**Stack monitoring rules** are <> for you and therefore cannot be managed in *Saved Objects*. -============================================== +When a rule is in a snoozed state, you can cancel or change the duration of this state. -Rules are disabled on export. You are prompted to re-enable the rule on successful import. -[role="screenshot"] -image::images/rules-imported-banner.png[Rules import banner,500] +preview:[] To temporarily suppress notifications for rules, you can also create a <>. [float] [[rule-details]] @@ -189,14 +170,19 @@ image::images/rule-details-alerts-active.png[Rule details page with multiple ale 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 three common alert statuses: +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*. + 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. In this example, the action failed because the <> setting was updated and the action's email recipient is no longer included in the allowlist: @@ -208,8 +194,21 @@ image::images/rule-details-errored-actions.png[Rule histor page with alerts that If an alert was affected by a maintenance window, its identifier appears in the *Maintenance windows* column. For more information about their impact on alert notifications, refer to <>. -You can suppress future actions for a specific alert by turning on the *Mute* toggle. If a muted alert no longer meets the rule conditions, it stays in the list to avoid generating actions if the conditions recur. You can also disable a rule, which stops it from running checks and clears any alerts it was tracking. You may want to disable rules that are not currently needed to reduce the load on {kib} and {es}. +[float] +[[importing-and-exporting-rules]] +=== Import and export rules + +To import and export rules, use <>. + +[NOTE] +============================================== +Some rule types cannot be exported through this interface: + +**Security rules** can be imported and exported using the {security-guide}/rules-ui-management.html#import-export-rules-ui[Security UI]. + +**Stack monitoring rules** are <> for you and therefore cannot be managed in *Saved Objects*. +============================================== +Rules are disabled on export. You are prompted to re-enable the rule on successful import. [role="screenshot"] -image::images/rule-details-disabling.png[Use the disable toggle to turn off rule checks and clear alerts tracked] -// NOTE: This is an autogenerated screenshot. Do not edit it directly. +image::images/rules-imported-banner.png[Rules import banner,500] \ No newline at end of file diff --git a/docs/user/alerting/images/rule-details-alerts-active.png b/docs/user/alerting/images/rule-details-alerts-active.png index 295cb263c40ebb..b2a5332db2ae98 100644 Binary files a/docs/user/alerting/images/rule-details-alerts-active.png and b/docs/user/alerting/images/rule-details-alerts-active.png differ diff --git a/docs/user/alerting/images/rule-types-index-threshold-example-alerts.png b/docs/user/alerting/images/rule-types-index-threshold-example-alerts.png index 50ff3da302b9eb..c4acbc65b3c78c 100644 Binary files a/docs/user/alerting/images/rule-types-index-threshold-example-alerts.png and b/docs/user/alerting/images/rule-types-index-threshold-example-alerts.png differ diff --git a/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx index e2b9fdea7bbf35..81de25e8465966 100644 --- a/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx +++ b/examples/embeddable_examples/public/react_embeddables/search/search_react_embeddable.tsx @@ -9,8 +9,13 @@ import { EuiCallOut } from '@elastic/eui'; import { DataView } from '@kbn/data-views-plugin/common'; import { ReactEmbeddableFactory } from '@kbn/embeddable-plugin/public'; -import { initializeTimeRange, useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; -import React, { useEffect, useState } from 'react'; +import { + FetchContext, + initializeTimeRange, + onFetchContextChanged, + useBatchedPublishingSubjects, +} from '@kbn/presentation-publishing'; +import React, { useEffect } from 'react'; import { BehaviorSubject } from 'rxjs'; import { SEARCH_EMBEDDABLE_ID } from './constants'; import { getCount } from './get_count'; @@ -23,13 +28,7 @@ export const getSearchEmbeddableFactory = (services: Services) => { return state.rawState as State; }, buildEmbeddable: async (state, buildApi, uuid, parentApi) => { - const { - appliedTimeRange$, - cleanupTimeRange, - serializeTimeRange, - timeRangeApi, - timeRangeComparators, - } = initializeTimeRange(state, parentApi); + const timeRange = initializeTimeRange(state); const defaultDataView = await services.dataViews.getDefaultDataView(); const dataViews$ = new BehaviorSubject( defaultDataView ? [defaultDataView] : undefined @@ -38,67 +37,81 @@ export const getSearchEmbeddableFactory = (services: Services) => { const api = buildApi( { - ...timeRangeApi, + ...timeRange.api, dataViews: dataViews$, dataLoading: dataLoading$, serializeState: () => { return { rawState: { - ...serializeTimeRange(), + ...timeRange.serialize(), }, references: [], }; }, }, { - ...timeRangeComparators, + ...timeRange.comparators, } ); + let isUnmounted = false; + const error$ = new BehaviorSubject(undefined); + const count$ = new BehaviorSubject(0); + const onFetch = (fetchContext: FetchContext, isCanceled: () => boolean) => { + error$.next(undefined); + if (!defaultDataView) { + return; + } + dataLoading$.next(true); + getCount( + defaultDataView, + services.data, + fetchContext.filters ?? [], + fetchContext.query, + // timeRange and timeslice provided seperatly so consumers can decide + // whether to refetch data for just mask current data. + // In this example, we must refetch because we need a count within the time range. + fetchContext.timeslice + ? { + from: new Date(fetchContext.timeslice[0]).toISOString(), + to: new Date(fetchContext.timeslice[1]).toISOString(), + mode: 'absolute' as 'absolute', + } + : fetchContext.timeRange + ) + .then((nextCount: number) => { + if (isUnmounted || isCanceled()) { + return; + } + dataLoading$.next(false); + count$.next(nextCount); + }) + .catch((err) => { + if (isUnmounted || isCanceled()) { + return; + } + dataLoading$.next(false); + error$.next(err); + }); + }; + const unsubscribeFromFetch = onFetchContextChanged({ + api, + onFetch, + fetchOnSetup: true, + }); + return { api, Component: () => { - const [count, setCount] = useState(0); - const [error, setError] = useState(); - const [filters, query, appliedTimeRange] = useBatchedPublishingSubjects( - api.parentApi?.filters$, - api.parentApi?.query$, - appliedTimeRange$ - ); + const [count, error] = useBatchedPublishingSubjects(count$, error$); useEffect(() => { return () => { - cleanupTimeRange(); + isUnmounted = true; + unsubscribeFromFetch(); }; }, []); - useEffect(() => { - let ignore = false; - setError(undefined); - if (!defaultDataView) { - return; - } - dataLoading$.next(true); - getCount(defaultDataView, services.data, filters ?? [], query, appliedTimeRange) - .then((nextCount: number) => { - if (ignore) { - return; - } - dataLoading$.next(false); - setCount(nextCount); - }) - .catch((err) => { - if (ignore) { - return; - } - dataLoading$.next(false); - setError(err); - }); - return () => { - ignore = true; - }; - }, [filters, query, appliedTimeRange]); - if (!defaultDataView) { return ( diff --git a/package.json b/package.json index 1fb67303fb553a..d7dfc3b3304430 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "url": "https://github.com/elastic/kibana.git" }, "engines": { - "node": "20.11.1", + "node": "20.12.1", "yarn": "^1.22.19" }, "resolutions": { @@ -696,6 +696,7 @@ "@kbn/search-errors": "link:packages/kbn-search-errors", "@kbn/search-examples-plugin": "link:examples/search_examples", "@kbn/search-index-documents": "link:packages/kbn-search-index-documents", + "@kbn/search-notebooks": "link:x-pack/plugins/search_notebooks", "@kbn/search-playground": "link:x-pack/plugins/search_playground", "@kbn/search-response-warnings": "link:packages/kbn-search-response-warnings", "@kbn/searchprofiler-plugin": "link:x-pack/plugins/searchprofiler", @@ -796,6 +797,7 @@ "@kbn/shared-ux-router-types": "link:packages/shared-ux/router/types", "@kbn/shared-ux-storybook-config": "link:packages/shared-ux/storybook/config", "@kbn/shared-ux-storybook-mock": "link:packages/shared-ux/storybook/mock", + "@kbn/shared-ux-tabbed-modal": "link:packages/shared-ux/modal/tabbed", "@kbn/shared-ux-utility": "link:packages/kbn-shared-ux-utility", "@kbn/slo-plugin": "link:x-pack/plugins/observability_solution/slo", "@kbn/slo-schema": "link:x-pack/packages/kbn-slo-schema", @@ -1352,6 +1354,7 @@ "@octokit/rest": "^16.35.0", "@parcel/watcher": "^2.1.0", "@redocly/cli": "^1.6.0", + "@statoscope/webpack-plugin": "^5.28.2", "@storybook/addon-a11y": "^6.5.16", "@storybook/addon-actions": "^6.5.16", "@storybook/addon-docs": "^6.5.16", @@ -1699,6 +1702,7 @@ "webpack-dev-server": "^4.9.3", "webpack-merge": "^4.2.2", "webpack-sources": "^1.4.1", + "webpack-visualizer-plugin2": "^1.1.0", "xml-crypto": "^5.0.0", "xmlbuilder": "13.0.2", "yargs": "^15.4.1", diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/app_menu.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/app_menu.tsx index 5c939752250ae7..5b815fc1a06313 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/app_menu.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/app_menu.tsx @@ -28,7 +28,7 @@ export const AppMenuBar = ({ headerActionMenuMounter }: AppMenuBarProps) => { data-test-subj="kibanaProjectHeaderActionMenu" css={css` z-index: ${zIndex}; - background: ${euiTheme.colors.emptyShade}; + background: ${euiTheme.colors.body}; border-bottom: ${euiTheme.border.thin}; display: flex; justify-content: end; diff --git a/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts b/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts index 2f3cb8dc8fc08e..c5918ff16ce615 100644 --- a/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts +++ b/packages/core/saved-objects/core-saved-objects-api-browser/src/simple_saved_object.ts @@ -44,6 +44,8 @@ export interface SimpleSavedObject { updatedAt: SavedObjectType['updated_at']; /** The date this object was created */ createdAt: SavedObjectType['created_at']; + /** The user that created this object */ + createdBy: SavedObjectType['created_by']; /** * Space(s) that this saved object exists in. This attribute is not used for "global" saved object types which are registered with * `namespaceType: 'agnostic'`. diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts index 52e59ca23519c4..c9b9fdfb768aa7 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/bulk_create.ts @@ -72,6 +72,7 @@ export const performBulkCreate = async ( preflight: preflightHelper, serializer: serializerHelper, migration: migrationHelper, + user: userHelper, } = helpers; const { securityExtension } = extensions; const namespace = commonHelper.getCurrentNamespace(options.namespace); @@ -83,6 +84,7 @@ export const performBulkCreate = async ( managed: optionsManaged, } = options; const time = getCurrentTime(); + const createdBy = userHelper.getCurrentUserProfileUid(); let preflightCheckIndexCounter = 0; const expectedResults = objects.map((object) => { @@ -231,6 +233,7 @@ export const performBulkCreate = async ( managed: setManaged({ optionsManaged, objectManaged: object.managed }), updated_at: time, created_at: time, + ...(createdBy && { created_by: createdBy }), references: object.references || [], originId, }) as SavedObjectSanitizedDoc; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts index cbde193f0f9221..ebb6f8e59dbc79 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/create.ts @@ -45,6 +45,7 @@ export const performCreate = async ( preflight: preflightHelper, serializer: serializerHelper, migration: migrationHelper, + user: userHelper, } = helpers; const { securityExtension } = extensions; @@ -69,6 +70,7 @@ export const performCreate = async ( validationHelper.validateOriginId(type, options); const time = getCurrentTime(); + const createdBy = userHelper.getCurrentUserProfileUid(); let savedObjectNamespace: string | undefined; let savedObjectNamespaces: string[] | undefined; let existingOriginId: string | undefined; @@ -133,6 +135,7 @@ export const performCreate = async ( managed: setManaged({ optionsManaged: managed }), created_at: time, updated_at: time, + ...(createdBy && { created_by: createdBy }), ...(Array.isArray(references) && { references }), }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts index 9e6f03d2beac87..a10d4e1f7a30af 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/find.test.ts @@ -150,6 +150,7 @@ describe('find', () => { 'managed', 'updated_at', 'created_at', + 'created_by', 'originId', ], }), diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/index.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/index.ts index e7bd523c0e741a..663f4e4d9a818e 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/index.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/index.ts @@ -12,12 +12,14 @@ import type { IValidationHelper } from './validation'; import type { IPreflightCheckHelper } from './preflight_check'; import type { ISerializerHelper } from './serializer'; import type { IMigrationHelper } from './migration'; +import type { UserHelper } from './user'; export { CommonHelper, type ICommonHelper } from './common'; export { EncryptionHelper, type IEncryptionHelper } from './encryption'; export { ValidationHelper, type IValidationHelper } from './validation'; export { SerializerHelper, type ISerializerHelper } from './serializer'; export { MigrationHelper, type IMigrationHelper } from './migration'; +export { UserHelper } from './user'; export { PreflightCheckHelper, type IPreflightCheckHelper, @@ -36,4 +38,5 @@ export interface RepositoryHelpers { preflight: IPreflightCheckHelper; serializer: ISerializerHelper; migration: IMigrationHelper; + user: UserHelper; } diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/user.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/user.ts new file mode 100644 index 00000000000000..acdb8c34e88d62 --- /dev/null +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/helpers/user.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ISavedObjectsSecurityExtension } from '@kbn/core-saved-objects-server'; + +export class UserHelper { + private securityExtension?: ISavedObjectsSecurityExtension; + + constructor({ securityExtension }: { securityExtension?: ISavedObjectsSecurityExtension }) { + this.securityExtension = securityExtension; + } + + getCurrentUserProfileUid(): string | undefined { + return this.securityExtension?.getCurrentUser()?.profile_uid; + } +} diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts index cba31cbd021624..bcc786aa8c340b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.test.ts @@ -100,6 +100,8 @@ describe('#getSavedObjectFromSource', () => { const originId = 'originId'; // eslint-disable-next-line @typescript-eslint/naming-convention const updated_at = 'updatedAt'; + // eslint-disable-next-line @typescript-eslint/naming-convention + const created_by = 'createdBy'; const managed = false; function createRawDoc( @@ -120,6 +122,7 @@ describe('#getSavedObjectFromSource', () => { managed, originId, updated_at, + created_by, ...namespaceAttrs, }, }; @@ -142,6 +145,7 @@ describe('#getSavedObjectFromSource', () => { references, type, updated_at, + created_by, version: encodeHitVersion(doc), }); }); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts index f06894bcca1e5f..379cd21337651b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/apis/utils/internal_utils.ts @@ -109,6 +109,7 @@ export function getSavedObjectFromSource( originId, updated_at: updatedAt, created_at: createdAt, + created_by: createdBy, coreMigrationVersion, typeMigrationVersion, managed, @@ -134,6 +135,7 @@ export function getSavedObjectFromSource( ...(originId && { originId }), ...(updatedAt && { updated_at: updatedAt }), ...(createdAt && { created_at: createdAt }), + ...(createdBy && { created_by: createdBy }), version: encodeHitVersion(doc), attributes: doc._source[type], references: doc._source.references || [], diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts index 30778ef7b5f92a..19062e0560243f 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/repository.security_extension.test.ts @@ -64,6 +64,7 @@ import { } from '../test_helpers/repository.test.common'; import { savedObjectsExtensionsMock } from '../mocks/saved_objects_extensions.mock'; import { arrayMapsAreEqual } from '@kbn/core-saved-objects-utils-server'; +import { mockAuthenticatedUser } from '@kbn/core-security-common/mocks'; describe('SavedObjectsRepository Security Extension', () => { let client: ReturnType; @@ -423,6 +424,25 @@ describe('SavedObjectsRepository Security Extension', () => { }) ); }); + + test(`adds created_by to the saved object when the current user is available`, async () => { + const profileUid = 'profileUid'; + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => + mockAuthenticatedUser({ profile_uid: profileUid }) + ); + const response = await repository.create(MULTI_NAMESPACE_CUSTOM_INDEX_TYPE, attributes, { + namespace, + }); + expect(response.created_by).toBe(profileUid); + }); + + test(`keeps created_by empty if the current user is not available`, async () => { + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => null); + const response = await repository.create(MULTI_NAMESPACE_CUSTOM_INDEX_TYPE, attributes, { + namespace, + }); + expect(response).not.toHaveProperty('created_by'); + }); }); describe('#delete', () => { @@ -1324,6 +1344,23 @@ describe('SavedObjectsRepository Security Extension', () => { expect(typeMap).toBe(authMap); }); }); + + test(`adds created_by to the saved object when the current user is available`, async () => { + const profileUid = 'profileUid'; + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => + mockAuthenticatedUser({ profile_uid: profileUid }) + ); + const response = await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); + expect(response.saved_objects[0].created_by).toBe(profileUid); + expect(response.saved_objects[1].created_by).toBe(profileUid); + }); + + test(`keeps created_by empty if the current user is not available`, async () => { + mockSecurityExt.getCurrentUser.mockImplementationOnce(() => null); + const response = await bulkCreateSuccess(client, repository, [obj1, obj2], { namespace }); + expect(response.saved_objects[0]).not.toHaveProperty('created_by'); + expect(response.saved_objects[1]).not.toHaveProperty('created_by'); + }); }); describe('#bulkUpdate', () => { diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts index 087f3690886b10..7af895590285fc 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/create_helpers.ts @@ -23,6 +23,7 @@ import { PreflightCheckHelper, SerializerHelper, MigrationHelper, + UserHelper, } from '../apis/helpers'; import type { RepositoryEsClient } from '../repository_es_client'; import { CreatePointInTimeFinderFn } from '../point_in_time_finder'; @@ -80,6 +81,9 @@ export const createRepositoryHelpers = ({ migrator, encryptionHelper, }); + const userHelper = new UserHelper({ + securityExtension: extensions?.securityExtension, + }); const helpers: RepositoryHelpers = { common: commonHelper, @@ -88,6 +92,7 @@ export const createRepositoryHelpers = ({ encryption: encryptionHelper, serializer: serializerHelper, migration: migrationHelper, + user: userHelper, }; return helpers; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts index eea85a023df477..b2bda0ec4007cb 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.test.ts @@ -23,6 +23,7 @@ describe('getRootFields', () => { "managed", "updated_at", "created_at", + "created_by", "originId", ] `); diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts index 50686def81c885..c4d023d2b5fffd 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/utils/included_fields.ts @@ -17,6 +17,7 @@ const ROOT_FIELDS = [ 'managed', 'updated_at', 'created_at', + 'created_by', 'originId', ]; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts index d284bddd5c060f..8793cd0eb35f66 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/api_helpers.mocks.ts @@ -15,6 +15,7 @@ import type { PreflightCheckHelper, SerializerHelper, MigrationHelper, + UserHelper, } from '../lib/apis/helpers'; export type MigrationHelperMock = jest.Mocked>; @@ -104,6 +105,16 @@ const createPreflightCheckHelperMock = (): PreflightCheckHelperMock => { return mock; }; +export type UserHelperMock = jest.Mocked>; + +const createUserHelperMock = (): UserHelperMock => { + const mock: UserHelperMock = { + getCurrentUserProfileUid: jest.fn(), + }; + + return mock; +}; + export interface RepositoryHelpersMock { common: CommonHelperMock; encryption: EncryptionHelperMock; @@ -111,6 +122,7 @@ export interface RepositoryHelpersMock { preflight: PreflightCheckHelperMock; serializer: SerializerHelperMock; migration: MigrationHelperMock; + user: UserHelperMock; } const createRepositoryHelpersMock = (): RepositoryHelpersMock => { @@ -121,6 +133,7 @@ const createRepositoryHelpersMock = (): RepositoryHelpersMock => { preflight: createPreflightCheckHelperMock(), serializer: createSerializerHelperMock(), migration: createMigrationHelperMock(), + user: createUserHelperMock(), }; }; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts index 3d9c3f91efa096..626ac1a2a098bb 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/mocks/saved_objects_extensions.mock.ts @@ -39,6 +39,7 @@ const createSecurityExtension = (): jest.Mocked authorizeUpdateSpaces: jest.fn(), authorizeDisableLegacyUrlAliases: jest.fn(), auditObjectsForSpaceDeletion: jest.fn(), + getCurrentUser: jest.fn(), }); const createSpacesExtension = (): jest.Mocked => ({ diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/tsconfig.json b/packages/core/saved-objects/core-saved-objects-api-server-internal/tsconfig.json index dbb7f83fa94b27..f9912727a87205 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/tsconfig.json +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/tsconfig.json @@ -33,6 +33,7 @@ "@kbn/core-http-server-mocks", "@kbn/core-saved-objects-migration-server-internal", "@kbn/utility-types", + "@kbn/core-security-common", ], "exclude": [ "target/**/*", diff --git a/packages/core/saved-objects/core-saved-objects-api-server-mocks/src/saved_objects_extensions.mock.ts b/packages/core/saved-objects/core-saved-objects-api-server-mocks/src/saved_objects_extensions.mock.ts index 6f7fb8299291e7..cde0d104de578b 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-mocks/src/saved_objects_extensions.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-mocks/src/saved_objects_extensions.mock.ts @@ -40,6 +40,7 @@ const createSecurityExtension = (): jest.Mocked authorizeUpdateSpaces: jest.fn(), authorizeDisableLegacyUrlAliases: jest.fn(), auditObjectsForSpaceDeletion: jest.fn(), + getCurrentUser: jest.fn(), }); const createSpacesExtension = (): jest.Mocked => ({ diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts index b001229dd232da..cdc47c69caef3e 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/constants.ts @@ -176,7 +176,7 @@ export const HASH_TO_VERSION_MAP = { 'guided-onboarding-guide-state|a3db59c45a3fd2730816d4f53c35c7d9': '10.0.0', 'guided-onboarding-plugin-state|3d1b76c39bfb2cc8296b024d73854724': '10.0.0', 'index-pattern|83c02d842fe2a94d14dfa13f7dcd6e87': '10.0.0', - 'infra-custom-dashboards|6eed22cbe14594bad8c076fa864930de': '10.0.0', + 'infra-custom-dashboards|1eb3c9e1888b8daea8495769e8d3ba2d': '10.2.0', 'infrastructure-monitoring-log-view|c50526fc6040c5355ed027d34d05b35c': '10.0.0', 'infrastructure-ui-source|3d1b76c39bfb2cc8296b024d73854724': '10.0.0', 'ingest_manager_settings|b91ffb075799c78ffd7dbd51a279c8c9': '10.1.0', diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts index 85035bfc38610d..05fe2a12399761 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.test.ts @@ -309,6 +309,18 @@ describe('#rawToSavedObject', () => { expect(actual).toHaveProperty('created_at', now); }); + test('if specified it copies the _source.created_by property to created_by', () => { + const createdBy = 'elastic'; + const actual = singleNamespaceSerializer.rawToSavedObject({ + _id: 'foo:bar', + _source: { + type: 'foo', + created_by: createdBy, + }, + }); + expect(actual).toHaveProperty('created_by', createdBy); + }); + test(`if _source.updated_at is unspecified it doesn't set updated_at`, () => { const actual = singleNamespaceSerializer.rawToSavedObject({ _id: 'foo:bar', diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts index cb3036fa9d6686..7faffa75d61ed3 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/serialization/serializer.ts @@ -123,6 +123,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { ...(typeMigrationVersion != null ? { typeMigrationVersion } : {}), ...(_source.updated_at && { updated_at: _source.updated_at }), ...(_source.created_at && { created_at: _source.created_at }), + ...(_source.created_by && { created_by: _source.created_by }), ...(version && { version }), }; } @@ -144,6 +145,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { // eslint-disable-next-line @typescript-eslint/naming-convention updated_at, created_at: createdAt, + created_by: createdBy, version, references, coreMigrationVersion, @@ -163,6 +165,7 @@ export class SavedObjectsSerializer implements ISavedObjectsSerializer { ...(typeMigrationVersion != null ? { typeMigrationVersion } : {}), ...(updated_at && { updated_at }), ...(createdAt && { created_at: createdAt }), + ...(createdBy && { created_by: createdBy }), }; return { _id: this.generateRawId(namespace, type, id), diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts index 6c9a61c5003db1..8a23defbbf2672 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts @@ -37,6 +37,7 @@ const baseSchema = schema.object({ typeMigrationVersion: schema.maybe(schema.string()), updated_at: schema.maybe(schema.string()), created_at: schema.maybe(schema.string()), + created_by: schema.maybe(schema.string()), version: schema.maybe(schema.string()), originId: schema.maybe(schema.string()), managed: schema.maybe(schema.boolean()), diff --git a/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts b/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts index 0d57526c065e33..af830b2d6b68b9 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-internal/src/simple_saved_object.ts @@ -34,6 +34,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject public references: SavedObjectType['references']; public updatedAt: SavedObjectType['updated_at']; public createdAt: SavedObjectType['created_at']; + public createdBy: SavedObjectType['created_by']; public namespaces: SavedObjectType['namespaces']; constructor( @@ -52,6 +53,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject namespaces, updated_at: updatedAt, created_at: createdAt, + created_by: createdBy, }: SavedObjectType ) { this.id = id; @@ -66,6 +68,7 @@ export class SimpleSavedObjectImpl implements SimpleSavedObject this.namespaces = namespaces; this.updatedAt = updatedAt; this.createdAt = createdAt; + this.createdBy = createdBy; if (error) { this.error = error; } diff --git a/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts b/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts index 396b7cfa3a9655..288838b54ffcd0 100644 --- a/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts +++ b/packages/core/saved-objects/core-saved-objects-browser-mocks/src/simple_saved_object.mock.ts @@ -46,6 +46,7 @@ const createSimpleSavedObjectMock = ( references: savedObject.references, updatedAt: savedObject.updated_at, createdAt: savedObject.created_at, + createdBy: savedObject.created_by, namespaces: savedObject.namespaces, get: jest.fn(), set: jest.fn(), diff --git a/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts b/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts index 8b3ffe0b733d63..f5a69f8a2ee869 100644 --- a/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts +++ b/packages/core/saved-objects/core-saved-objects-common/src/server_types.ts @@ -72,6 +72,8 @@ export interface SavedObject { version?: string; /** Timestamp of the time this document had been created. */ created_at?: string; + /** The ID of the user who created this object. */ + created_by?: string; /** Timestamp of the last time this document had been updated. */ updated_at?: string; /** Error associated with this object, populated if an operation failed for this object. */ diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap index 420a051eb47d90..2c25694a8c2701 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/__snapshots__/kibana_migrator.test.ts.snap @@ -24,6 +24,9 @@ Object { "created_at": Object { "type": "date", }, + "created_by": Object { + "type": "keyword", + }, "managed": Object { "type": "boolean", }, diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap index 2ae6c3e5685ff9..13c6531ca969c3 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/__snapshots__/build_active_mappings.test.ts.snap @@ -16,6 +16,9 @@ Object { "created_at": Object { "type": "date", }, + "created_by": Object { + "type": "keyword", + }, "managed": Object { "type": "boolean", }, @@ -65,6 +68,9 @@ Object { "created_at": Object { "type": "date", }, + "created_by": Object { + "type": "keyword", + }, "firstType": Object { "dynamic": "strict", "properties": Object { diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts index f2758845a4c3ff..ea4ff84564006a 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.test.ts @@ -102,6 +102,9 @@ describe('getBaseMappings', () => { created_at: { type: 'date', }, + created_by: { + type: 'keyword', + }, references: { type: 'nested', properties: { diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts index 898a1114f8e571..f5744669336b4b 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/core/build_active_mappings.ts @@ -65,6 +65,9 @@ export function getBaseMappings(): IndexMapping { created_at: { type: 'date', }, + created_by: { + type: 'keyword', + }, references: { type: 'nested', properties: { diff --git a/packages/core/saved-objects/core-saved-objects-server/src/extensions/security.ts b/packages/core/saved-objects/core-saved-objects-server/src/extensions/security.ts index 58bbb91ec7de13..686044469f1928 100644 --- a/packages/core/saved-objects/core-saved-objects-server/src/extensions/security.ts +++ b/packages/core/saved-objects/core-saved-objects-server/src/extensions/security.ts @@ -12,6 +12,7 @@ import { SavedObjectsResolveResponse, } from '@kbn/core-saved-objects-api-server'; import type { LegacyUrlAliasTarget } from '@kbn/core-saved-objects-common'; +import type { AuthenticatedUser } from '@kbn/core-security-common'; import { SavedObject, BulkResolveError } from '../..'; /** @@ -513,4 +514,9 @@ export interface ISavedObjectsSecurityExtension { spaceId: string, objects: Array> ) => void; + + /** + * Retrieves the current user from the request context if available + */ + getCurrentUser: () => AuthenticatedUser | null; } diff --git a/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts b/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts index e6a7c0553f55a0..514956e8dd7dc2 100644 --- a/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts +++ b/packages/core/saved-objects/core-saved-objects-server/src/serialization.ts @@ -87,6 +87,7 @@ export interface SavedObjectsRawDocSource { typeMigrationVersion?: string; updated_at?: string; created_at?: string; + created_by?: string; references?: SavedObjectReference[]; originId?: string; managed?: boolean; @@ -111,6 +112,7 @@ export interface SavedObjectDoc { version?: string; updated_at?: string; created_at?: string; + created_by?: string; originId?: string; managed?: boolean; } diff --git a/packages/core/saved-objects/core-saved-objects-server/tsconfig.json b/packages/core/saved-objects/core-saved-objects-server/tsconfig.json index fffc0dc1df6df6..71c4049e369da3 100644 --- a/packages/core/saved-objects/core-saved-objects-server/tsconfig.json +++ b/packages/core/saved-objects/core-saved-objects-server/tsconfig.json @@ -18,6 +18,7 @@ "@kbn/core-elasticsearch-server", "@kbn/core-saved-objects-common", "@kbn/core-saved-objects-api-server", + "@kbn/core-security-common", ], "exclude": [ "target/**/*", diff --git a/packages/core/security/core-security-common/mocks.ts b/packages/core/security/core-security-common/mocks.ts new file mode 100644 index 00000000000000..82b34eef5d9e7b --- /dev/null +++ b/packages/core/security/core-security-common/mocks.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 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 { + mockAuthenticatedUser, + type MockAuthenticatedUserProps, +} from './src/authentication/authenticated_user.mock'; diff --git a/packages/core/security/core-security-common/src/authentication/authenticated_user.mock.ts b/packages/core/security/core-security-common/src/authentication/authenticated_user.mock.ts new file mode 100644 index 00000000000000..1b71bb67876c42 --- /dev/null +++ b/packages/core/security/core-security-common/src/authentication/authenticated_user.mock.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { AuthenticatedUser } from './authenticated_user'; + +// We omit `roles` here since the original interface defines this field as `readonly string[]` that makes it hard to use +// in various mocks that expect mutable string array. +export type MockAuthenticatedUserProps = Partial< + Omit & { roles: string[] } +>; +export function mockAuthenticatedUser(user: MockAuthenticatedUserProps = {}) { + return { + username: 'user', + email: 'email', + full_name: 'full name', + roles: ['user-role'], + enabled: true, + authentication_realm: { name: 'native1', type: 'native' }, + lookup_realm: { name: 'native1', type: 'native' }, + authentication_provider: { type: 'basic', name: 'basic1' }, + authentication_type: 'realm', + elastic_cloud_user: false, + profile_uid: 'uid', + metadata: { _reserved: false }, + ...user, + }; +} diff --git a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_apm_schema.ts b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_apm_schema.ts index 048c5bbfaa90ff..ccbea153eb66b2 100644 --- a/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_apm_schema.ts +++ b/packages/kbn-alerts-as-data-utils/src/schemas/generated/observability_apm_schema.ts @@ -72,8 +72,10 @@ const ObservabilityApmAlertRequired = rt.type({ // prettier-ignore const ObservabilityApmAlertOptional = rt.partial({ 'agent.name': schemaString, + 'container.id': schemaString, 'error.grouping_key': schemaString, 'error.grouping_name': schemaString, + 'host.name': schemaString, 'kibana.alert.context': schemaUnknown, 'kibana.alert.evaluation.threshold': schemaStringOrNumber, 'kibana.alert.evaluation.value': schemaStringOrNumber, diff --git a/packages/kbn-apm-config-loader/src/config.test.ts b/packages/kbn-apm-config-loader/src/config.test.ts index 3d0bd98bec4679..e955b175de1295 100644 --- a/packages/kbn-apm-config-loader/src/config.test.ts +++ b/packages/kbn-apm-config-loader/src/config.test.ts @@ -7,9 +7,9 @@ */ import type { AgentConfigOptions, Labels } from 'elastic-apm-node'; import { - gitRevExecMock, - mockedRootDir, packageMock, + mockedRootDir, + gitRevExecMock, readUuidFileMock, resetAllMocks, } from './config.test.mocks'; @@ -153,7 +153,6 @@ describe('ApmConfiguration', () => { delete process.env.ELASTIC_APM_API_KEY; delete process.env.ELASTIC_APM_KIBANA_FRONTEND_ACTIVE; delete process.env.ELASTIC_APM_SERVER_URL; - delete process.env.ELASTIC_APM_GLOBAL_LABELS; delete process.env.NODE_ENV; }); @@ -186,21 +185,6 @@ describe('ApmConfiguration', () => { }) ); }); - - it('ELASTIC_APM_GLOBAL_LABELS', () => { - process.env.ELASTIC_APM_GLOBAL_LABELS = 'test1=1,test2=2'; - const config = new ApmConfiguration(mockedRootDir, {}, true); - - expect(config.getConfig('serviceName')).toEqual( - expect.objectContaining({ - globalLabels: { - git_rev: 'sha', - test1: '1', - test2: '2', - }, - }) - ); - }); }); it('ELASTIC_APM_KIBANA_FRONTEND_ACTIVE', () => { diff --git a/packages/kbn-apm-config-loader/src/config.ts b/packages/kbn-apm-config-loader/src/config.ts index 583dd8fc58b567..8771eb042dc750 100644 --- a/packages/kbn-apm-config-loader/src/config.ts +++ b/packages/kbn-apm-config-loader/src/config.ts @@ -7,7 +7,6 @@ */ import { join } from 'path'; -import deepmerge from 'deepmerge'; import { merge, isEmpty } from 'lodash'; import { execSync } from 'child_process'; import { getDataPath } from '@kbn/utils'; @@ -310,10 +309,7 @@ export class ApmConfiguration { const { servicesOverrides, redactUsers, ...configFromKibanaConfig } = this.getConfigFromKibanaConfig(); const configFromEnv = this.getConfigFromEnv(configFromKibanaConfig); - const config = [configFromKibanaConfig, configFromEnv].reduce( - (acc, conf) => deepmerge(acc, conf), - {} - ); + const config = merge({}, configFromKibanaConfig, configFromEnv); if (config.active === false && config.contextPropagationOnly !== false) { throw new Error( diff --git a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts index 12e9454a7770a2..991e5e40b63407 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts @@ -86,6 +86,11 @@ export class Instance extends Entity { return this; } + hostName(hostName: string) { + this.fields['host.name'] = hostName; + return this; + } + podId(podId: string) { this.fields['kubernetes.pod.uid'] = podId; return this; diff --git a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts index 3ba3e3a20bb96c..a649d60df57a21 100644 --- a/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts +++ b/packages/kbn-apm-synthtrace-client/src/lib/logs/index.ts @@ -23,6 +23,7 @@ export type LogDocument = Fields & 'event.dataset': string; 'log.level'?: string; 'host.name'?: string; + 'container.id'?: string; 'trace.id'?: string; 'agent.id'?: string; 'agent.name'?: string; @@ -47,6 +48,16 @@ class Log extends Serializable { return this; } + hostName(name: string) { + this.fields['host.name'] = name; + return this; + } + + containerId(id: string) { + this.fields['container.id'] = id; + return this; + } + namespace(value: string) { this.fields['data_stream.namespace'] = value; return this; diff --git a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts index 16e9f6c3be4050..d617bbe54d3c44 100644 --- a/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts +++ b/packages/kbn-apm-synthtrace/src/scenarios/simple_logs.ts @@ -19,7 +19,7 @@ const scenario: Scenario = async (runOptions) => { // Logs Data logic const MESSAGE_LOG_LEVELS = [ - { message: 'A simple log', level: 'info' }, + { message: 'A simple log with something random in the middle', level: 'info' }, { message: 'Yet another debug log', level: 'debug' }, { message: 'Error with certificate: "ca_trusted_fingerprint"', level: 'error' }, ]; @@ -44,11 +44,14 @@ const scenario: Scenario = async (runOptions) => { .fill(0) .map(() => { const index = Math.floor(Math.random() * 3); + const { message, level } = MESSAGE_LOG_LEVELS[index]; + const serviceName = SERVICE_NAMES[index]; + return log .create() - .message(MESSAGE_LOG_LEVELS[index].message) - .logLevel(MESSAGE_LOG_LEVELS[index].level) - .service(SERVICE_NAMES[index]) + .message(message.replace('', generateShortId())) + .logLevel(level) + .service(serviceName) .defaults({ 'trace.id': generateShortId(), 'agent.name': 'nodejs', diff --git a/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts b/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts new file mode 100644 index 00000000000000..8dfbc6a131843f --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/spiked_latency.ts @@ -0,0 +1,165 @@ +/* + * Copyright 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 { random } from 'lodash'; +import { + apm, + log, + ApmFields, + generateLongId, + generateShortId, + Instance, +} from '@kbn/apm-synthtrace-client'; +import { Scenario } from '../cli/scenario'; +import { getSynthtraceEnvironment } from '../lib/utils/get_synthtrace_environment'; +import { withClient } from '../lib/utils/with_client'; + +const ENVIRONMENT = getSynthtraceEnvironment(__filename); +const alwaysSpikeTransactionName = 'GET /always-spike'; +const sometimesSpikeTransactionName = 'GET /sometimes-spike'; + +const scenario: Scenario = async ({ logger }) => { + return { + generate: ({ range, clients: { apmEsClient, logsEsClient } }) => { + const serviceNames = ['spikey-frontend', 'spikey-backend']; + + const clusters = [ + { provider: 'gcp', region: 'eu-central-1' }, + { provider: 'aws', region: 'us-east-1' }, + { provider: 'azure', region: 'area-51' }, + ].map((cluster, index) => ({ + clusterName: `synth-cluster-${index}`, + clusterId: generateShortId(), + projectId: generateShortId(), + ressourceId: generateShortId(), + instanceId: generateShortId(), + cloudProvider: cluster.provider, + cloudRegion: cluster.region, + })); + + const containerId = `spiked-${generateShortId()}`; + const hostName = `spiked-${generateShortId()}`; + + function buildLogs(serviceName: string) { + return range + .interval('1m') + .rate(100) + .generator((timestamp) => { + const clusterIndex = Math.floor(Math.random() * clusters.length); + const { + clusterId, + clusterName, + projectId, + ressourceId, + instanceId, + cloudRegion, + cloudProvider, + } = clusters[clusterIndex]; + + return log + .create() + .message(`Error message #${generateShortId()} from ${serviceName}`) + .logLevel('error') + .service(serviceName) + .containerId(containerId) + .hostName(hostName) + .defaults({ + 'trace.id': generateShortId(), + 'agent.name': 'synth-agent', + 'orchestrator.cluster.name': clusterName, + 'orchestrator.cluster.id': clusterId, + 'orchestrator.resource.id': ressourceId, + 'cloud.provider': cloudProvider, + 'cloud.region': cloudRegion, + 'cloud.availability_zone': `${cloudRegion}`, + 'cloud.project.id': projectId, + 'cloud.instance.id': instanceId, + 'log.file.path': `/logs/${generateLongId()}/error.txt`, + }) + .timestamp(timestamp); + }); + } + + const serviceInstances = serviceNames.map((serviceName) => + apm + .service({ name: serviceName, environment: ENVIRONMENT, agentName: 'go' }) + .instance(`my-instance`) + ); + + const transactionNames = [ + 'GET /order', + 'GET /product', + alwaysSpikeTransactionName, + sometimesSpikeTransactionName, + ]; + + const buildTransactions = (serviceInstance: Instance, transactionName: string) => { + const interval = random(1, 100, false); + const rangeWithInterval = range.interval(`${interval}s`); + + return rangeWithInterval.generator((timestamp, i) => { + const duration = getDuration(transactionName); + return serviceInstance + .containerId(containerId) + .hostName(hostName) + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(duration) + .children( + serviceInstance + .span({ + spanName: 'GET apm-*/_search', + spanType: 'db', + spanSubtype: 'elasticsearch', + }) + .duration(duration * 0.9) + .destination('elasticsearch') + .timestamp(timestamp) + .outcome('success') + ) + .success(); + }); + }; + + return [ + withClient( + logsEsClient, + logger.perf('generating_logs', () => + serviceNames.map((serviceName) => buildLogs(serviceName)) + ) + ), + withClient( + apmEsClient, + logger.perf('generating_apm_events', () => + serviceInstances.flatMap((serviceInstance) => + transactionNames.flatMap((transactionName) => + buildTransactions(serviceInstance, transactionName) + ) + ) + ) + ), + ]; + }, + }; +}; + +function getDuration(transactionName: string) { + const spikedDuration = random(40000, 41000, false); + const normalDuration = random(400, 500, false); + + switch (transactionName) { + case alwaysSpikeTransactionName: + return spikedDuration; + case sometimesSpikeTransactionName: + return Math.random() > 0.01 ? spikedDuration : normalDuration; + default: + return normalDuration; + } +} + +export default scenario; diff --git a/packages/kbn-check-mappings-update-cli/current_fields.json b/packages/kbn-check-mappings-update-cli/current_fields.json index 11a0173c973ce9..5a26aca6bacc19 100644 --- a/packages/kbn-check-mappings-update-cli/current_fields.json +++ b/packages/kbn-check-mappings-update-cli/current_fields.json @@ -462,8 +462,8 @@ ], "infra-custom-dashboards": [ "assetType", - "dashboardIdList", - "kuery" + "dashboardFilterAssetIdEnabled", + "dashboardSavedObjectId" ], "infrastructure-monitoring-log-view": [ "name" diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 2096be33bff9e6..246c02b7dfec30 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -1559,15 +1559,16 @@ } }, "infra-custom-dashboards": { + "dynamic": false, "properties": { "assetType": { "type": "keyword" }, - "dashboardIdList": { + "dashboardSavedObjectId": { "type": "keyword" }, - "kuery": { - "type": "text" + "dashboardFilterAssetIdEnabled": { + "type": "boolean" } } }, diff --git a/packages/kbn-es-types/src/search.test.ts b/packages/kbn-es-types/src/search.test.ts new file mode 100644 index 00000000000000..6a5218b8f3a471 --- /dev/null +++ b/packages/kbn-es-types/src/search.test.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { AggregateOfMap } from './search'; + +xdescribe('AggregateOfMap', () => { + test('aggregations should assume buckets are there if type is explicit', () => { + type MyAggregation = {} & { + group_by: { + terms: unknown; + }; + }; + + const aggregation = {} as unknown as AggregateOfMap; + aggregation.group_by.buckets.length.toFixed(); // using a number-specific method + }); + + test('aggregations should not assume buckets are there if the aggregation may be undefined', () => { + type MyAggregation = + | undefined + | ({} & { + group_by: { + terms: unknown; + }; + }); + + const aggregation = {} as unknown as AggregateOfMap; + aggregation?.group_by.buckets.length.toFixed(); // using a number-specific method + // @ts-expect-error "aggregation" may be undefined + aggregation.group_by.buckets.length.toFixed(); // using a number-specific method + }); + + test('aggregations should not assume buckets are there if the bucket name may be undefined', () => { + type MyAggregation = + | {} & { + group_by?: { + terms: unknown; + }; + }; + + const aggregation = {} as unknown as AggregateOfMap; + aggregation.group_by?.buckets.length.toFixed(); // using a number-specific method + // @ts-expect-error "group_by" may be undefined + aggregation.group_by.buckets.length.toFixed(); // using a number-specific method + }); +}); diff --git a/packages/kbn-es-types/src/search.ts b/packages/kbn-es-types/src/search.ts index 6b76defd30aaad..43fbe155860901 100644 --- a/packages/kbn-es-types/src/search.ts +++ b/packages/kbn-es-types/src/search.ts @@ -421,6 +421,7 @@ export type AggregateOf< { doc_count: number; key: string[]; + key_as_string: string; } & SubAggregateOf >; }; @@ -563,6 +564,16 @@ export type AggregateOf< } & SubAggregateOf >; }; + categorize_text: { + buckets: Array< + { + doc_count: number; + key: string | number; + regex?: string; + max_matching_length: number; + } & SubAggregateOf + >; + }; top_hits: { hits: { total: { @@ -593,8 +604,7 @@ export type AggregateOf< export type AggregateOfMap = { [TAggregationName in keyof TAggregationMap]: Required[TAggregationName] extends AggregationsAggregationContainer - ? // @ts-expect-error not sure how to fix this, anything I've tried causes errors upstream - Dario - AggregateOf + ? AggregateOf[TAggregationName], TDocument> : never; // using never means we effectively ignore optional keys, using {} creates a union type of { ... } | {} }; diff --git a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts index 7820d6d9cf7d10..e021d39bb2cdcd 100644 --- a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts +++ b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.test.ts @@ -79,6 +79,11 @@ describe('sql/esql query helpers', () => { const idxPattern10 = getIndexPatternFromESQLQuery('FROM foo-1, remote_cluster:foo-2, foo-3'); expect(idxPattern10).toBe('foo-1, remote_cluster:foo-2, foo-3'); + + const idxPattern11 = getIndexPatternFromESQLQuery( + 'FROM foo-1, foo-2 | where event.reason like "*Disable: changed from [true] to [false]*"' + ); + expect(idxPattern11).toBe('foo-1, foo-2'); }); }); diff --git a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts index 6f96a0ae445e87..bd4985e7fc3063 100644 --- a/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts +++ b/packages/kbn-esql-utils/src/utils/query_parsing_helpers.ts @@ -27,12 +27,13 @@ export function getIndexPatternFromSQLQuery(sqlQuery?: string): string { // retrieves the index pattern from the aggregate query for ES|QL export function getIndexPatternFromESQLQuery(esql?: string): string { - const splitFroms = esql?.split(new RegExp(/FROM\s/, 'ig')); + let fromPipe = (esql || '').split('|')[0]; + const splitFroms = fromPipe?.split(new RegExp(/FROM\s/, 'ig')); const fromsLength = splitFroms?.length ?? 0; if (splitFroms && splitFroms?.length > 2) { - esql = `${splitFroms[fromsLength - 2]} FROM ${splitFroms[fromsLength - 1]}`; + fromPipe = `${splitFroms[fromsLength - 2]} FROM ${splitFroms[fromsLength - 1]}`; } - const parsedString = esql?.replaceAll('`', ''); + const parsedString = fromPipe?.replaceAll('`', ''); // case insensitive match for the index pattern const regex = new RegExp(/FROM\s+([(\w*:)?\w*-.!@$^()~;\s]+)/, 'i'); const matches = parsedString?.match(regex); diff --git a/packages/kbn-field-utils/src/utils/field_types.ts b/packages/kbn-field-utils/src/utils/field_types.ts index 1d2649552479e2..70c2582d52f8fb 100644 --- a/packages/kbn-field-utils/src/utils/field_types.ts +++ b/packages/kbn-field-utils/src/utils/field_types.ts @@ -37,6 +37,7 @@ export enum KNOWN_FIELD_TYPES { POINT = 'point', SHAPE = 'shape', SPARSE_VECTOR = 'sparse_vector', + SEMANTIC_TEXT = 'semantic_text', STRING = 'string', TEXT = 'text', VERSION = 'version', diff --git a/packages/kbn-field-utils/src/utils/get_field_type_description.ts b/packages/kbn-field-utils/src/utils/get_field_type_description.ts index 332f013b90db7a..f5319a557e2acf 100644 --- a/packages/kbn-field-utils/src/utils/get_field_type_description.ts +++ b/packages/kbn-field-utils/src/utils/get_field_type_description.ts @@ -122,6 +122,10 @@ export function getFieldTypeDescription(type?: string) { return i18n.translate('fieldUtils.fieldNameDescription.sparseVectorField', { defaultMessage: 'Records sparse vectors of float values.', }); + case KNOWN_FIELD_TYPES.SEMANTIC_TEXT: + return i18n.translate('fieldUtils.fieldNameDescription.semanticTextField', { + defaultMessage: 'References model id used for text embeddings.', + }); case KNOWN_FIELD_TYPES.STRING: return i18n.translate('fieldUtils.fieldNameDescription.stringField', { defaultMessage: 'Full text such as the body of an email or a product description.', diff --git a/packages/kbn-field-utils/src/utils/get_field_type_name.ts b/packages/kbn-field-utils/src/utils/get_field_type_name.ts index bdf88897958b9d..d961d95793f8ff 100644 --- a/packages/kbn-field-utils/src/utils/get_field_type_name.ts +++ b/packages/kbn-field-utils/src/utils/get_field_type_name.ts @@ -127,6 +127,10 @@ export function getFieldTypeName(type?: string) { return i18n.translate('fieldUtils.fieldNameIcons.sparseVectorFieldAriaLabel', { defaultMessage: 'Sparse vector', }); + case KNOWN_FIELD_TYPES.SEMANTIC_TEXT: + return i18n.translate('fieldUtils.fieldNameIcons.semanticTextFieldAriaLabel', { + defaultMessage: 'Semantic text', + }); case KNOWN_FIELD_TYPES.STRING: return i18n.translate('fieldUtils.fieldNameIcons.stringFieldAriaLabel', { defaultMessage: 'String', diff --git a/packages/kbn-lens-embeddable-utils/config_builder/utils.ts b/packages/kbn-lens-embeddable-utils/config_builder/utils.ts index 6f6be44c9c8bc9..2dcb4205f96104 100644 --- a/packages/kbn-lens-embeddable-utils/config_builder/utils.ts +++ b/packages/kbn-lens-embeddable-utils/config_builder/utils.ts @@ -88,7 +88,7 @@ export function buildReferences(dataviews: Record) { const getAdhocDataView = (dataView: DataView): Record => { return { [dataView.id ?? uuidv4()]: { - ...dataView.toSpec(), + ...dataView.toSpec(false), }, }; }; diff --git a/packages/kbn-monaco/index.ts b/packages/kbn-monaco/index.ts index 25f683aacb247b..9139ec40f706d3 100644 --- a/packages/kbn-monaco/index.ts +++ b/packages/kbn-monaco/index.ts @@ -32,4 +32,9 @@ import { registerLanguage } from './src/helpers'; export { BarePluginApi, registerLanguage }; export * from './src/types'; -export { CONSOLE_LANG_ID, CONSOLE_THEME_ID } from './src/console'; +export { + CONSOLE_LANG_ID, + CONSOLE_OUTPUT_LANG_ID, + CONSOLE_THEME_ID, + CONSOLE_OUTPUT_THEME_ID, +} from './src/console'; diff --git a/packages/kbn-monaco/src/console/constants.ts b/packages/kbn-monaco/src/console/constants.ts index 1eba867b617c06..c6563efba93acb 100644 --- a/packages/kbn-monaco/src/console/constants.ts +++ b/packages/kbn-monaco/src/console/constants.ts @@ -8,4 +8,6 @@ export const CONSOLE_LANG_ID = 'console'; export const CONSOLE_THEME_ID = 'consoleTheme'; +export const CONSOLE_OUTPUT_LANG_ID = 'consoleOutput'; +export const CONSOLE_OUTPUT_THEME_ID = 'consoleOutputTheme'; export const CONSOLE_POSTFIX = '.console'; diff --git a/packages/kbn-monaco/src/console/index.ts b/packages/kbn-monaco/src/console/index.ts index e94ebdd0ccae56..991d9afce240be 100644 --- a/packages/kbn-monaco/src/console/index.ts +++ b/packages/kbn-monaco/src/console/index.ts @@ -12,15 +12,31 @@ import './language'; import type { LangModuleType } from '../types'; -import { CONSOLE_LANG_ID } from './constants'; -import { lexerRules, languageConfiguration } from './lexer_rules'; +import { CONSOLE_LANG_ID, CONSOLE_OUTPUT_LANG_ID } from './constants'; +import { + lexerRules, + languageConfiguration, + consoleOutputLexerRules, + consoleOutputLanguageConfiguration, +} from './lexer_rules'; -export { CONSOLE_LANG_ID, CONSOLE_THEME_ID } from './constants'; +export { + CONSOLE_LANG_ID, + CONSOLE_OUTPUT_LANG_ID, + CONSOLE_THEME_ID, + CONSOLE_OUTPUT_THEME_ID, +} from './constants'; -export { buildConsoleTheme } from './theme'; +export { buildConsoleTheme, buildConsoleOutputTheme } from './theme'; export const ConsoleLang: LangModuleType = { ID: CONSOLE_LANG_ID, lexerRules, languageConfiguration, }; + +export const ConsoleOutputLang: LangModuleType = { + ID: CONSOLE_OUTPUT_LANG_ID, + lexerRules: consoleOutputLexerRules, + languageConfiguration: consoleOutputLanguageConfiguration, +}; diff --git a/packages/kbn-monaco/src/console/lexer_rules/console_editor.ts b/packages/kbn-monaco/src/console/lexer_rules/console_editor.ts new file mode 100644 index 00000000000000..22878e000fc6cd --- /dev/null +++ b/packages/kbn-monaco/src/console/lexer_rules/console_editor.ts @@ -0,0 +1,95 @@ +/* + * Copyright 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 { + consoleSharedLanguageConfiguration, + consoleSharedLexerRules, + matchTokensWithEOL, + matchToken, +} from './shared'; +import { monaco } from '../../monaco_imports'; + +export const languageConfiguration: monaco.languages.LanguageConfiguration = { + ...consoleSharedLanguageConfiguration, +}; + +export const lexerRules: monaco.languages.IMonarchLanguage = { + ...consoleSharedLexerRules, + tokenizer: { + ...consoleSharedLexerRules.tokenizer, + root: [ + ...consoleSharedLexerRules.tokenizer.root, + // method + matchTokensWithEOL('method', /([a-zA-Z]+)/, 'root', 'method_sep'), + // whitespace + matchToken('whitespace', '\\s+'), + // text + matchToken('text', '.+?'), + ], + method_sep: [ + // protocol host with slash + matchTokensWithEOL( + ['whitespace', 'url.protocol_host', 'url.slash'], + /(\s+)(https?:\/\/[^?\/,]+)(\/)/, + 'root', + 'url' + ), + // variable template + matchTokensWithEOL(['whitespace', 'variable.template'], /(\s+)(\${\w+})/, 'root', 'url'), + // protocol host + matchTokensWithEOL( + ['whitespace', 'url.protocol_host'], + /(\s+)(https?:\/\/[^?\/,]+)/, + 'root', + 'url' + ), + // slash + matchTokensWithEOL(['whitespace', 'url.slash'], /(\s+)(\/)/, 'root', 'url'), + // whitespace + matchTokensWithEOL('whitespace', /(\s+)/, 'root', 'url'), + ], + url: [ + // variable template + matchTokensWithEOL('variable.template', /(\${\w+})/, 'root'), + // pathname + matchTokensWithEOL('url.part', /([^?\/,\s]+)\s*/, 'root'), + // comma + matchTokensWithEOL('url.comma', /(,)/, 'root'), + // slash + matchTokensWithEOL('url.slash', /(\/)/, 'root'), + // question mark + matchTokensWithEOL('url.questionmark', /(\?)/, 'root', 'urlParams'), + // comment + matchTokensWithEOL( + ['whitespace', 'comment.punctuation', 'comment.line'], + /(\s+)(\/\/)(.*$)/, + 'root' + ), + ], + urlParams: [ + // param with variable template + matchTokensWithEOL( + ['url.param', 'url.equal', 'variable.template'], + /([^&=]+)(=)(\${\w+})/, + 'root' + ), + // param with value + matchTokensWithEOL(['url.param', 'url.equal', 'url.value'], /([^&=]+)(=)([^&]*)/, 'root'), + // param + matchTokensWithEOL('url.param', /([^&=]+)/, 'root'), + // ampersand + matchTokensWithEOL('url.amp', /(&)/, 'root'), + // comment + matchTokensWithEOL( + ['whitespace', 'comment.punctuation', 'comment.line'], + /(\s+)(\/\/)(.*$)/, + 'root' + ), + ], + }, +}; diff --git a/packages/kbn-monaco/src/console/lexer_rules/console_output.ts b/packages/kbn-monaco/src/console/lexer_rules/console_output.ts new file mode 100644 index 00000000000000..02e14e35aa3a10 --- /dev/null +++ b/packages/kbn-monaco/src/console/lexer_rules/console_output.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { consoleSharedLanguageConfiguration, consoleSharedLexerRules } from './shared'; +import { monaco } from '../../monaco_imports'; + +export const consoleOutputLanguageConfiguration: monaco.languages.LanguageConfiguration = { + ...consoleSharedLanguageConfiguration, +}; + +export const consoleOutputLexerRules: monaco.languages.IMonarchLanguage = { + ...consoleSharedLexerRules, +}; diff --git a/packages/kbn-monaco/src/console/lexer_rules/index.ts b/packages/kbn-monaco/src/console/lexer_rules/index.ts index bf40e2c2824f6b..b438c7a16e1ed5 100644 --- a/packages/kbn-monaco/src/console/lexer_rules/index.ts +++ b/packages/kbn-monaco/src/console/lexer_rules/index.ts @@ -6,192 +6,5 @@ * Side Public License, v 1. */ -import { monaco } from '../../monaco_imports'; -import { globals } from '../../common/lexer_rules'; -import { buildXjsonRules } from '../../xjson/lexer_rules/xjson'; - -export const languageConfiguration: monaco.languages.LanguageConfiguration = { - brackets: [ - ['{', '}'], - ['[', ']'], - ], - autoClosingPairs: [ - { open: '{', close: '}' }, - { open: '[', close: ']' }, - { open: '"', close: '"' }, - ], -}; - -/* - util function to build the action object - */ -const addNextStateToAction = (tokens: string[], nextState?: string) => { - return tokens.map((token, index) => { - // only last action needs to specify the next state - if (index === tokens.length - 1 && nextState) { - return { token, next: nextState }; - } - return token; - }); -}; - -/* - if regex is matched, tokenize as "token" and move to the state "nextState" if defined - */ -const matchToken = (token: string, regex: string | RegExp, nextState?: string) => { - if (nextState) { - return { regex, action: { token, next: nextState } }; - } - return { regex, action: { token } }; -}; - -/* - if regex is matched, tokenize as "tokens" consecutively and move to the state "nextState" - regex needs to have the same number of capturing group as the number of tokens - */ -const matchTokens = (tokens: string[], regex: string | RegExp, nextState?: string) => { - const action = addNextStateToAction(tokens, nextState); - return { - regex, - action, - }; -}; - -const matchTokensWithEOL = ( - tokens: string | string[], - regex: string | RegExp, - nextIfEOL: string, - normalNext?: string -) => { - if (Array.isArray(tokens)) { - const endOfLineAction = addNextStateToAction(tokens, nextIfEOL); - const action = addNextStateToAction(tokens, normalNext); - return { - regex, - action: { - cases: { - '@eos': endOfLineAction, - '@default': action, - }, - }, - }; - } - return { - regex, - action: { - cases: { - '@eos': { token: tokens, next: nextIfEOL }, - '@default': { token: tokens, next: normalNext }, - }, - }, - }; -}; - -const xjsonRules = { ...buildXjsonRules('json_root') }; -// @ts-expect-error include comments into json -xjsonRules.json_root = [{ include: '@comments' }, ...xjsonRules.json_root]; -xjsonRules.json_root = [ - // @ts-expect-error include variables into json - matchToken('variable.template', /("\${\w+}")/), - ...xjsonRules.json_root, -]; - -export const lexerRules: monaco.languages.IMonarchLanguage = { - ...(globals as any), - - defaultToken: 'invalid', - tokenizer: { - root: [ - // warning comment - matchToken('warning', '#!.*$'), - // comments - { include: '@comments' }, - // start of json - matchToken('paren.lparen', '{', 'json_root'), - // method - matchTokensWithEOL('method', /([a-zA-Z]+)/, 'root', 'method_sep'), - // whitespace - matchToken('whitespace', '\\s+'), - // text - matchToken('text', '.+?'), - ], - method_sep: [ - // protocol host with slash - matchTokensWithEOL( - ['whitespace', 'url.protocol_host', 'url.slash'], - /(\s+)(https?:\/\/[^?\/,]+)(\/)/, - 'root', - 'url' - ), - // variable template - matchTokensWithEOL(['whitespace', 'variable.template'], /(\s+)(\${\w+})/, 'root', 'url'), - // protocol host - matchTokensWithEOL( - ['whitespace', 'url.protocol_host'], - /(\s+)(https?:\/\/[^?\/,]+)/, - 'root', - 'url' - ), - // slash - matchTokensWithEOL(['whitespace', 'url.slash'], /(\s+)(\/)/, 'root', 'url'), - // whitespace - matchTokensWithEOL('whitespace', /(\s+)/, 'root', 'url'), - ], - url: [ - // variable template - matchTokensWithEOL('variable.template', /(\${\w+})/, 'root'), - // pathname - matchTokensWithEOL('url.part', /([^?\/,\s]+)\s*/, 'root'), - // comma - matchTokensWithEOL('url.comma', /(,)/, 'root'), - // slash - matchTokensWithEOL('url.slash', /(\/)/, 'root'), - // question mark - matchTokensWithEOL('url.questionmark', /(\?)/, 'root', 'urlParams'), - // comment - matchTokensWithEOL( - ['whitespace', 'comment.punctuation', 'comment.line'], - /(\s+)(\/\/)(.*$)/, - 'root' - ), - ], - urlParams: [ - // param with variable template - matchTokensWithEOL( - ['url.param', 'url.equal', 'variable.template'], - /([^&=]+)(=)(\${\w+})/, - 'root' - ), - // param with value - matchTokensWithEOL(['url.param', 'url.equal', 'url.value'], /([^&=]+)(=)([^&]*)/, 'root'), - // param - matchTokensWithEOL('url.param', /([^&=]+)/, 'root'), - // ampersand - matchTokensWithEOL('url.amp', /(&)/, 'root'), - // comment - matchTokensWithEOL( - ['whitespace', 'comment.punctuation', 'comment.line'], - /(\s+)(\/\/)(.*$)/, - 'root' - ), - ], - comments: [ - // line comment indicated by # - matchTokens(['comment.punctuation', 'comment.line'], /(#)(.*$)/), - // start a block comment indicated by /* - matchToken('comment.punctuation', /\/\*/, 'block_comment'), - // line comment indicated by // - matchTokens(['comment.punctuation', 'comment.line'], /(\/\/)(.*$)/), - ], - block_comment: [ - // match everything on a single line inside the comment except for chars / and * - matchToken('comment', /[^\/*]+/), - // end block comment - matchToken('comment.punctuation', /\*\//, '@pop'), - // match individual chars inside a multi-line comment - matchToken('comment', /[\/*]/), - ], - // include json rules - ...xjsonRules, - }, -}; +export { lexerRules, languageConfiguration } from './console_editor'; +export { consoleOutputLexerRules, consoleOutputLanguageConfiguration } from './console_output'; diff --git a/packages/kbn-monaco/src/console/lexer_rules/shared.ts b/packages/kbn-monaco/src/console/lexer_rules/shared.ts new file mode 100644 index 00000000000000..f9ceb0f9f85e9f --- /dev/null +++ b/packages/kbn-monaco/src/console/lexer_rules/shared.ts @@ -0,0 +1,133 @@ +/* + * Copyright 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 { monaco } from '../../..'; +import { globals } from '../../common/lexer_rules'; +import { buildXjsonRules } from '../../xjson/lexer_rules/xjson'; + +export const consoleSharedLanguageConfiguration: monaco.languages.LanguageConfiguration = { + brackets: [ + ['{', '}'], + ['[', ']'], + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '"', close: '"' }, + ], +}; + +/* + util function to build the action object + */ +const addNextStateToAction = (tokens: string[], nextState?: string) => { + return tokens.map((token, index) => { + // only last action needs to specify the next state + if (index === tokens.length - 1 && nextState) { + return { token, next: nextState }; + } + return token; + }); +}; + +/* + if regex is matched, tokenize as "token" and move to the state "nextState" if defined + */ +export const matchToken = (token: string, regex: string | RegExp, nextState?: string) => { + if (nextState) { + return { regex, action: { token, next: nextState } }; + } + return { regex, action: { token } }; +}; + +/* + if regex is matched, tokenize as "tokens" consecutively and move to the state "nextState" + regex needs to have the same number of capturing group as the number of tokens + */ +export const matchTokens = (tokens: string[], regex: string | RegExp, nextState?: string) => { + const action = addNextStateToAction(tokens, nextState); + return { + regex, + action, + }; +}; + +export const matchTokensWithEOL = ( + tokens: string | string[], + regex: string | RegExp, + nextIfEOL: string, + normalNext?: string +) => { + if (Array.isArray(tokens)) { + const endOfLineAction = addNextStateToAction(tokens, nextIfEOL); + const action = addNextStateToAction(tokens, normalNext); + return { + regex, + action: { + cases: { + '@eos': endOfLineAction, + '@default': action, + }, + }, + }; + } + return { + regex, + action: { + cases: { + '@eos': { token: tokens, next: nextIfEOL }, + '@default': { token: tokens, next: normalNext }, + }, + }, + }; +}; + +export const xjsonRules = { ...buildXjsonRules('json_root') }; +// @ts-expect-error include comments into json +xjsonRules.json_root = [{ include: '@comments' }, ...xjsonRules.json_root]; +xjsonRules.json_root = [ + // @ts-expect-error include variables into json + matchToken('variable.template', /("\${\w+}")/), + ...xjsonRules.json_root, +]; + +/* + Lexer rules that are shared between the Console editor and the Console output panel. + */ +export const consoleSharedLexerRules: monaco.languages.IMonarchLanguage = { + ...(globals as any), + defaultToken: 'invalid', + tokenizer: { + root: [ + // warning comment + matchToken('warning', '#!.*$'), + // comments + { include: '@comments' }, + // start of json + matchToken('paren.lparen', '{', 'json_root'), + ], + comments: [ + // line comment indicated by # + matchTokens(['comment.punctuation', 'comment.line'], /(#)(.*$)/), + // start a block comment indicated by /* + matchToken('comment.punctuation', /\/\*/, 'block_comment'), + // line comment indicated by // + matchTokens(['comment.punctuation', 'comment.line'], /(\/\/)(.*$)/), + ], + block_comment: [ + // match everything on a single line inside the comment except for chars / and * + matchToken('comment', /[^\/*]+/), + // end block comment + matchToken('comment.punctuation', /\*\//, '@pop'), + // match individual chars inside a multi-line comment + matchToken('comment', /[\/*]/), + ], + // include json rules + ...xjsonRules, + }, +}; diff --git a/packages/kbn-monaco/src/console/theme/editor_theme.ts b/packages/kbn-monaco/src/console/theme/editor_theme.ts new file mode 100644 index 00000000000000..f01c34919bb09f --- /dev/null +++ b/packages/kbn-monaco/src/console/theme/editor_theme.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { makeHighContrastColor } from '@elastic/eui'; +import { euiThemeVars } from '@kbn/ui-theme'; + +import { themeRuleGroupBuilderFactory } from '../../common/theme'; +import { monaco } from '../../monaco_imports'; +import { buildConsoleSharedTheme } from './shared'; + +const buildRuleGroup = themeRuleGroupBuilderFactory(); + +const background = euiThemeVars.euiColorLightestShade; +const methodTextColor = '#DD0A73'; +const urlTextColor = '#00A69B'; +export const buildConsoleTheme = (): monaco.editor.IStandaloneThemeData => { + const sharedTheme = buildConsoleSharedTheme(); + return { + ...sharedTheme, + rules: [ + ...sharedTheme.rules, + ...buildRuleGroup(['method'], makeHighContrastColor(methodTextColor)(background)), + ...buildRuleGroup(['url'], makeHighContrastColor(urlTextColor)(background)), + ], + }; +}; diff --git a/packages/kbn-monaco/src/console/theme/index.ts b/packages/kbn-monaco/src/console/theme/index.ts new file mode 100644 index 00000000000000..b9e03585f62976 --- /dev/null +++ b/packages/kbn-monaco/src/console/theme/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright 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 { buildConsoleTheme } from './editor_theme'; +export { buildConsoleOutputTheme } from './output_theme'; diff --git a/packages/kbn-monaco/src/console/theme/output_theme.ts b/packages/kbn-monaco/src/console/theme/output_theme.ts new file mode 100644 index 00000000000000..ad6ffae7571280 --- /dev/null +++ b/packages/kbn-monaco/src/console/theme/output_theme.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { monaco } from '../../monaco_imports'; +import { buildConsoleSharedTheme } from './shared'; + +export const buildConsoleOutputTheme = (): monaco.editor.IStandaloneThemeData => { + const sharedTheme = buildConsoleSharedTheme(); + return { + ...sharedTheme, + }; +}; diff --git a/packages/kbn-monaco/src/console/theme.ts b/packages/kbn-monaco/src/console/theme/shared.ts similarity index 81% rename from packages/kbn-monaco/src/console/theme.ts rename to packages/kbn-monaco/src/console/theme/shared.ts index b9330ec97afee8..3bdb543f6ef9d8 100644 --- a/packages/kbn-monaco/src/console/theme.ts +++ b/packages/kbn-monaco/src/console/theme/shared.ts @@ -9,26 +9,22 @@ import { makeHighContrastColor } from '@elastic/eui'; import { darkMode, euiThemeVars } from '@kbn/ui-theme'; -import { themeRuleGroupBuilderFactory } from '../common/theme'; -import { monaco } from '../monaco_imports'; +import { themeRuleGroupBuilderFactory } from '../../common/theme'; +import { monaco } from '../../monaco_imports'; const buildRuleGroup = themeRuleGroupBuilderFactory(); const background = euiThemeVars.euiColorLightestShade; -const methodTextColor = '#DD0A73'; -const urlTextColor = '#00A69B'; const stringTextColor = '#009926'; const commentTextColor = '#4C886B'; const variableTextColor = '#0079A5'; const booleanTextColor = '#585CF6'; const numericTextColor = variableTextColor; -export const buildConsoleTheme = (): monaco.editor.IStandaloneThemeData => { +export const buildConsoleSharedTheme = (): monaco.editor.IStandaloneThemeData => { return { base: darkMode ? 'vs-dark' : 'vs', inherit: true, rules: [ - ...buildRuleGroup(['method'], makeHighContrastColor(methodTextColor)(background)), - ...buildRuleGroup(['url'], makeHighContrastColor(urlTextColor)(background)), ...buildRuleGroup( ['string', 'string-literal', 'multi-string', 'punctuation.end-triple-quote'], makeHighContrastColor(stringTextColor)(background) diff --git a/packages/kbn-monaco/src/register_globals.ts b/packages/kbn-monaco/src/register_globals.ts index dc69e2ceaa8b03..82c057b43ae424 100644 --- a/packages/kbn-monaco/src/register_globals.ts +++ b/packages/kbn-monaco/src/register_globals.ts @@ -13,7 +13,14 @@ import { monaco } from './monaco_imports'; import { ESQL_THEME_ID, ESQLLang, buildESQlTheme } from './esql'; import { YAML_LANG_ID } from './yaml'; import { registerLanguage, registerTheme } from './helpers'; -import { ConsoleLang, CONSOLE_THEME_ID, buildConsoleTheme } from './console'; +import { + ConsoleLang, + ConsoleOutputLang, + CONSOLE_THEME_ID, + CONSOLE_OUTPUT_THEME_ID, + buildConsoleTheme, + buildConsoleOutputTheme, +} from './console'; export const DEFAULT_WORKER_ID = 'default'; const langSpecificWorkerIds = [ @@ -23,6 +30,7 @@ const langSpecificWorkerIds = [ monaco.languages.json.jsonDefaults.languageId, YAML_LANG_ID, ConsoleLang.ID, + ConsoleOutputLang.ID, ]; /** @@ -33,12 +41,14 @@ registerLanguage(PainlessLang); registerLanguage(SQLLang); registerLanguage(ESQLLang); registerLanguage(ConsoleLang); +registerLanguage(ConsoleOutputLang); /** * Register custom themes */ registerTheme(ESQL_THEME_ID, buildESQlTheme()); registerTheme(CONSOLE_THEME_ID, buildConsoleTheme()); +registerTheme(CONSOLE_OUTPUT_THEME_ID, buildConsoleOutputTheme()); const monacoBundleDir = (window as any).__kbnPublicPath__?.['kbn-monaco']; diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 7b4a5b27b78c7a..d36895151587f1 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -17,6 +17,9 @@ import webpackMerge from 'webpack-merge'; import { CleanWebpackPlugin } from 'clean-webpack-plugin'; import UiSharedDepsNpm from '@kbn/ui-shared-deps-npm'; import * as UiSharedDepsSrc from '@kbn/ui-shared-deps-src'; +import StatoscopeWebpackPlugin from '@statoscope/webpack-plugin'; +// @ts-expect-error +import VisualizerPlugin from 'webpack-visualizer-plugin2'; import { Bundle, BundleRemotes, WorkerConfig, parseDllManifest } from '../common'; import { BundleRemotesPlugin } from './bundle_remotes_plugin'; @@ -80,7 +83,18 @@ export function getWebpackConfig( context: worker.repoRoot, manifest: DLL_MANIFEST, }), - ...(worker.profileWebpack ? [new EmitStatsPlugin(bundle)] : []), + // @ts-ignore something is wrong with the StatoscopeWebpackPlugin type. + ...(worker.profileWebpack + ? [ + new EmitStatsPlugin(bundle), + new StatoscopeWebpackPlugin({ + open: false, + saveReportTo: `${bundle.outputDir}/${bundle.id}.statoscope.html`, + }), + new VisualizerPlugin({ filename: `${bundle.id}.visualizer.html` }), + ] + : []), + // @ts-ignore something is wrong with the StatoscopeWebpackPlugin type. ...(bundle.banner ? [new webpack.BannerPlugin({ banner: bundle.banner, raw: true })] : []), ], diff --git a/packages/kbn-react-field/src/field_icon/field_icon.tsx b/packages/kbn-react-field/src/field_icon/field_icon.tsx index 784f8913b56936..561ef6515bc488 100644 --- a/packages/kbn-react-field/src/field_icon/field_icon.tsx +++ b/packages/kbn-react-field/src/field_icon/field_icon.tsx @@ -33,6 +33,7 @@ export interface FieldIconProps extends Omit { | 'point' | 'shape' | 'sparse_vector' + | 'semantic_text' | 'string' | string | 'nested' diff --git a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap index da48c7e846733b..e29361b08a9c12 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap +++ b/packages/kbn-search-connectors/components/sync_jobs/__snapshots__/documents_panel.test.tsx.snap @@ -9,15 +9,11 @@ exports[`DocumentsPanel renders 1`] = ` Array [ Object { "field": "added", - "name": "Added", + "name": "Upserted", }, Object { "field": "removed", - "name": "Removed", - }, - Object { - "field": "total", - "name": "Total", + "name": "Deleted", }, Object { "field": "volume", diff --git a/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx b/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx index 92189ece90da9e..0bfe917d3aa01c 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/documents_panel.tsx @@ -17,7 +17,6 @@ import { FlyoutPanel } from './flyout_panel'; interface SyncJobDocumentsPanelProps { added: number; removed: number; - total: number; volume: number; } @@ -26,19 +25,13 @@ export const SyncJobDocumentsPanel: React.FC = (sync { field: 'added', name: i18n.translate('searchConnectors.index.syncJobs.documents.added', { - defaultMessage: 'Added', + defaultMessage: 'Upserted', }), }, { field: 'removed', name: i18n.translate('searchConnectors.index.syncJobs.documents.removed', { - defaultMessage: 'Removed', - }), - }, - { - field: 'total', - name: i18n.translate('searchConnectors.index.syncJobs.documents.total', { - defaultMessage: 'Total', + defaultMessage: 'Deleted', }), }, { diff --git a/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx b/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx index 07d635adf5ec30..30101b55ec81f7 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/sync_job_flyout.tsx @@ -76,7 +76,6 @@ export const SyncJobFlyout: React.FC = ({ onClose, syncJob } diff --git a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx index e55c286f7b58b9..7426d7dad3dec8 100644 --- a/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx +++ b/packages/kbn-search-connectors/components/sync_jobs/sync_jobs_table.tsx @@ -63,7 +63,7 @@ export const SyncJobsTable: React.FC = ({ { field: 'indexed_document_count', name: i18n.translate('searchConnectors.searchIndices.addedDocs.columnTitle', { - defaultMessage: 'Docs added', + defaultMessage: 'Docs upserted', }), sortable: true, truncateText: true, diff --git a/packages/kbn-user-profile-components/src/services.tsx b/packages/kbn-user-profile-components/src/services.tsx index 0e08ca911eb61b..683b9ac0ce01e2 100644 --- a/packages/kbn-user-profile-components/src/services.tsx +++ b/packages/kbn-user-profile-components/src/services.tsx @@ -7,10 +7,11 @@ */ import React, { FC, useContext } from 'react'; -import type { Observable } from 'rxjs'; + +import type { I18nStart } from '@kbn/core-i18n-browser'; import type { NotificationsStart, ToastOptions } from '@kbn/core-notifications-browser'; -import type { MountPoint } from '@kbn/core-mount-utils-browser'; import type { ThemeServiceStart } from '@kbn/core-theme-browser'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import type { UserProfileAPIClient } from './types'; @@ -41,6 +42,7 @@ export interface UserProfilesKibanaDependencies { core: { notifications: NotificationsStart; theme: ThemeServiceStart; + i18n: I18nStart; }; security: { userProfiles: UserProfileAPIClient; @@ -52,10 +54,7 @@ export interface UserProfilesKibanaDependencies { * import { toMountPoint } from '@kbn/kibana-react-plugin/public'; * ``` */ - toMountPoint: ( - node: React.ReactNode, - options?: { theme$: Observable<{ readonly darkMode: boolean }> } - ) => MountPoint; + toMountPoint: typeof toMountPoint; } /** @@ -66,9 +65,9 @@ export const UserProfilesKibanaProvider: FC = ({ ...services }) => { const { - core: { notifications, theme }, + core: { notifications, i18n, theme }, security: { userProfiles: userProfileApiClient }, - toMountPoint, + toMountPoint: toMountPointUtility, } = services; return ( @@ -82,7 +81,7 @@ export const UserProfilesKibanaProvider: FC = ({ notifications.toasts.addSuccess( { title, - text: text ? toMountPoint(text, { theme$: theme.theme$ }) : undefined, + text: text ? toMountPointUtility(text, { i18n, theme }) : undefined, }, toastOptions ); diff --git a/packages/kbn-user-profile-components/tsconfig.json b/packages/kbn-user-profile-components/tsconfig.json index a602ca242d7337..a10ea2923ff4fb 100644 --- a/packages/kbn-user-profile-components/tsconfig.json +++ b/packages/kbn-user-profile-components/tsconfig.json @@ -17,7 +17,8 @@ "@kbn/core-notifications-browser", "@kbn/core", "@kbn/core-theme-browser", - "@kbn/core-mount-utils-browser", + "@kbn/react-kibana-mount", + "@kbn/core-i18n-browser", ], "exclude": [ "target/**/*", diff --git a/packages/presentation/presentation_publishing/index.ts b/packages/presentation/presentation_publishing/index.ts index 2b0b3b1af7d7aa..1b1a96f97ba0df 100644 --- a/packages/presentation/presentation_publishing/index.ts +++ b/packages/presentation/presentation_publishing/index.ts @@ -74,8 +74,12 @@ export { type PublishesTimeRange, type PublishesUnifiedSearch, type PublishesWritableUnifiedSearch, -} from './interfaces/unified_search/publishes_unified_search'; -export { initializeTimeRange } from './interfaces/unified_search/initialize_time_range'; +} from './interfaces/fetch/publishes_unified_search'; +export { initializeTimeRange } from './interfaces/fetch/initialize_time_range'; +export { + type FetchContext, + onFetchContextChanged, +} from './interfaces/fetch/on_fetch_context_changed'; export { apiPublishesSavedObjectId, type PublishesSavedObjectId, diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/initialize_time_range.ts b/packages/presentation/presentation_publishing/interfaces/fetch/initialize_time_range.ts new file mode 100644 index 00000000000000..d2b3c2e52d3c78 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/fetch/initialize_time_range.ts @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { BehaviorSubject } from 'rxjs'; +import fastIsEqual from 'fast-deep-equal'; +import { TimeRange } from '@kbn/es-query'; +import { StateComparators } from '../../comparators'; +import { PublishesWritableTimeRange } from './publishes_unified_search'; + +export interface SerializedTimeRange { + timeRange: TimeRange | undefined; +} + +export const initializeTimeRange = ( + rawState: SerializedTimeRange +): { + serialize: () => SerializedTimeRange; + api: PublishesWritableTimeRange; + comparators: StateComparators; +} => { + const timeRange$ = new BehaviorSubject(rawState.timeRange); + function setTimeRange(nextTimeRange: TimeRange | undefined) { + timeRange$.next(nextTimeRange); + } + + return { + serialize: () => ({ + timeRange: timeRange$.value, + }), + comparators: { + timeRange: [timeRange$, setTimeRange, fastIsEqual], + } as StateComparators, + api: { + timeRange$, + setTimeRange, + }, + }; +}; diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.test.ts b/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.test.ts new file mode 100644 index 00000000000000..e87e86c8ee8ef8 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.test.ts @@ -0,0 +1,309 @@ +/* + * Copyright 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 { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; +import { BehaviorSubject, Subject } from 'rxjs'; +import { FetchContext, onFetchContextChanged } from './on_fetch_context_changed'; + +describe('onFetchContextChanged', () => { + const onFetchMock = jest.fn(); + const parentApi = { + filters$: new BehaviorSubject(undefined), + query$: new BehaviorSubject(undefined), + reload$: new Subject(), + searchSessionId$: new BehaviorSubject(undefined), + timeRange$: new BehaviorSubject(undefined), + timeslice$: new BehaviorSubject<[number, number] | undefined>(undefined), + }; + + beforeEach(() => { + onFetchMock.mockReset(); + parentApi.filters$.next(undefined); + parentApi.query$.next(undefined); + parentApi.searchSessionId$.next(undefined); + parentApi.timeRange$.next(undefined); + parentApi.timeslice$.next(undefined); + }); + + it('isCanceled should be true when onFetch triggered before previous onFetch finishes', async () => { + const FETCH_TIMEOUT = 10; + let calledCount = 0; + let completedCallCount = 0; + let completedContext: FetchContext | undefined; + const onFetchInstrumented = async (context: FetchContext, isCanceled: () => boolean) => { + calledCount++; + await new Promise((resolve) => setTimeout(resolve, FETCH_TIMEOUT)); + if (isCanceled()) { + return; + } + completedCallCount++; + completedContext = context; + }; + const unsubscribe = onFetchContextChanged({ + api: { parentApi }, + onFetch: onFetchInstrumented, + fetchOnSetup: false, + }); + + parentApi.timeRange$.next({ + from: 'now-25h', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(calledCount).toBe(1); + + parentApi.timeRange$.next({ + from: 'now-26h', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(calledCount).toBe(2); + + await new Promise((resolve) => setTimeout(resolve, FETCH_TIMEOUT)); + + expect(completedCallCount).toBe(1); + expect(completedContext?.timeRange).toEqual({ + from: 'now-26h', + to: 'now', + }); + + unsubscribe(); + }); + + describe('searchSessionId', () => { + let i = 0; + function setSearchSession() { + i++; + parentApi.searchSessionId$.next(`${i}`); + } + beforeEach(() => { + i = 0; + setSearchSession(); + }); + + it('should call onFetch a single time when fetch context changes', async () => { + const unsubscribe = onFetchContextChanged({ + api: { parentApi }, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + parentApi.filters$.next([]); + parentApi.query$.next({ language: 'kquery', query: '' }); + parentApi.timeRange$.next({ + from: 'now-24h', + to: 'now', + }); + parentApi.timeslice$.next([0, 1]); + setSearchSession(); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext).toEqual({ + filters: [], + isReload: true, + query: { + language: 'kquery', + query: '', + }, + searchSessionId: '2', + timeRange: { + from: 'now-24h', + to: 'now', + }, + timeslice: [0, 1], + }); + unsubscribe(); + }); + + it('should call onFetch a single time with reload', async () => { + const unsubscribe = onFetchContextChanged({ + api: { parentApi }, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + parentApi.reload$.next(); + setSearchSession(); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + unsubscribe(); + }); + + it('should call onFetch on local time range change and no search session change', async () => { + const api = { + parentApi, + timeRange$: new BehaviorSubject(undefined), + }; + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + api.timeRange$.next({ + from: 'now-15m', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-15m', + to: 'now', + }); + unsubscribe(); + }); + }); + + describe('no searchSession$', () => { + it('should call onFetch when reload triggered', async () => { + const unsubscribe = onFetchContextChanged({ + api: { parentApi }, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + parentApi.reload$.next(); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.isReload).toBe(true); + unsubscribe(); + }); + + describe('local and parent time range', () => { + const api = { + parentApi, + timeRange$: new BehaviorSubject(undefined), + }; + beforeEach(() => { + api.timeRange$.next({ + from: 'now-15m', + to: 'now', + }); + api.parentApi.timeRange$.next({ + from: 'now-24h', + to: 'now', + }); + }); + + it('should call onFetch with local time range', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: true, + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-15m', + to: 'now', + }); + unsubscribe(); + }); + + it('should call onFetch when local time range changes', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + api.timeRange$.next({ + from: 'now-16m', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-16m', + to: 'now', + }); + unsubscribe(); + }); + + it('should not call onFetch when parent time range changes', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + api.parentApi.timeRange$.next({ + from: 'now-25h', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(0); + unsubscribe(); + }); + + it('should call onFetch with parent time range when local time range is cleared', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + api.timeRange$.next(undefined); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-24h', + to: 'now', + }); + unsubscribe(); + }); + }); + + describe('only parent time range', () => { + const api = { + parentApi, + }; + beforeEach(() => { + api.parentApi.timeRange$.next({ + from: 'now-24h', + to: 'now', + }); + }); + + it('should call onFetch with parent time range', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: true, + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-24h', + to: 'now', + }); + unsubscribe(); + }); + + it('should call onFetch when parent time range changes', async () => { + const unsubscribe = onFetchContextChanged({ + api, + onFetch: onFetchMock, + fetchOnSetup: false, + }); + api.parentApi.timeRange$.next({ + from: 'now-25h', + to: 'now', + }); + await new Promise((resolve) => setTimeout(resolve, 1)); + expect(onFetchMock.mock.calls).toHaveLength(1); + const fetchContext = onFetchMock.mock.calls[0][0]; + expect(fetchContext.timeRange).toEqual({ + from: 'now-25h', + to: 'now', + }); + unsubscribe(); + }); + }); + }); +}); diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts b/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts new file mode 100644 index 00000000000000..6c368020d235a5 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/fetch/on_fetch_context_changed.ts @@ -0,0 +1,135 @@ +/* + * Copyright 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 { debounce } from 'lodash'; +import { combineLatest, Observable, skip, Subscription } from 'rxjs'; +import { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; +import { + apiPublishesTimeRange, + apiPublishesUnifiedSearch, + PublishesTimeRange, + PublishesUnifiedSearch, +} from './publishes_unified_search'; +import { apiPublishesSearchSession, PublishesSearchSession } from './publishes_search_session'; +import { apiHasParentApi, HasParentApi } from '../has_parent_api'; +import { apiPublishesReload } from './publishes_reload'; + +export interface FetchContext { + isReload: boolean; + filters: Filter[] | undefined; + query: Query | AggregateQuery | undefined; + searchSessionId: string | undefined; + timeRange: TimeRange | undefined; + timeslice: [number, number] | undefined; +} + +function getFetchContext(api: unknown, isReload: boolean) { + const typeApi = api as Partial< + PublishesTimeRange & HasParentApi> + >; + return { + isReload, + filters: typeApi?.parentApi?.filters$?.value, + query: typeApi?.parentApi?.query$?.value, + searchSessionId: typeApi?.parentApi?.searchSessionId$?.value, + timeRange: typeApi?.timeRange$?.value ?? typeApi?.parentApi?.timeRange$?.value, + timeslice: typeApi?.timeRange$?.value ? undefined : typeApi?.parentApi?.timeslice$?.value, + }; +} + +export function onFetchContextChanged({ + api, + onFetch, + fetchOnSetup, +}: { + api: unknown; + onFetch: (fetchContext: FetchContext, isCanceled: () => boolean) => void; + fetchOnSetup: boolean; +}): () => void { + let fetchSymbol: symbol | undefined; + const debouncedFetch = debounce(fetch, 0); + function fetch(isReload: boolean = false) { + const currentFetchSymbol = Symbol(); + fetchSymbol = currentFetchSymbol; + onFetch(getFetchContext(api, isReload), () => fetchSymbol !== currentFetchSymbol); + } + + const subscriptions: Subscription[] = []; + + if (apiPublishesTimeRange(api)) { + subscriptions.push( + api.timeRange$.pipe(skip(1)).subscribe(() => { + debouncedFetch(); + }) + ); + } + + if (apiHasParentApi(api) && apiPublishesSearchSession(api.parentApi)) { + subscriptions.push( + api.parentApi?.searchSessionId$.pipe(skip(1)).subscribe(() => { + debouncedFetch.cancel(); + fetch(true); + }) + ); + } + + if (apiHasParentApi(api) && apiPublishesUnifiedSearch(api.parentApi)) { + subscriptions.push( + combineLatest([api.parentApi.filters$, api.parentApi.query$]) + .pipe(skip(1)) + .subscribe(() => { + // Ignore change when searchSessionId is provided. + if ((api?.parentApi as Partial)?.searchSessionId$?.value) { + return; + } + debouncedFetch(); + }) + ); + + if (apiHasParentApi(api) && apiPublishesTimeRange(api.parentApi)) { + const timeObservables: Array> = [api.parentApi.timeRange$]; + if (api.parentApi.timeslice$) { + timeObservables.push(api.parentApi.timeslice$); + } + subscriptions.push( + combineLatest(timeObservables) + .pipe(skip(1)) + .subscribe(() => { + // Ignore changes when searchSessionId is provided or local time range is provided. + if ( + (api?.parentApi as Partial)?.searchSessionId$?.value || + (api as Partial).timeRange$?.value + ) { + return; + } + debouncedFetch(); + }) + ); + } + if (apiHasParentApi(api) && apiPublishesReload(api.parentApi)) { + subscriptions.push( + api.parentApi.reload$.subscribe(() => { + // Ignore changes when searchSessionId is provided + if ((api?.parentApi as Partial)?.searchSessionId$?.value) { + return; + } + debouncedFetch.cancel(); + fetch(true); + }) + ); + } + } + + if (fetchOnSetup) { + debouncedFetch(); + } + + return () => { + subscriptions.forEach((subcription) => subcription.unsubscribe()); + }; +} diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts new file mode 100644 index 00000000000000..b73beb5bc07979 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_reload.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { PublishingSubject } from '../../publishing_subject'; + +export interface PublishesReload { + reload$: PublishingSubject; +} + +export const apiPublishesReload = (unknownApi: null | unknown): unknownApi is PublishesReload => { + return Boolean(unknownApi && (unknownApi as PublishesReload)?.reload$ !== undefined); +}; diff --git a/packages/presentation/presentation_publishing/interfaces/fetch/publishes_search_session.ts b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_search_session.ts new file mode 100644 index 00000000000000..ec54ac7271fb57 --- /dev/null +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_search_session.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { PublishingSubject } from '../../publishing_subject'; + +export interface PublishesSearchSession { + searchSessionId$: PublishingSubject; +} + +export const apiPublishesSearchSession = ( + unknownApi: null | unknown +): unknownApi is PublishesSearchSession => { + return Boolean( + unknownApi && (unknownApi as PublishesSearchSession)?.searchSessionId$ !== undefined + ); +}; diff --git a/packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts similarity index 97% rename from packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts rename to packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts index 4f344a71aaf4d0..ff3175f7c9c760 100644 --- a/packages/presentation/presentation_publishing/interfaces/unified_search/publishes_unified_search.ts +++ b/packages/presentation/presentation_publishing/interfaces/fetch/publishes_unified_search.ts @@ -11,6 +11,7 @@ import { PublishingSubject } from '../../publishing_subject'; export interface PublishesTimeRange { timeRange$: PublishingSubject; + timeslice$?: PublishingSubject<[number, number] | undefined>; } export type PublishesWritableTimeRange = PublishesTimeRange & { diff --git a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts deleted file mode 100644 index 2e1136f1fa2bce..00000000000000 --- a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.test.ts +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { TimeRange } from '@kbn/es-query'; -import { BehaviorSubject, skip } from 'rxjs'; -import { initializeTimeRange } from './initialize_time_range'; - -describe('initialize time range', () => { - describe('appliedTimeRange$', () => { - let timeRange: TimeRange | undefined; - const parentApi = { - timeRange$: new BehaviorSubject(undefined), - }; - - describe('local and parent time range', () => { - beforeEach(() => { - timeRange = { - from: 'now-15m', - to: 'now', - }; - parentApi.timeRange$.next({ - from: 'now-24h', - to: 'now', - }); - }); - - it('should return local time range', () => { - const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-15m', - to: 'now', - }); - }); - - it('should emit when local time range changes', async () => { - let emitCount = 0; - const { appliedTimeRange$, timeRangeApi } = initializeTimeRange({ timeRange }, parentApi); - - const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { - emitCount++; - }); - - timeRangeApi.setTimeRange({ - from: 'now-16m', - to: 'now', - }); - await new Promise(process.nextTick); - - expect(emitCount).toBe(1); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-16m', - to: 'now', - }); - - subscribe.unsubscribe(); - }); - - it('should not emit when parent time range changes', async () => { - let emitCount = 0; - const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); - - const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { - emitCount++; - }); - - parentApi.timeRange$.next({ - from: 'now-25h', - to: 'now', - }); - await new Promise(process.nextTick); - - expect(emitCount).toBe(0); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-15m', - to: 'now', - }); - - subscribe.unsubscribe(); - }); - - it('should emit parent time range when local time range is cleared', async () => { - let emitCount = 0; - const { appliedTimeRange$, timeRangeApi } = initializeTimeRange({ timeRange }, parentApi); - - const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { - emitCount++; - }); - - timeRangeApi.setTimeRange(undefined); - await new Promise(process.nextTick); - - expect(emitCount).toBe(1); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-24h', - to: 'now', - }); - - subscribe.unsubscribe(); - }); - }); - - describe('only parent time range', () => { - beforeEach(() => { - timeRange = undefined; - parentApi.timeRange$.next({ - from: 'now-24h', - to: 'now', - }); - }); - - it('should return parent time range', () => { - const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-24h', - to: 'now', - }); - }); - - it('should emit when parent time range changes', async () => { - let emitCount = 0; - const { appliedTimeRange$ } = initializeTimeRange({ timeRange }, parentApi); - - const subscribe = appliedTimeRange$.pipe(skip(1)).subscribe(() => { - emitCount++; - }); - - parentApi.timeRange$.next({ - from: 'now-25h', - to: 'now', - }); - await new Promise(process.nextTick); - - expect(emitCount).toBe(1); - expect(appliedTimeRange$.value).toEqual({ - from: 'now-25h', - to: 'now', - }); - - subscribe.unsubscribe(); - }); - }); - }); -}); diff --git a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts b/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.ts deleted file mode 100644 index 8ff5314d046a1f..00000000000000 --- a/packages/presentation/presentation_publishing/interfaces/unified_search/initialize_time_range.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 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 fastIsEqual from 'fast-deep-equal'; -import { TimeRange } from '@kbn/es-query'; -import { PublishingSubject } from '../../publishing_subject'; -import { StateComparators } from '../../comparators'; -import { - apiPublishesTimeRange, - PublishesTimeRange, - PublishesWritableTimeRange, -} from './publishes_unified_search'; - -export interface SerializedTimeRange { - timeRange: TimeRange | undefined; -} - -export const initializeTimeRange = ( - rawState: SerializedTimeRange, - parentApi?: unknown -): { - appliedTimeRange$: PublishingSubject; - cleanupTimeRange: () => void; - serializeTimeRange: () => SerializedTimeRange; - timeRangeApi: PublishesWritableTimeRange; - timeRangeComparators: StateComparators; -} => { - const timeRange$ = new BehaviorSubject(rawState.timeRange); - function setTimeRange(nextTimeRange: TimeRange | undefined) { - timeRange$.next(nextTimeRange); - } - const appliedTimeRange$ = new BehaviorSubject( - timeRange$.value ?? (parentApi as Partial)?.timeRange$?.value - ); - - const subscriptions = timeRange$.subscribe((timeRange) => { - appliedTimeRange$.next( - timeRange ?? (parentApi as Partial)?.timeRange$?.value - ); - }); - if (apiPublishesTimeRange(parentApi)) { - subscriptions.add( - parentApi?.timeRange$.subscribe((parentTimeRange) => { - if (timeRange$?.value) { - return; - } - appliedTimeRange$.next(parentTimeRange); - }) - ); - } - - return { - appliedTimeRange$, - cleanupTimeRange: () => { - subscriptions.unsubscribe(); - }, - serializeTimeRange: () => ({ - timeRange: timeRange$.value, - }), - timeRangeComparators: { - timeRange: [timeRange$, setTimeRange, fastIsEqual], - } as StateComparators, - timeRangeApi: { - timeRange$, - setTimeRange, - }, - }; -}; diff --git a/packages/shared-ux/modal/tabbed/README.mdx b/packages/shared-ux/modal/tabbed/README.mdx new file mode 100644 index 00000000000000..5c0d3e1f2d4046 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/README.mdx @@ -0,0 +1,19 @@ +--- +id: sharedUX/Page/TabbedModal +slug: /shared-ux/modal/tabbed +title: Kibana Tabbed Modal +description: A component for rendering tabs within a modal. +tags: ['shared-ux', 'component'] +date: 2024-04-28 +--- + +## API + +| Export | Description | +|---|---| | +| `TabbedModal` | component that renders tab content within a modal in kibana. +| `IModalTabDeclaration` | type definition for defining the content of a modal tab, also provides support to make the tab content controlled and have it's state if needed be managed by the modal. + +## EUI Promotion Status + +This component is not currently considered for promotion to EUI. diff --git a/packages/shared-ux/modal/tabbed/index.tsx b/packages/shared-ux/modal/tabbed/index.tsx new file mode 100644 index 00000000000000..69a84895d6fdaf --- /dev/null +++ b/packages/shared-ux/modal/tabbed/index.tsx @@ -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 { TabbedModal, type IModalTabDeclaration } from './src/tabbed_modal'; diff --git a/packages/shared-ux/modal/tabbed/jest.config.js b/packages/shared-ux/modal/tabbed/jest.config.js new file mode 100644 index 00000000000000..667506ad4aea77 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/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/shared-ux/modal/tabbed'], +}; diff --git a/packages/shared-ux/modal/tabbed/kibana.jsonc b/packages/shared-ux/modal/tabbed/kibana.jsonc new file mode 100644 index 00000000000000..4abd1fe7543edc --- /dev/null +++ b/packages/shared-ux/modal/tabbed/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/shared-ux-tabbed-modal", + "owner": "@elastic/appex-sharedux" + } \ No newline at end of file diff --git a/packages/shared-ux/modal/tabbed/package.json b/packages/shared-ux/modal/tabbed/package.json new file mode 100644 index 00000000000000..987db5ef12407f --- /dev/null +++ b/packages/shared-ux/modal/tabbed/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/shared-ux-tabbed-modal", + "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/shared-ux/modal/tabbed/src/context/index.test.tsx b/packages/shared-ux/modal/tabbed/src/context/index.test.tsx new file mode 100644 index 00000000000000..8b32327a60c574 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/src/context/index.test.tsx @@ -0,0 +1,110 @@ +/* + * Copyright 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, { type ComponentProps, type ComponentType } from 'react'; +import { renderHook, act } from '@testing-library/react-hooks'; +import { useModalContext, ModalContextProvider } from '.'; + +type ModalContextProviderProps = ComponentProps; + +function createModalContextWrapper(props: ModalContextProviderProps) { + return function CreatedWrapper({ children }: any) { + return {children}; + }; +} + +describe('tabbed modal provider', () => { + it('creates a default internal state of specific shape', () => { + const props: ModalContextProviderProps = { + tabs: [ + { + id: 'test', + name: 'Test', + }, + ], + defaultSelectedTabId: 'test', + }; + + const { result } = renderHook(useModalContext, { + wrapper: createModalContextWrapper(props), + }); + + expect(result.current).toHaveProperty( + 'tabs', + ([] as ModalContextProviderProps['tabs'])?.concat(props.tabs).map((tab) => { + if (tab.initialState) { + delete tab.initialState; + } + + return tab; + }) + ); + + expect(result.current).toHaveProperty( + 'state', + expect.objectContaining({ + meta: expect.objectContaining({ selectedTabId: props.defaultSelectedTabId }), + test: {}, + }) + ); + + expect(result.current).toHaveProperty('dispatch', expect.any(Function)); + }); + + it('invocating the context dispatch function causes state changes for the selected tab state', () => { + const SUT_DISPATCH_ACTION = { + type: 'TEST_ACTION', + payload: 'state_update', + }; + + const props: ModalContextProviderProps = { + tabs: [ + { + id: 'test', + name: 'Test', + reducer: (state = {}, action) => { + switch (action.type) { + case SUT_DISPATCH_ACTION.type: + return { + ...state, + sut: action.payload, + }; + default: + return state; + } + }, + }, + ], + defaultSelectedTabId: 'test', + }; + + const { result } = renderHook(useModalContext, { + wrapper: createModalContextWrapper(props), + }); + + expect(result.current).toHaveProperty( + 'state', + expect.objectContaining({ + test: {}, + }) + ); + + act(() => { + result.current.dispatch(SUT_DISPATCH_ACTION); + }); + + expect(result.current).toHaveProperty( + 'state', + expect.objectContaining({ + test: { + sut: SUT_DISPATCH_ACTION.payload, + }, + }) + ); + }); +}); diff --git a/packages/shared-ux/modal/tabbed/src/context/index.tsx b/packages/shared-ux/modal/tabbed/src/context/index.tsx new file mode 100644 index 00000000000000..edb80300874bb3 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/src/context/index.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, { + createContext, + useContext, + useReducer, + useMemo, + useRef, + useCallback, + type PropsWithChildren, + type Dispatch, +} from 'react'; +import { once } from 'lodash'; + +interface IDispatchAction { + type: string; + payload: any; +} + +export type IDispatchFunction = Dispatch; + +export interface IMetaState { + selectedTabId: string | null; +} + +type IReducer = (state: S, action: IDispatchAction) => S; + +export interface ITabDeclaration { + id: string; + name: string; + initialState?: Partial; + reducer?: IReducer; +} + +interface IModalContext>>> { + tabs: Array>; + state: { + meta: IMetaState; + [index: string]: any; + }; + dispatch: Dispatch; +} + +const createStateContext = once(>>>() => + createContext({ + tabs: [], + state: { + meta: { + selectedTabId: null, + }, + }, + dispatch: () => {}, + } as IModalContext) +); + +export const useModalContext = >>>() => + useContext(createStateContext()); + +/** + * @description defines state transition for meta information to manage the modal, meta action types + * must be prefixed with the string 'META_' + */ +const modalMetaReducer: IReducer = (state, action) => { + switch (action.type) { + case 'META_selectedTabId': + return { + ...state, + selectedTabId: action.payload as string, + }; + default: + return state; + } +}; + +export type IModalContextProviderProps>>> = + PropsWithChildren<{ + /** + * Array of tab declaration to be rendered into the modal that will be rendered + */ + tabs: Tabs; + /** + * ID of the tab we'd like the modal to have selected on render + */ + defaultSelectedTabId: Tabs[number]['id']; + }>; + +export function ModalContextProvider>>>({ + tabs, + defaultSelectedTabId, + children, +}: IModalContextProviderProps) { + const ModalContext = createStateContext(); + + type IModalInstanceContext = IModalContext; + + const modalTabDefinitions = useRef([]); + + const initialModalState = useRef({ + // instantiate state with default meta information + meta: { + selectedTabId: defaultSelectedTabId, + }, + }); + + const reducersMap = useMemo( + () => + tabs?.reduce((result, { reducer, initialState, ...rest }) => { + initialModalState.current[rest.id] = initialState ?? {}; + // @ts-ignore + modalTabDefinitions.current.push({ ...rest }); + result[rest.id] = reducer; + return result; + }, {} as Record), + [tabs] + ); + + const combineReducers = useCallback(function (reducers: Record) { + return (state: IModalInstanceContext['state'], action: IDispatchAction) => { + const newState = { ...state }; + + if (/^meta_/i.test(action.type)) { + newState.meta = modalMetaReducer(newState.meta, action); + } else { + const selectedTabId = state.meta.selectedTabId!; + const selectedTabReducer = reducers[selectedTabId]; + + if (selectedTabReducer) { + newState[selectedTabId] = selectedTabReducer(newState[selectedTabId], action); + } + } + + return newState; + }; + }, []); + + const createInitialState = useCallback((state: IModalInstanceContext['state']) => { + return state; + }, []); + + const [state, dispatch] = useReducer( + combineReducers(reducersMap), + initialModalState.current, + createInitialState + ); + + return ( + + {children} + + ); +} diff --git a/packages/shared-ux/modal/tabbed/src/tabbed_modal.stories.tsx b/packages/shared-ux/modal/tabbed/src/tabbed_modal.stories.tsx new file mode 100644 index 00000000000000..7b714a7c10ecd3 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/src/tabbed_modal.stories.tsx @@ -0,0 +1,178 @@ +/* + * Copyright 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, { Fragment } from 'react'; +import { EuiText, EuiCheckboxGroup, EuiSpacer, useGeneratedHtmlId } from '@elastic/eui'; + +import { + StorybookMock as TabbedModalStorybookMock, + type Params as TabbedModalStorybookParams, +} from '../storybook/setup'; + +import { TabbedModal, type IModalTabDeclaration } from './tabbed_modal'; + +export default { + title: 'Modal/Tabbed Modal', + description: 'A controlled modal component that renders tabs', +}; + +const mock = new TabbedModalStorybookMock(); +const argTypes = mock.getArgumentTypes(); + +export const TrivialExample = (params: TabbedModalStorybookParams) => { + return ( + { + return ( + + + +

Click the button to send a message into the void

+
+
+ ); + }, + initialState: { + message: 'Hello World!!', + }, + modalActionBtn: { + id: 'wave', + label: 'Say Hi 👋🏾', + dataTestSubj: 'wave', + handler: ({ state }) => { + alert(state.message); + }, + }, + }, + ]} + defaultSelectedTabId="hello" + onClose={() => {}} + /> + ); +}; + +TrivialExample.argTypes = argTypes; + +export const NonTrivialExample = (params: TabbedModalStorybookParams) => { + const checkboxGroupItemId1 = useGeneratedHtmlId({ + prefix: 'checkboxGroupItem', + suffix: 'first', + }); + const checkboxGroupItemId2 = useGeneratedHtmlId({ + prefix: 'checkboxGroupItem', + suffix: 'second', + }); + const checkboxGroupItemId3 = useGeneratedHtmlId({ + prefix: 'checkboxGroupItem', + suffix: 'third', + }); + + const checkboxes = [ + { + id: checkboxGroupItemId1, + label: 'Margherita', + 'data-test-sub': 'dts_test', + }, + { + id: checkboxGroupItemId2, + label: 'Diavola', + className: 'classNameTest', + }, + { + id: checkboxGroupItemId3, + label: 'Hawaiian Pizza', + disabled: true, + }, + ]; + + enum ACTION_TYPES { + SelectOption, + } + + interface IPizzaSelectorTabState { + checkboxIdToSelectedMap: Record; + } + + const pizzaSelector: IModalTabDeclaration = { + id: 'order', + name: 'order', + initialState: { + checkboxIdToSelectedMap: { + [checkboxGroupItemId2]: true, + }, + }, + reducer(state, action) { + switch (action.type) { + case String(ACTION_TYPES.SelectOption): + return { + ...state, + checkboxIdToSelectedMap: action.payload, + }; + default: + return state; + } + }, + content: ({ state, dispatch }) => { + const { checkboxIdToSelectedMap } = state; + + const onChange = (optionId: string) => { + const newCheckboxIdToSelectedMap = { + ...checkboxIdToSelectedMap, + ...{ + [optionId]: !checkboxIdToSelectedMap[optionId], + }, + }; + + dispatch({ + type: String(ACTION_TYPES.SelectOption), + payload: newCheckboxIdToSelectedMap, + }); + }; + + return ( + + + +

Select a Pizza (or more)

+
+ + onChange(id)} + /> +
+ ); + }, + modalActionBtn: { + id: 'pizza', + dataTestSubj: 'order-pizza', + label: 'Order 🍕', + handler: ({ state }) => { + alert(JSON.stringify(state)); + }, + }, + }; + + return ( + {}} + modalTitle="Non trivial example" + tabs={[pizzaSelector]} + defaultSelectedTabId="order" + /> + ); +}; + +NonTrivialExample.argTypes = argTypes; diff --git a/packages/shared-ux/modal/tabbed/src/tabbed_modal.test.tsx b/packages/shared-ux/modal/tabbed/src/tabbed_modal.test.tsx new file mode 100644 index 00000000000000..714053bad53183 --- /dev/null +++ b/packages/shared-ux/modal/tabbed/src/tabbed_modal.test.tsx @@ -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 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 userEvent from '@testing-library/user-event'; +import { render, screen } from '@testing-library/react'; +import { EuiFieldText } from '@elastic/eui'; +import { TabbedModal, type IModalTabDeclaration } from './tabbed_modal'; + +describe('TabbedModal', () => { + const modalOnCloseHandler = jest.fn(); + + describe('modal configuration', () => { + const mockedHandlerFn = jest.fn(); + + const tabDefinition: IModalTabDeclaration<{ + inputText: string; + }> = { + id: 'logUserInput', + name: 'log user input', + reducer(state = { inputText: '' }, action) { + switch (action.type) { + case 'UPDATE_TEXT_VALUE': + return { + ...state, + inputText: action.payload, + }; + default: + return state; + } + }, + content: ({ state, dispatch }) => { + const onChange = (e: { target: { value: any } }) => { + dispatch({ type: 'UPDATE_TEXT_VALUE', payload: e.target.value }); + }; + + return ( + + ); + }, + modalActionBtn: { + id: 'logUserMessage', + dataTestSubj: 'log-user-message', + label: 'log user message', + handler: mockedHandlerFn, + }, + }; + + it('renders the modal component', async () => { + render( + + ); + + expect(screen.queryByText(tabDefinition.name)).toBeInTheDocument(); + + userEvent.click(await screen.findByTestId(tabDefinition.modalActionBtn.dataTestSubj)); + + expect(mockedHandlerFn).toHaveBeenCalled(); + }); + }); +}); diff --git a/packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx b/packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx new file mode 100644 index 00000000000000..a78e1499268c6c --- /dev/null +++ b/packages/shared-ux/modal/tabbed/src/tabbed_modal.tsx @@ -0,0 +1,146 @@ +/* + * Copyright 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, + Fragment, + type ComponentProps, + type FC, + type ReactElement, +} from 'react'; +import { + EuiButton, + EuiModal, + EuiModalBody, + EuiModalFooter, + EuiModalHeader, + EuiModalHeaderTitle, + EuiTabs, + EuiTab, + type EuiTabProps, + type CommonProps, +} from '@elastic/eui'; +import { + ModalContextProvider, + useModalContext, + type ITabDeclaration, + type IDispatchFunction, + type IModalContextProviderProps, +} from './context'; + +export type IModalTabContent = (props: { + state: S; + dispatch: IDispatchFunction; +}) => ReactElement; + +interface IModalTabActionBtn extends CommonProps { + id: string; + dataTestSubj: string; + label: string; + handler: (args: { state: S }) => void; + isCopy?: boolean; + style?: (args: { state: S }) => boolean; +} + +export interface IModalTabDeclaration extends EuiTabProps, ITabDeclaration { + description?: string; + 'data-test-subj'?: string; + content: IModalTabContent; + modalActionBtn: IModalTabActionBtn; +} + +export interface ITabbedModalInner extends Pick, 'onClose'> { + modalWidth?: number; + modalTitle?: string; +} + +const TabbedModalInner: FC = ({ onClose, modalTitle, modalWidth }) => { + const { tabs, state, dispatch } = + useModalContext>>>(); + + const selectedTabId = state.meta.selectedTabId; + const selectedTabState = useMemo( + () => (selectedTabId ? state[selectedTabId] : {}), + [selectedTabId, state] + ); + + const { + content: SelectedTabContent, + modalActionBtn: { handler, dataTestSubj, label, style }, + } = useMemo(() => { + return tabs.find((obj) => obj.id === selectedTabId)!; + }, [selectedTabId, tabs]); + + const onSelectedTabChanged = (id: string) => { + dispatch({ type: 'META_selectedTabId', payload: id }); + }; + + const renderTabs = () => { + return tabs.map((tab, index) => ( + onSelectedTabChanged(tab.id)} + isSelected={tab.id === selectedTabId} + disabled={tab.disabled} + prepend={tab.prepend} + append={tab.append} + > + {tab.name} + + )); + }; + + const btnClickHandler = useCallback(() => { + handler({ state: selectedTabState }); + }, [handler, selectedTabState]); + + return ( + + + {modalTitle} + + + + {renderTabs()} + {React.createElement(SelectedTabContent, { + state: selectedTabState, + dispatch, + })} + + + + + {label} + + + + ); +}; + +export function TabbedModal>>({ + tabs, + defaultSelectedTabId, + ...rest +}: Omit, 'children'> & ITabbedModalInner) { + return ( + + + + ); +} diff --git a/packages/shared-ux/modal/tabbed/storybook/setup.ts b/packages/shared-ux/modal/tabbed/storybook/setup.ts new file mode 100644 index 00000000000000..58f15a53e322fd --- /dev/null +++ b/packages/shared-ux/modal/tabbed/storybook/setup.ts @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { ComponentProps } from 'react'; +import { AbstractStorybookMock } from '@kbn/shared-ux-storybook-mock'; + +import { TabbedModal } from '..'; + +type TabbedModalProps = ComponentProps; +type TabbedModalServiceArguments = Record; + +type Arguments = TabbedModalProps & TabbedModalServiceArguments; + +/** + * Storybook parameters provided from the controls addon. + */ +export type Params = Record; + +export class StorybookMock extends AbstractStorybookMock< + TabbedModalProps, + TabbedModalServiceArguments, + TabbedModalProps, + TabbedModalServiceArguments +> { + propArguments = { + tabs: { + control: { + type: 'array', + }, + defaultValue: [], + }, + defaultSelectedTabId: { + control: { + type: 'array', + }, + defaultValue: [], + }, + onClose: { + control: { + type: 'array', + }, + defaultValue: [], + }, + }; + + serviceArguments = {}; + + dependencies = []; + + getProps(params?: Params): TabbedModalProps { + return { + tabs: this.getArgumentValue('tabs', params), + onClose: this.getArgumentValue('onClose', params), + defaultSelectedTabId: this.getArgumentValue('defaultSelectedTabId', params), + }; + } + + getServices(params: Params): TabbedModalServiceArguments { + return {}; + } +} diff --git a/packages/shared-ux/modal/tabbed/tsconfig.json b/packages/shared-ux/modal/tabbed/tsconfig.json new file mode 100644 index 00000000000000..ecd52b154a2b4e --- /dev/null +++ b/packages/shared-ux/modal/tabbed/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": ["src/**/*", "storybook/**/*", "index.*"], + "kbn_references": [ + "@kbn/shared-ux-storybook-mock", + ], + "exclude": [ + "target/**/*", + ] +} 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 a234a61983a414..10d6d4d7056d9e 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 @@ -103,7 +103,7 @@ describe('checking migration metadata changes on all registered SO types', () => "guided-onboarding-guide-state": "d338972ed887ac480c09a1a7fbf582d6a3827c91", "guided-onboarding-plugin-state": "bc109e5ef46ca594fdc179eda15f3095ca0a37a4", "index-pattern": "997108a9ea1e8076e22231e1c95517cdb192b9c5", - "infra-custom-dashboards": "b92b6db1c1f8998af6e2951a17b76cf886c6bee5", + "infra-custom-dashboards": "1a5994f2e05bb8a1609825ddbf5012f77c5c67f3", "infrastructure-monitoring-log-view": "5f86709d3c27aed7a8379153b08ee5d3d90d77f5", "infrastructure-ui-source": "113182d6895764378dfe7fa9fa027244f3a457c4", "ingest-agent-policies": "7633e578f60c074f8267bc50ec4763845e431437", diff --git a/src/plugins/console/public/application/containers/editor/editor.tsx b/src/plugins/console/public/application/containers/editor/editor.tsx index bcf21fa57b2eed..510a976d4bdcb4 100644 --- a/src/plugins/console/public/application/containers/editor/editor.tsx +++ b/src/plugins/console/public/application/containers/editor/editor.tsx @@ -16,7 +16,7 @@ import { Editor as EditorUI, EditorOutput } from './legacy/console_editor'; import { getAutocompleteInfo, StorageKeys } from '../../../services'; import { useEditorReadContext, useServicesContext, useRequestReadContext } from '../../contexts'; import type { SenseEditor } from '../../models'; -import { MonacoEditor } from './monaco/monaco_editor'; +import { MonacoEditor, MonacoEditorOutput } from './monaco'; const INITIAL_PANEL_WIDTH = 50; const PANEL_MIN_WIDTH = '100px'; @@ -86,7 +86,13 @@ export const Editor = memo(({ loading, setEditorInstance }: Props) => { style={{ height: '100%', position: 'relative', minWidth: PANEL_MIN_WIDTH }} initialWidth={secondPanelWidth} > - {loading ? : } + {loading ? ( + + ) : isMonacoEnabled ? ( + + ) : ( + + )} diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx index eb085248f4a3ec..f9dbb1161cd110 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor_output.tsx @@ -18,7 +18,6 @@ import 'brace/mode/text'; import 'brace/mode/hjson'; import 'brace/mode/yaml'; -import { expandLiteralStrings } from '../../../../../shared_imports'; import { useEditorReadContext, useRequestReadContext, @@ -27,23 +26,7 @@ import { import { createReadOnlyAceEditor, CustomAceEditor } from '../../../../models/legacy_core_editor'; import { subscribeResizeChecker } from '../subscribe_console_resize_checker'; import { applyCurrentSettings } from './apply_editor_settings'; - -const isJSONContentType = (contentType?: string) => - Boolean(contentType && contentType.indexOf('application/json') >= 0); - -const isMapboxVectorTile = (contentType?: string) => - contentType?.includes('application/vnd.mapbox-vector-tile') ?? false; - -/** - * Best effort expand literal strings - */ -const safeExpandLiteralStrings = (data: string): string => { - try { - return expandLiteralStrings(data); - } catch (e) { - return data; - } -}; +import { isJSONContentType, isMapboxVectorTile, safeExpandLiteralStrings } from '../../utilities'; function modeForContentType(contentType?: string) { if (!contentType) { diff --git a/src/plugins/console/public/application/containers/editor/monaco/index.ts b/src/plugins/console/public/application/containers/editor/monaco/index.ts new file mode 100644 index 00000000000000..13d27c966b8823 --- /dev/null +++ b/src/plugins/console/public/application/containers/editor/monaco/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright 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 { MonacoEditor } from './monaco_editor'; +export { MonacoEditorOutput } from './monaco_editor_output'; diff --git a/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_output.tsx b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_output.tsx new file mode 100644 index 00000000000000..c6297f6f56e2b8 --- /dev/null +++ b/src/plugins/console/public/application/containers/editor/monaco/monaco_editor_output.tsx @@ -0,0 +1,92 @@ +/* + * Copyright 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, { FunctionComponent, useEffect, useState } from 'react'; +import { CodeEditor } from '@kbn/code-editor'; +import { css } from '@emotion/react'; +import { VectorTile } from '@mapbox/vector-tile'; +import Protobuf from 'pbf'; +import { i18n } from '@kbn/i18n'; +import { EuiScreenReaderOnly } from '@elastic/eui'; +import { CONSOLE_OUTPUT_THEME_ID, CONSOLE_OUTPUT_LANG_ID } from '@kbn/monaco'; +import { useEditorReadContext, useRequestReadContext } from '../../../contexts'; +import { convertMapboxVectorTileToJson } from '../legacy/console_editor/mapbox_vector_tile'; +import { + isJSONContentType, + isMapboxVectorTile, + safeExpandLiteralStrings, + languageForContentType, +} from '../utilities'; + +export const MonacoEditorOutput: FunctionComponent = () => { + const { settings: readOnlySettings } = useEditorReadContext(); + const { + lastResult: { data }, + } = useRequestReadContext(); + const [value, setValue] = useState(''); + const [mode, setMode] = useState('text'); + + useEffect(() => { + if (data) { + const isMultipleRequest = data.length > 1; + setMode( + isMultipleRequest + ? CONSOLE_OUTPUT_LANG_ID + : languageForContentType(data[0].response.contentType) + ); + setValue( + data + .map((result) => { + const { value: newValue, contentType } = result.response; + + let editorOutput; + if (readOnlySettings.tripleQuotes && isJSONContentType(contentType)) { + editorOutput = safeExpandLiteralStrings(newValue as string); + } else if (isMapboxVectorTile(contentType)) { + const vectorTile = new VectorTile(new Protobuf(newValue as ArrayBuffer)); + const vectorTileJson = convertMapboxVectorTileToJson(vectorTile); + editorOutput = safeExpandLiteralStrings(vectorTileJson as string); + } else { + editorOutput = newValue; + } + + return editorOutput; + }) + .join('\n') + ); + } else { + setValue(''); + } + }, [readOnlySettings, data, value]); + + return ( +
+ + + + +
+ ); +}; diff --git a/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts b/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts index 0107a95ccbfc02..b95a8ac46ac5dc 100644 --- a/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts +++ b/src/plugins/console/public/application/containers/editor/monaco/use_set_initial_value.ts @@ -41,11 +41,32 @@ const readLoadFromParam = () => { * * @param params The {@link SetInitialValueParams} to use. */ -export const useSetInitialValue = (params: SetInitialValueParams) => { +export const useSetInitialValue = async (params: SetInitialValueParams) => { const { initialTextValue, setValue, toasts } = params; - const loadBufferFromRemote = (url: string) => { - // TODO: Add support for fetching from HTTP + const loadBufferFromRemote = async (url: string) => { + if (/^https?:\/\//.test(url)) { + // Check if this is a valid URL + try { + new URL(url); + } catch (e) { + return; + } + // Parse the URL to avoid issues with spaces and other special characters. + const parsedURL = new URL(url); + if (parsedURL.origin === 'https://www.elastic.co') { + const resp = await fetch(parsedURL); + const data = await resp.text(); + setValue(`${initialTextValue}\n\n${data}`); + } else { + toasts.addWarning( + i18n.translate('console.loadFromDataUnrecognizedUrlErrorMessage', { + defaultMessage: + 'Only URLs with the Elastic domain (www.elastic.co) can be loaded in Console.', + }) + ); + } + } // If we have a data URI instead of HTTP, LZ-decode it. This enables // opening requests in Console from anywhere in Kibana. @@ -67,12 +88,12 @@ export const useSetInitialValue = (params: SetInitialValueParams) => { }; // Support for loading a console snippet from a remote source, like support docs. - const onHashChange = debounce(() => { + const onHashChange = debounce(async () => { const url = readLoadFromParam(); if (!url) { return; } - loadBufferFromRemote(url); + await loadBufferFromRemote(url); }, 200); window.addEventListener('hashchange', onHashChange); @@ -80,7 +101,7 @@ export const useSetInitialValue = (params: SetInitialValueParams) => { const loadFromParam = readLoadFromParam(); if (loadFromParam) { - loadBufferFromRemote(loadFromParam); + await loadBufferFromRemote(loadFromParam); } else { setValue(initialTextValue || DEFAULT_INPUT_VALUE); } diff --git a/src/plugins/console/public/application/containers/editor/utilities/index.ts b/src/plugins/console/public/application/containers/editor/utilities/index.ts new file mode 100644 index 00000000000000..7775e86c06ebd3 --- /dev/null +++ b/src/plugins/console/public/application/containers/editor/utilities/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 './output_data'; diff --git a/src/plugins/console/public/application/containers/editor/utilities/output_data.ts b/src/plugins/console/public/application/containers/editor/utilities/output_data.ts new file mode 100644 index 00000000000000..d20791419109b7 --- /dev/null +++ b/src/plugins/console/public/application/containers/editor/utilities/output_data.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 { YAML_LANG_ID, CONSOLE_OUTPUT_LANG_ID } from '@kbn/monaco'; +import { expandLiteralStrings } from '../../../../shared_imports'; + +export const isJSONContentType = (contentType?: string) => + Boolean(contentType && contentType.indexOf('application/json') >= 0); + +export const isMapboxVectorTile = (contentType?: string) => + contentType?.includes('application/vnd.mapbox-vector-tile') ?? false; + +/** + * Best effort expand literal strings + */ +export const safeExpandLiteralStrings = (data: string): string => { + try { + return expandLiteralStrings(data); + } catch (e) { + return data; + } +}; + +const TEXT_LANGUAGE_ID = 'text'; + +export const languageForContentType = (contentType?: string) => { + if (!contentType) { + return TEXT_LANGUAGE_ID; + } + if (isJSONContentType(contentType) || isMapboxVectorTile(contentType)) { + // Using hjson will allow us to use comments in editor output and solves the problem with error markers + return CONSOLE_OUTPUT_LANG_ID; + } else if (contentType.indexOf('application/yaml') >= 0) { + return YAML_LANG_ID; + } + return TEXT_LANGUAGE_ID; +}; diff --git a/src/plugins/dashboard/public/dashboard_actions/_dashboard_actions_strings.ts b/src/plugins/dashboard/public/dashboard_actions/_dashboard_actions_strings.ts index 3490ed4b062382..eb56b39bf71a94 100644 --- a/src/plugins/dashboard/public/dashboard_actions/_dashboard_actions_strings.ts +++ b/src/plugins/dashboard/public/dashboard_actions/_dashboard_actions_strings.ts @@ -51,7 +51,7 @@ export const dashboardAddToLibraryActionStrings = { export const dashboardClonePanelActionStrings = { getDisplayName: () => i18n.translate('dashboard.panel.clonePanel', { - defaultMessage: 'Clone panel', + defaultMessage: 'Duplicate', }), getClonedTag: () => i18n.translate('dashboard.panel.title.clonedTag', { @@ -59,7 +59,7 @@ export const dashboardClonePanelActionStrings = { }), getSuccessMessage: () => i18n.translate('dashboard.panel.clonedToast', { - defaultMessage: 'Cloned panel', + defaultMessage: 'Duplicated panel', }), }; @@ -70,14 +70,14 @@ export const dashboardExpandPanelActionStrings = { }), getMaximizeTitle: () => i18n.translate('dashboard.actions.toggleExpandPanelMenuItem.notExpandedDisplayName', { - defaultMessage: 'Maximize panel', + defaultMessage: 'Maximize', }), }; export const dashboardExportCsvActionStrings = { getDisplayName: () => i18n.translate('dashboard.actions.DownloadCreateDrilldownAction.displayName', { - defaultMessage: 'Download as CSV', + defaultMessage: 'Download CSV', }), getUntitledFilename: () => i18n.translate('dashboard.actions.downloadOptionsUnsavedFilename', { @@ -118,35 +118,6 @@ export const dashboardLibraryNotificationStrings = { }), }; -export const dashboardReplacePanelActionStrings = { - getDisplayName: () => - i18n.translate('dashboard.panel.removePanel.replacePanel', { - defaultMessage: 'Replace panel', - }), - getFlyoutHeader: (panelName?: string) => - i18n.translate('dashboard.panel.replacePanel.flyoutHeader', { - defaultMessage: 'Replace panel {panelName} with:', - values: { - panelName: `'${panelName}'`, - }, - }), - getSuccessMessage: (savedObjectName?: string) => - savedObjectName - ? i18n.translate('dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle', { - defaultMessage: '{savedObjectName} was added', - values: { - savedObjectName: `'${savedObjectName}'`, - }, - }) - : i18n.translate('dashboard.addPanel.panelAddedToContainerSuccessMessageTitle', { - defaultMessage: 'A panel was added', - }), - getNoMatchingObjectsMessage: () => - i18n.translate('dashboard.addPanel.noMatchingObjectsMessage', { - defaultMessage: 'No matching objects found.', - }), -}; - export const dashboardFilterNotificationActionStrings = { getDisplayName: () => i18n.translate('dashboard.panel.filters', { diff --git a/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx b/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx index ce6398788d9472..90a0667a87c5a9 100644 --- a/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/add_to_library_action.tsx @@ -57,7 +57,7 @@ const isApiCompatible = (api: unknown | null): api is AddPanelToLibraryActionApi export class AddToLibraryAction implements Action { public readonly type = ACTION_ADD_TO_LIBRARY; public readonly id = ACTION_ADD_TO_LIBRARY; - public order = 15; + public order = 8; private toastsService; diff --git a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx index 516d126a399893..6ff1773ff610e2 100644 --- a/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/expand_panel_action.test.tsx @@ -46,7 +46,7 @@ describe('Expand panel action', () => { }); it('returns the correct display name based on expanded panel id', async () => { - expect(await action.getDisplayName(context)).toBe('Maximize panel'); + expect(await action.getDisplayName(context)).toBe('Maximize'); context.embeddable.parentApi.expandedPanelId = new BehaviorSubject( 'superPanelId' ); diff --git a/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx b/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx index 45ec7c7db80131..c834ab460128bc 100644 --- a/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx +++ b/src/plugins/dashboard/public/dashboard_actions/export_csv_action.tsx @@ -40,7 +40,7 @@ const isApiCompatible = (api: unknown | null): api is ExportCsvActionApi => export class ExportCSVAction implements Action { public readonly id = ACTION_EXPORT_CSV; public readonly type = ACTION_EXPORT_CSV; - public readonly order = 5; + public readonly order = 18; // right after Export in discover which is 19 private fieldFormats; private uiSettings; diff --git a/src/plugins/dashboard/public/dashboard_actions/index.ts b/src/plugins/dashboard/public/dashboard_actions/index.ts index 2085e9f91bafda..ecffeaa5643aea 100644 --- a/src/plugins/dashboard/public/dashboard_actions/index.ts +++ b/src/plugins/dashboard/public/dashboard_actions/index.ts @@ -8,10 +8,6 @@ import { CoreStart } from '@kbn/core/public'; import { CONTEXT_MENU_TRIGGER, PANEL_NOTIFICATION_TRIGGER } from '@kbn/embeddable-plugin/public'; -import { - getSavedObjectFinder, - SavedObjectFinderProps, -} from '@kbn/saved-objects-finder-plugin/public'; import { DashboardStartDependencies } from '../plugin'; import { AddToLibraryAction } from './add_to_library_action'; @@ -22,7 +18,6 @@ import { ExpandPanelAction } from './expand_panel_action'; import { ExportCSVAction } from './export_csv_action'; import { FiltersNotificationAction } from './filters_notification_action'; import { LegacyLibraryNotificationAction } from './legacy_library_notification_action'; -import { ReplacePanelAction } from './replace_panel_action'; import { UnlinkFromLibraryAction } from './unlink_from_library_action'; import { LegacyUnlinkFromLibraryAction } from './legacy_unlink_from_library_action'; import { LibraryNotificationAction } from './library_notification_action'; @@ -33,28 +28,16 @@ interface BuildAllDashboardActionsProps { plugins: DashboardStartDependencies; } -export type ReplacePanelSOFinder = (props: Omit) => JSX.Element; - export const buildAllDashboardActions = async ({ core, plugins, allowByValueEmbeddables, }: BuildAllDashboardActionsProps) => { - const { uiActions, share, savedObjectsTaggingOss, contentManagement } = plugins; + const { uiActions, share } = plugins; const clonePanelAction = new ClonePanelAction(); uiActions.registerAction(clonePanelAction); uiActions.attachAction(CONTEXT_MENU_TRIGGER, clonePanelAction.id); - - const SavedObjectFinder = getSavedObjectFinder( - contentManagement.client, - core.uiSettings, - savedObjectsTaggingOss?.getTaggingApi() - ); - const changeViewAction = new ReplacePanelAction(SavedObjectFinder as ReplacePanelSOFinder); - uiActions.registerAction(changeViewAction); - uiActions.attachAction(CONTEXT_MENU_TRIGGER, changeViewAction.id); - const expandPanelAction = new ExpandPanelAction(); uiActions.registerAction(expandPanelAction); uiActions.attachAction(CONTEXT_MENU_TRIGGER, expandPanelAction.id); diff --git a/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx b/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx deleted file mode 100644 index befafab7c6a2c3..00000000000000 --- a/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx +++ /dev/null @@ -1,61 +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 { toMountPoint } from '@kbn/kibana-react-plugin/public'; - -import { tracksOverlays } from '@kbn/presentation-containers'; -import { pluginServices } from '../services/plugin_services'; -import { ReplacePanelActionApi } from './replace_panel_action'; -import { ReplacePanelFlyout } from './replace_panel_flyout'; -import { ReplacePanelSOFinder } from '.'; - -export const openReplacePanelFlyout = async ({ - savedObjectFinder, - api, -}: { - savedObjectFinder: ReplacePanelSOFinder; - api: ReplacePanelActionApi; -}) => { - const { - settings: { - theme: { theme$ }, - }, - overlays: { openFlyout }, - } = pluginServices.getServices(); - - // send the overlay ref to the parent if it is capable of tracking overlays - const overlayTracker = tracksOverlays(api.parentApi) ? api.parentApi : undefined; - - const flyoutSession = openFlyout( - toMountPoint( - { - if (flyoutSession) { - if (overlayTracker) overlayTracker.clearOverlays(); - flyoutSession.close(); - } - }} - savedObjectsFinder={savedObjectFinder} - />, - { theme$ } - ), - { - 'data-test-subj': 'dashboardReplacePanel', - ownFocus: true, - onClose: (overlayRef) => { - if (overlayTracker) overlayTracker.clearOverlays(); - overlayRef.close(); - }, - } - ); - - overlayTracker?.openOverlay(flyoutSession); -}; diff --git a/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.test.tsx b/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.test.tsx deleted file mode 100644 index 0e8a4ea4e9fbd3..00000000000000 --- a/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.test.tsx +++ /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 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 { PublishesViewMode, ViewMode } from '@kbn/presentation-publishing'; -import { getMockPresentationContainer } from '@kbn/presentation-containers/mocks'; -import { BehaviorSubject } from 'rxjs'; -import { ReplacePanelSOFinder } from '.'; -import { ReplacePanelAction, ReplacePanelActionApi } from './replace_panel_action'; - -const mockOpenReplacePanelFlyout = jest.fn(); -jest.mock('./open_replace_panel_flyout', () => ({ - openReplacePanelFlyout: () => mockOpenReplacePanelFlyout(), -})); - -describe('replace panel action', () => { - let action: ReplacePanelAction; - let context: { embeddable: ReplacePanelActionApi }; - - const savedObjectFinder = {} as unknown as ReplacePanelSOFinder; - - beforeEach(() => { - action = new ReplacePanelAction(savedObjectFinder); - context = { - embeddable: { - uuid: 'superId', - viewMode: new BehaviorSubject('edit'), - parentApi: getMockPresentationContainer(), - }, - }; - }); - - it('is compatible when api meets all conditions', async () => { - expect(await action.isCompatible(context)).toBe(true); - }); - - it('is incompatible when context lacks necessary functions', async () => { - const emptyContext = { - embeddable: {}, - }; - expect(await action.isCompatible(emptyContext)).toBe(false); - }); - - it('is incompatible when view mode is view', async () => { - (context.embeddable as PublishesViewMode).viewMode = new BehaviorSubject('view'); - expect(await action.isCompatible(context)).toBe(false); - }); - - it('calls open replace panel flyout on execute', async () => { - action.execute(context); - expect(mockOpenReplacePanelFlyout).toHaveBeenCalled(); - }); -}); diff --git a/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.tsx b/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.tsx deleted file mode 100644 index 1830c9b5d53a2a..00000000000000 --- a/src/plugins/dashboard/public/dashboard_actions/replace_panel_action.tsx +++ /dev/null @@ -1,75 +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 { - apiIsPresentationContainer, - PresentationContainer, - TracksOverlays, -} from '@kbn/presentation-containers'; -import { - apiHasUniqueId, - EmbeddableApiContext, - HasUniqueId, - PublishesPanelTitle, - apiCanAccessViewMode, - CanAccessViewMode, - HasParentApi, - apiHasParentApi, - getInheritedViewMode, -} from '@kbn/presentation-publishing'; -import { Action, IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; -import { ReplacePanelSOFinder } from '.'; -import { openReplacePanelFlyout } from './open_replace_panel_flyout'; -import { dashboardReplacePanelActionStrings } from './_dashboard_actions_strings'; - -export const ACTION_REPLACE_PANEL = 'replacePanel'; - -export type ReplacePanelActionApi = CanAccessViewMode & - HasUniqueId & - Partial & - HasParentApi>; - -const isApiCompatible = (api: unknown | null): api is ReplacePanelActionApi => - Boolean( - apiHasUniqueId(api) && - apiCanAccessViewMode(api) && - apiHasParentApi(api) && - apiIsPresentationContainer(api.parentApi) - ); - -export class ReplacePanelAction implements Action { - public readonly type = ACTION_REPLACE_PANEL; - public readonly id = ACTION_REPLACE_PANEL; - public order = 3; - - constructor(private savedObjectFinder: ReplacePanelSOFinder) {} - - public getDisplayName({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); - return dashboardReplacePanelActionStrings.getDisplayName(); - } - - public getIconType({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); - return 'kqlOperand'; - } - - public async isCompatible({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) return false; - return getInheritedViewMode(embeddable) === 'edit'; - } - - public async execute({ embeddable }: EmbeddableApiContext) { - if (!isApiCompatible(embeddable)) throw new IncompatibleActionError(); - - openReplacePanelFlyout({ - api: embeddable, - savedObjectFinder: this.savedObjectFinder, - }); - } -} diff --git a/src/plugins/dashboard/public/dashboard_actions/replace_panel_flyout.tsx b/src/plugins/dashboard/public/dashboard_actions/replace_panel_flyout.tsx deleted file mode 100644 index 6d3de4c1e4c715..00000000000000 --- a/src/plugins/dashboard/public/dashboard_actions/replace_panel_flyout.tsx +++ /dev/null @@ -1,95 +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 { EuiFlyoutBody, EuiFlyoutHeader, EuiTitle } from '@elastic/eui'; -import React from 'react'; - -import { Toast } from '@kbn/core/public'; -import { getPanelTitle } from '@kbn/presentation-publishing'; -import { pluginServices } from '../services/plugin_services'; -import { ReplacePanelActionApi } from './replace_panel_action'; -import { dashboardReplacePanelActionStrings } from './_dashboard_actions_strings'; -import { ReplacePanelSOFinder } from '.'; - -interface Props { - api: ReplacePanelActionApi; - savedObjectsFinder: ReplacePanelSOFinder; - onClose: () => void; -} - -export class ReplacePanelFlyout extends React.Component { - private lastToast: Toast = { - id: 'panelReplaceToast', - }; - - constructor(props: Props) { - super(props); - } - - public showToast = (name: string) => { - const { - notifications: { toasts }, - } = pluginServices.getServices(); - - // To avoid the clutter of having toast messages cover flyout - // close previous toast message before creating a new one - if (this.lastToast) { - toasts.remove(this.lastToast); - } - - this.lastToast = toasts.addSuccess({ - title: dashboardReplacePanelActionStrings.getSuccessMessage(name), - 'data-test-subj': 'addObjectToContainerSuccess', - }); - }; - - public onReplacePanel = async (savedObjectId: string, type: string, name: string) => { - this.props.api.parentApi.replacePanel(this.props.api.uuid, { - panelType: type, - initialState: { savedObjectId }, - }); - this.showToast(name); - this.props.onClose(); - }; - - public render() { - const { - embeddable: { getEmbeddableFactories }, - } = pluginServices.getServices(); - - const SavedObjectFinder = this.props.savedObjectsFinder; - const savedObjectsFinder = ( - - Boolean(embeddableFactory.savedObjectMetaData) && !embeddableFactory.isContainerType - ) - .map(({ savedObjectMetaData }) => savedObjectMetaData as any)} - showFilter={true} - onChoose={this.onReplacePanel} - /> - ); - - return ( - <> - - -

- - {dashboardReplacePanelActionStrings.getFlyoutHeader(getPanelTitle(this.props.api))} - -

-
-
- {savedObjectsFinder} - - ); - } -} diff --git a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts index 1d53561b619d98..a513d725f1f316 100644 --- a/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts +++ b/src/plugins/dashboard/public/dashboard_app/_dashboard_app_strings.ts @@ -99,13 +99,17 @@ export const getNewDashboardTitle = () => defaultMessage: 'New Dashboard', }); -export const getPanelAddedSuccessString = (savedObjectName: string) => - i18n.translate('dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle', { - defaultMessage: '{savedObjectName} was added', - values: { - savedObjectName, - }, - }); +export const getPanelAddedSuccessString = (savedObjectName?: string) => + savedObjectName + ? i18n.translate('dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle', { + defaultMessage: '{savedObjectName} was added', + values: { + savedObjectName, + }, + }) + : i18n.translate('dashboard.addPanel.newEmbeddableWithNoTitleAddedSuccessMessageTitle', { + defaultMessage: 'A panel was added', + }); export const getPanelTooOldErrorString = () => i18n.translate('dashboard.loadURLError.PanelTooOld', { diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/search_sessions/start_dashboard_search_session_integration.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/search_sessions/start_dashboard_search_session_integration.ts index a7efcdb9c1d752..90a559a63d24dd 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/search_sessions/start_dashboard_search_session_integration.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/search_sessions/start_dashboard_search_session_integration.ts @@ -83,6 +83,7 @@ export function startDashboardSearchSessionIntegration( if (updatedSearchSessionId && updatedSearchSessionId !== currentSearchSessionId) { this.searchSessionId = updatedSearchSessionId; + this.searchSessionId$.next(updatedSearchSessionId); } }); 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 1a4fa6c12b15dd..e64881f9fef3e4 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -18,6 +18,7 @@ import { Container, DefaultEmbeddableApi, EmbeddableFactoryNotFoundError, + embeddableInputToSubject, isExplicitInputWithAttributes, PanelNotFoundError, reactEmbeddableRegistryHasKey, @@ -45,7 +46,6 @@ import { v4 } from 'uuid'; import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; import { DashboardContainerInput, DashboardPanelState } from '../../../common'; import { getReferencesForPanelId } from '../../../common/dashboard_container/persistable_state/dashboard_container_references'; -import { dashboardReplacePanelActionStrings } from '../../dashboard_actions/_dashboard_actions_strings'; import { DASHBOARD_APP_ID, DASHBOARD_LOADED_EVENT, @@ -83,6 +83,7 @@ import { dashboardTypeDisplayLowercase, dashboardTypeDisplayName, } from './dashboard_container_factory'; +import { getPanelAddedSuccessString } from '../../dashboard_app/_dashboard_app_strings'; export interface InheritedChildInput { filters: Filter[]; @@ -133,6 +134,9 @@ export class DashboardContainer public controlGroup?: ControlGroupContainer; public searchSessionId?: string; + public searchSessionId$ = new BehaviorSubject(undefined); + public reload$ = new Subject(); + public timeslice$: BehaviorSubject<[number, number] | undefined>; public locator?: Pick, 'navigate' | 'getRedirectUrl'>; // cleanup @@ -201,6 +205,7 @@ export class DashboardContainer this.creationOptions = creationOptions; this.searchSessionId = initialSessionId; + this.searchSessionId$.next(initialSessionId); this.dashboardCreationStartTime = dashboardCreationStartTime; // start diffing dashboard state @@ -238,6 +243,10 @@ export class DashboardContainer }) ); this.startAuditingReactEmbeddableChildren(); + this.timeslice$ = embeddableInputToSubject< + [number, number] | undefined, + DashboardContainerInput + >(this.publishingSubscription, this, 'timeslice'); } public getAppContext() { @@ -425,7 +434,7 @@ export class DashboardContainer const onSuccess = (id?: string, title?: string) => { if (!displaySuccessMessage) return; toasts.addSuccess({ - title: dashboardReplacePanelActionStrings.getSuccessMessage(title), + title: getPanelAddedSuccessString(title), 'data-test-subj': 'addEmbeddableToDashboardSuccess', }); this.setScrollToPanelId(id); @@ -523,6 +532,7 @@ export class DashboardContainer public forceRefresh(refreshControlGroup: boolean = true) { this.dispatch.setLastReloadRequestTimeToNow({}); + this.reload$.next(); if (refreshControlGroup) this.controlGroup?.reload(); } @@ -591,6 +601,7 @@ export class DashboardContainer const { input: newInput, searchSessionId } = initializeResult; this.searchSessionId = searchSessionId; + this.searchSessionId$.next(searchSessionId); batch(() => { this.dispatch.setLastSavedInput( diff --git a/src/plugins/dashboard/tsconfig.json b/src/plugins/dashboard/tsconfig.json index b484a9f6c51c35..2f4b399a727efc 100644 --- a/src/plugins/dashboard/tsconfig.json +++ b/src/plugins/dashboard/tsconfig.json @@ -53,7 +53,6 @@ "@kbn/core-execution-context-common", "@kbn/core-custom-branding-browser", "@kbn/shared-ux-router", - "@kbn/saved-objects-finder-plugin", "@kbn/saved-objects-management-plugin", "@kbn/shared-ux-button-toolbar", "@kbn/core-saved-objects-server", diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_inline.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_inline.tsx index eba836f81bc3ce..2cdb3ec0c008f5 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_inline.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav_inline.tsx @@ -9,6 +9,7 @@ import React from 'react'; import { EuiHeader, EuiHeaderSection, EuiHeaderSectionItem } from '@elastic/eui'; import { TopNavMenuBadges, TopNavMenuItems } from '@kbn/navigation-plugin/public'; +import { euiThemeVars } from '@kbn/ui-theme'; import { LogsExplorerTabs } from '../../../../components/logs_explorer_tabs'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { useDiscoverTopNav } from './use_discover_topnav'; @@ -33,7 +34,10 @@ export const DiscoverTopNavInline = ({ } return ( - + {customizationContext.inlineTopNav.showLogsExplorerTabs && ( diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts index 611654173b09f5..57cfe3350420ac 100644 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts +++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/embeddable_compatibility_utils.ts @@ -15,25 +15,23 @@ import { map, Subscription, } from 'rxjs'; -import { IEmbeddable } from '../..'; +import { EmbeddableInput, EmbeddableOutput, IEmbeddable } from '../..'; import { Container } from '../../containers'; import { ViewMode as LegacyViewMode } from '../../types'; -import { - CommonLegacyEmbeddable, - CommonLegacyInput, - CommonLegacyOutput, -} from './legacy_embeddable_to_api'; +import { CommonLegacyEmbeddable } from './legacy_embeddable_to_api'; export const embeddableInputToSubject = < - T extends unknown = unknown, - LegacyInput extends CommonLegacyInput = CommonLegacyInput + ValueType extends unknown = unknown, + LegacyInput extends EmbeddableInput = EmbeddableInput >( subscription: Subscription, embeddable: IEmbeddable, key: keyof LegacyInput, useExplicitInput = false ) => { - const subject = new BehaviorSubject(embeddable.getExplicitInput()?.[key] as T); + const subject = new BehaviorSubject( + embeddable.getExplicitInput()?.[key] as ValueType + ); if (useExplicitInput && embeddable.parent) { subscription.add( embeddable.parent @@ -47,33 +45,35 @@ export const embeddableInputToSubject = < return deepEqual(previousValue, currentValue); }) ) - .subscribe(() => subject.next(embeddable.getExplicitInput()?.[key] as T)) + .subscribe(() => subject.next(embeddable.getExplicitInput()?.[key] as ValueType)) ); } else { subscription.add( embeddable .getInput$() .pipe(distinctUntilKeyChanged(key)) - .subscribe(() => subject.next(embeddable.getInput()?.[key] as T)) + .subscribe(() => subject.next(embeddable.getInput()?.[key] as ValueType)) ); } return subject; }; export const embeddableOutputToSubject = < - T extends unknown = unknown, - LegacyOutput extends CommonLegacyOutput = CommonLegacyOutput + ValueType extends unknown = unknown, + LegacyOutput extends EmbeddableOutput = EmbeddableOutput >( subscription: Subscription, - embeddable: IEmbeddable, + embeddable: IEmbeddable, key: keyof LegacyOutput ) => { - const subject = new BehaviorSubject(embeddable.getOutput()[key] as T); + const subject = new BehaviorSubject( + embeddable.getOutput()[key] as ValueType + ); subscription.add( embeddable .getOutput$() .pipe(distinctUntilKeyChanged(key)) - .subscribe(() => subject.next(embeddable.getOutput()[key] as T)) + .subscribe(() => subject.next(embeddable.getOutput()[key] as ValueType)) ); return subject; }; diff --git a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts index b44d49b903d9f0..ef8f9ccad25ee7 100644 --- a/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts +++ b/src/plugins/embeddable/public/lib/embeddables/compatibility/legacy_embeddable_to_api.ts @@ -69,12 +69,18 @@ export const legacyEmbeddableToApi = ( /** * Shortcuts for creating publishing subjects from the input and output subjects */ - const inputKeyToSubject = ( + const inputKeyToSubject = ( key: keyof CommonLegacyInput, useExplicitInput?: boolean - ) => embeddableInputToSubject(subscriptions, embeddable, key, useExplicitInput); - const outputKeyToSubject = (key: keyof CommonLegacyOutput) => - embeddableOutputToSubject(subscriptions, embeddable, key); + ) => + embeddableInputToSubject( + subscriptions, + embeddable, + key, + useExplicitInput + ); + const outputKeyToSubject = (key: keyof CommonLegacyOutput) => + embeddableOutputToSubject(subscriptions, embeddable, key); /** * Support editing of legacy embeddables diff --git a/src/plugins/kibana_react/public/index.ts b/src/plugins/kibana_react/public/index.ts index 510d57fc6c09a9..93480cd3cf9457 100644 --- a/src/plugins/kibana_react/public/index.ts +++ b/src/plugins/kibana_react/public/index.ts @@ -56,6 +56,9 @@ export { ValidatedDualRange } from './validated_range'; export type { ToastInput, KibanaReactNotifications } from './notifications'; export { createNotifications } from './notifications'; +/** @deprecated use `Markdown` from `@kbn/shared-ux-markdown` */ +export { Markdown, MarkdownSimple } from './markdown'; + export { toMountPoint } from './util'; export type { ToMountPointOptions } from './util'; diff --git a/src/plugins/kibana_react/public/markdown/__snapshots__/markdown.test.tsx.snap b/src/plugins/kibana_react/public/markdown/__snapshots__/markdown.test.tsx.snap new file mode 100644 index 00000000000000..4299acdd32c9e8 --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/__snapshots__/markdown.test.tsx.snap @@ -0,0 +1,60 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`props markdown 1`] = ` +
I am some content with markdown

+", + } + } +/> +`; + +exports[`props openLinksInNewTab 1`] = ` +
I am some content with markdown

+", + } + } +/> +`; + +exports[`props whiteListedRules 1`] = ` +
I am some [content](https://en.wikipedia.org/wiki/Content) with markdown

+", + } + } +/> +`; + +exports[`render 1`] = ` +
+`; + +exports[`should never render html tags 1`] = ` +
<div>I may be dangerous if rendered as html</div>

+", + } + } +/> +`; diff --git a/src/plugins/kibana_react/public/markdown/_markdown.scss b/src/plugins/kibana_react/public/markdown/_markdown.scss new file mode 100644 index 00000000000000..a3bba38509bcdb --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/_markdown.scss @@ -0,0 +1,328 @@ +// Default styles for Markdown element +// +// 1. Links +// 2. Headings +// 3. Images +// 4. Blockquotes +// 5. Horizontal rules +// 6. Lists +// 7. Tables +// 8. Code blocks + +// Functions +// Note: The inlined base font size is set in common/functions/font.js. It should match $kbnMdFontSize. +$kbnDefaultFontSize: 14px; + +@function canvasToEm($size) { + @return #{calc($size / $kbnDefaultFontSize)}em; +} + +.kbnMarkdown__body { + // Font size variables + $kbnMarkdownFontSizeS: canvasToEm(12px); + $kbnMarkdownFontSize: canvasToEm(14px); + $kbnMarkdownFontSizeL: canvasToEm(20px); + $kbnMarkdownFontSizeXL: canvasToEm(28px); + $kbnMarkdownFontSizeXXL: canvasToEm(36px); + + // Spacing variables + $kbnMarkdownSizeL: canvasToEm(24px); + $kbnMarkdownSize: canvasToEm(16px); + $kbnMarkdownSizeS: canvasToEm(12px); + $kbnMarkdownSizeXS: canvasToEm(8px); + $kbnMarkdownSizeXXS: canvasToEm(4px); + + // Grayscale variables + $kbnMarkdownAlphaLightestShade: rgba($euiColorFullShade, .05); + $kbnMarkdownAlphaLightShade: rgba($euiColorFullShade, .15); + $kbnMarkdownAlphaDarkShade: rgba($euiColorFullShade, .65); + + // Reverse grayscale for opposite of theme + $kbnMarkdownAlphaLightestShadeReversed: rgba($euiColorEmptyShade, .05); + $kbnMarkdownAlphaLightShadeReversed: rgba($euiColorEmptyShade, .15); + $kbnMarkdownAlphaDarkShadeReversed: rgba($euiColorEmptyShade, .65); + + &--reversed { + color: $euiColorLightestShade; + } + + > *:first-child { + margin-top: 0 !important; + } + + > *:last-child { + margin-bottom: 0 !important; + } + + p, + blockquote, + ul, + ol, + dl, + table, + pre { + margin-top: 0; + margin-bottom: $kbnMarkdownSize; + line-height: 1.5em; + } + + strong { + font-weight: 600; + } + + // 1. Links + a { + color: inherit; + text-decoration: underline; + } + + a:hover { + text-decoration: underline dotted; + } + + a:active, + a:hover { + outline-width: 0; + } + + a:not([href]) { + color: inherit; + text-decoration: none; + } + + // 2. Headings + h1, + h2, + h3, + h4, + h5, + h6 { + margin-top: 0; + margin-bottom: $kbnMarkdownSizeXS; + } + + h1 { + font-size: $kbnMarkdownFontSizeXXL; + line-height: 1.333333em; + font-weight: 300; + } + + h2 { + font-size: $kbnMarkdownFontSizeXL; + line-height: 1.428571em; + font-weight: 300; + } + + h3 { + font-size: $kbnMarkdownFontSizeL; + line-height: 1.6em; + font-weight: 600; + } + + h4 { + font-size: $kbnMarkdownSize; + line-height: 1.5em; + font-weight: 600; + } + + h5 { + font-size: $kbnMarkdownFontSize; + line-height: 1.142857em; + font-weight: 700; + } + + h6 { + font-size: $kbnMarkdownFontSizeS; + line-height: 1.333333em; + font-weight: 700; + text-transform: uppercase; + } + + // 3. Images + img { + max-width: 100%; + box-sizing: content-box; + border-style: none; + pointer-events: auto; + } + + // 4. Blockquotes + blockquote { + padding: 0 1em; + border-left: $kbnMarkdownSizeXXS solid $kbnMarkdownAlphaLightShade; + } + &--reversed blockquote { + border-left-color: $kbnMarkdownAlphaLightShadeReversed; + } + + // 5. Horizontal rules + hr { + overflow: hidden; + background: transparent; + height: 2px; + padding: 0; + margin: $kbnMarkdownSizeL 0; + background-color: $kbnMarkdownAlphaLightShade; + border: 0; + } + &--reversed hr { + background-color: $kbnMarkdownAlphaLightShadeReversed; + } + + hr::before { + display: table; + content: ''; + } + + hr::after { + display: table; + clear: both; + content: ''; + } + + // 6. Lists + ul, + ol { + padding-left: $kbnMarkdownSizeL; + margin-top: 0; + margin-bottom: $kbnMarkdownSize; + } + + ul { + list-style-type: disc; + } + ol { + list-style-type: decimal; + } + + ul ul { + list-style-type: circle; + } + + ol ol, + ul ol { + list-style-type: lower-roman; + } + + ul ul ol, + ul ol ol, + ol ul ol, + ol ol ol { + list-style-type: lower-alpha; + } + + dd { + margin-left: 0; + } + + ul ul, + ul ol, + ol ol, + ol ul { + margin-top: 0; + margin-bottom: 0; + } + + li > p { + margin-bottom: $kbnMarkdownSizeXS; + } + + li + li { + margin-top: $kbnMarkdownSizeXXS; + } + + // 7. Tables + table { + display: block; + width: 100%; + overflow: auto; + border-left: 1px solid $kbnMarkdownAlphaLightShade; + border-spacing: 0; + border-collapse: collapse; + } + &--reversed table { + border-left-color: $kbnMarkdownAlphaLightShadeReversed; + } + + td, + th { + padding: 0; + } + + table th, + table td { + padding: $kbnMarkdownSizeXXS $kbnMarkdownSizeS; + border-top: 1px solid $kbnMarkdownAlphaLightShade; + border-bottom: 1px solid $kbnMarkdownAlphaLightShade; + + &:last-child { + border-right: 1px solid $kbnMarkdownAlphaLightShade; + } + } + &--reversed table th, + &--reversed table td { + border-color: $kbnMarkdownAlphaLightShadeReversed; + } + + table tr { + background-color: transparent; + border-top: 1px solid $kbnMarkdownAlphaLightShade; + } + &--reversed table tr { + border-top-color: $kbnMarkdownAlphaLightShadeReversed; + } + + // 8. Code blocks + code, + pre { + margin-bottom: $kbnMarkdownSizeXS; + font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', 'source-code-pro', monospace; + font-size: $kbnMarkdownFontSizeS; + } + + code { + padding: $kbnMarkdownSizeXXS 0; + margin: 0; + background-color: $kbnMarkdownAlphaLightestShade; + border-radius: $kbnMarkdownSizeXXS; + } + &--reversed code { + background-color: $kbnMarkdownAlphaLightestShadeReversed; + } + + code::before, + code::after { + letter-spacing: -.2em; + content: '\00a0'; + } + + pre { + padding: $kbnMarkdownSize; + overflow: auto; + font-size: $kbnMarkdownFontSizeS; + line-height: 1.333333em; + background-color: $kbnMarkdownAlphaLightestShade; + border-radius: $kbnMarkdownSizeXXS; + word-wrap: normal; + } + &--reversed pre { + background-color: $kbnMarkdownAlphaLightestShadeReversed; + } + + pre code { + display: inline; + max-width: auto; + padding: 0; + overflow: visible; + line-height: inherit; + word-wrap: normal; + white-space: pre; + background-color: transparent; + border: 0; + } + + pre code::before, + pre code::after { + content: normal; + } +} diff --git a/src/plugins/kibana_react/public/markdown/index.scss b/src/plugins/kibana_react/public/markdown/index.scss new file mode 100644 index 00000000000000..f997ea5384eacd --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/index.scss @@ -0,0 +1 @@ +@import './markdown'; diff --git a/src/plugins/kibana_react/public/markdown/index.tsx b/src/plugins/kibana_react/public/markdown/index.tsx new file mode 100644 index 00000000000000..c15d4269cf3c07 --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/index.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 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 { EuiSkeletonText, EuiDelayRender } from '@elastic/eui'; +import type { MarkdownSimpleProps } from './markdown_simple'; +import type { MarkdownProps } from './markdown'; + +const Fallback = () => ( + + + +); + +/** @deprecated use `Markdown` from `@kbn/shared-ux-markdown` */ +const LazyMarkdownSimple = React.lazy(() => import('./markdown_simple')); +export const MarkdownSimple = (props: MarkdownSimpleProps) => ( + }> + + +); + +/** @deprecated use `Markdown` from `@kbn/shared-ux-markdown` */ +const LazyMarkdown = React.lazy(() => import('./markdown')); +export const Markdown = (props: MarkdownProps) => ( + }> + + +); diff --git a/src/plugins/kibana_react/public/markdown/markdown.test.tsx b/src/plugins/kibana_react/public/markdown/markdown.test.tsx new file mode 100644 index 00000000000000..1dda072be9e5fd --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/markdown.test.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; + +import { Markdown } from './markdown'; + +test('render', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); +}); + +test('should never render html tags', () => { + const component = shallow( + + ); + expect(component).toMatchSnapshot(); +}); + +test('should render links with parentheses correctly', () => { + const component = shallow( + + ); + expect(component.render().find('a').prop('href')).toBe( + 'https://example.com/foo/bar?group=(()filters:!t)' + ); +}); + +test('should add `noreferrer` and `nooopener` to all links in new tabs', () => { + const component = shallow( + + ); + expect(component.render().find('a').prop('rel')).toBe('noopener noreferrer'); +}); + +describe('props', () => { + const markdown = 'I am *some* [content](https://en.wikipedia.org/wiki/Content) with `markdown`'; + + test('markdown', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('openLinksInNewTab', () => { + const component = shallow(); + expect(component).toMatchSnapshot(); + }); + + test('whiteListedRules', () => { + const component = shallow( + + ); + expect(component).toMatchSnapshot(); + }); + + test('should update markdown when openLinksInNewTab prop change', () => { + const component = shallow(); + expect(component.render().find('a').prop('target')).not.toBe('_blank'); + component.setProps({ openLinksInNewTab: true }); + expect(component.render().find('a').prop('target')).toBe('_blank'); + }); + + test('should update markdown when whiteListedRules prop change', () => { + const md = '*emphasis* `backticks`'; + const component = shallow( + + ); + expect(component.render().find('em')).toHaveLength(1); + expect(component.render().find('code')).toHaveLength(1); + component.setProps({ whiteListedRules: ['backticks'] }); + expect(component.render().find('code')).toHaveLength(1); + expect(component.render().find('em')).toHaveLength(0); + }); +}); diff --git a/src/plugins/kibana_react/public/markdown/markdown.tsx b/src/plugins/kibana_react/public/markdown/markdown.tsx new file mode 100644 index 00000000000000..62f2564daf1f55 --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/markdown.tsx @@ -0,0 +1,109 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { useEffect } from 'react'; +import MarkdownIt from 'markdown-it'; +import { memoize } from 'lodash'; +import { getSecureRelForTarget } from '@elastic/eui'; + +import './index.scss'; +/** + * Return a memoized markdown rendering function that use the specified + * whiteListedRules and openLinksInNewTab configurations. + * @param {Array of Strings} whiteListedRules - white list of markdown rules + * list of rules can be found at https://github.com/markdown-it/markdown-it/issues/361 + * @param {Boolean} openLinksInNewTab + * @return {Function} Returns an Object to use with dangerouslySetInnerHTML + * with the rendered markdown HTML + */ +export const markdownFactory = memoize( + (whiteListedRules: string[] = [], openLinksInNewTab: boolean = false) => { + let markdownIt: MarkdownIt; + + // It is imperative that the html config property be set to false, to mitigate XSS: the output of markdown-it is + // fed directly to the DOM via React's dangerouslySetInnerHTML below. + + if (whiteListedRules && whiteListedRules.length > 0) { + markdownIt = new MarkdownIt('zero', { html: false, linkify: true }); + markdownIt.enable(whiteListedRules); + } else { + markdownIt = new MarkdownIt({ html: false, linkify: true }); + } + + if (openLinksInNewTab) { + // All links should open in new browser tab. + // Define custom renderer to add 'target' attribute + // https://github.com/markdown-it/markdown-it/blob/master/docs/architecture.md#renderer + const originalLinkRender = + markdownIt.renderer.rules.link_open || + function (tokens, idx, options, env, self) { + return self.renderToken(tokens, idx, options); + }; + markdownIt.renderer.rules.link_open = function (tokens, idx, options, env, self) { + const href = tokens[idx].attrGet('href'); + const target = '_blank'; + const rel = getSecureRelForTarget({ href: href === null ? undefined : href, target }); + + // https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/ + tokens[idx].attrPush(['target', target]); + if (rel) { + tokens[idx].attrPush(['rel', rel]); + } + return originalLinkRender(tokens, idx, options, env, self); + }; + } + /** + * This method is used to render markdown from the passed parameter + * into HTML. It will just return an empty string when the markdown is empty. + * @param {String} markdown - The markdown String + * @return {String} - Returns the rendered HTML as string. + */ + return (markdown: string) => { + return markdown ? markdownIt.render(markdown) : ''; + }; + }, + (whiteListedRules: string[] = [], openLinksInNewTab: boolean = false) => { + return `${whiteListedRules.join('_')}${openLinksInNewTab}`; + } +); + +export interface MarkdownProps extends React.HTMLAttributes { + className?: string; + markdown?: string; + openLinksInNewTab?: boolean; + whiteListedRules?: string[]; + onRender?: () => void; +} + +export const Markdown = (props: MarkdownProps) => { + useEffect(() => { + props.onRender?.(); + }, [props]); + + const { className, markdown = '', openLinksInNewTab, whiteListedRules, ...rest } = props; + const classes = classNames('kbnMarkdown__body', className); + const markdownRenderer = markdownFactory(whiteListedRules, openLinksInNewTab); + const renderedMarkdown = markdownRenderer(markdown); + return ( +
+ ); +}; + +// Needed for React.lazy +// eslint-disable-next-line import/no-default-export +export default Markdown; diff --git a/src/plugins/kibana_react/public/markdown/markdown_simple.tsx b/src/plugins/kibana_react/public/markdown/markdown_simple.tsx new file mode 100644 index 00000000000000..24b9eee7b1ca5d --- /dev/null +++ b/src/plugins/kibana_react/public/markdown/markdown_simple.tsx @@ -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 React from 'react'; +import ReactMarkdown from 'react-markdown'; + +export interface MarkdownSimpleProps { + children: string; +} + +// Render markdown string into JSX inside of a Fragment. +export const MarkdownSimple = ({ children }: MarkdownSimpleProps) => ( + {children} +); + +// Needed for React.lazy +// eslint-disable-next-line import/no-default-export +export default MarkdownSimple; diff --git a/src/plugins/navigation/kibana.jsonc b/src/plugins/navigation/kibana.jsonc index 3c0e6246e66a9a..73ab422db2fad3 100644 --- a/src/plugins/navigation/kibana.jsonc +++ b/src/plugins/navigation/kibana.jsonc @@ -8,6 +8,6 @@ "browser": true, "optionalPlugins": ["cloud","security"], "requiredPlugins": ["unifiedSearch"], - "requiredBundles": ["kibanaReact"] + "requiredBundles": [] } } diff --git a/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx b/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx index ac33ce5d6e860c..178bd8aceb680c 100644 --- a/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx +++ b/src/plugins/navigation/public/solution_nav_userprofile_toggle/solution_nav_userprofile_toggle.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import type { SecurityPluginStart } from '@kbn/security-plugin/public'; import { UserProfilesKibanaProvider } from '@kbn/user-profile-components'; import { CoreStart } from '@kbn/core-lifecycle-browser'; -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { useSolutionNavUserProfileToggle } from './use_solution_nav_userprofile_toggle'; diff --git a/src/plugins/navigation/tsconfig.json b/src/plugins/navigation/tsconfig.json index 0651d57bd31913..ecf3aba49c9ce1 100644 --- a/src/plugins/navigation/tsconfig.json +++ b/src/plugins/navigation/tsconfig.json @@ -28,7 +28,6 @@ "@kbn/solution-nav-oblt", "@kbn/config", "@kbn/solution-nav-analytics", - "@kbn/kibana-react-plugin", "@kbn/security-plugin", "@kbn/user-profile-components", "@kbn/core-lifecycle-browser", diff --git a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_action.tsx b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_action.tsx index fd5810755dd83c..f5ab9c58b8a9fb 100644 --- a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_action.tsx +++ b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_action.tsx @@ -45,13 +45,13 @@ export const isApiCompatibleWithCustomizePanelAction = ( export class CustomizePanelAction implements Action { public type = ACTION_CUSTOMIZE_PANEL; public id = ACTION_CUSTOMIZE_PANEL; - public order = 40; + public order = 45; constructor() {} public getDisplayName({ embeddable }: EmbeddableApiContext): string { return i18n.translate('presentationPanel.action.customizePanel.displayName', { - defaultMessage: 'Panel settings', + defaultMessage: 'Settings', }); } diff --git a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx index cafb522c0af8d4..d74b55a69dae4c 100644 --- a/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx +++ b/src/plugins/presentation_panel/public/panel_actions/customize_panel_action/customize_panel_editor.tsx @@ -290,7 +290,7 @@ export const CustomizePanelEditor = ({

diff --git a/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts b/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts index 8080a7c3079579..ec1cc7d442e0fe 100644 --- a/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts +++ b/src/plugins/presentation_panel/public/panel_actions/remove_panel_action/remove_panel_action.ts @@ -34,11 +34,18 @@ export class RemovePanelAction implements Action { public readonly id = ACTION_REMOVE_PANEL; public order = 1; + public grouping = [ + { + id: 'delete_panel_action', + order: 1, + }, + ]; + constructor() {} public getDisplayName() { return i18n.translate('presentationPanel.action.removePanel.displayName', { - defaultMessage: 'Delete from dashboard', + defaultMessage: 'Remove', }); } diff --git a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss index 74767afa5bba05..3574a829ba8529 100644 --- a/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss +++ b/src/plugins/presentation_panel/public/panel_component/_presentation_panel.scss @@ -148,16 +148,6 @@ .embPanel--editing { transition: all $euiAnimSpeedFast $euiAnimSlightResistance; - outline-width: $euiBorderWidthThin; - - &:hover, - &:focus { - @include euiSlightShadowHover; - - .embPanel__emptyTitleDragHandle { - display: block; - } - } .embPanel--dragHandle { transition: background-color $euiAnimSpeedFast $euiAnimSlightResistance; diff --git a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx index ff9f7766baadf3..6c5aebf3154b7f 100644 --- a/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx +++ b/src/plugins/presentation_panel/public/panel_component/panel_header/presentation_panel_context_menu.tsx @@ -84,14 +84,15 @@ export const PresentationPanelContextMenu = ({ (action) => disabledActions.indexOf(action.id) === -1 ); } - compatibleActions.sort( - ({ order: orderA }, { order: orderB }) => (orderB || 0) - (orderA || 0) - ); if (actionPredicate) { compatibleActions = compatibleActions.filter(({ id }) => actionPredicate(id)); } + compatibleActions.sort( + ({ order: orderA }, { order: orderB }) => (orderB || 0) - (orderA || 0) + ); + /** * Build context menu panel from actions */ diff --git a/src/plugins/share/kibana.jsonc b/src/plugins/share/kibana.jsonc index 175264cab790b3..a705a73709730c 100644 --- a/src/plugins/share/kibana.jsonc +++ b/src/plugins/share/kibana.jsonc @@ -7,6 +7,8 @@ "id": "share", "server": true, "browser": true, - "requiredBundles": ["kibanaReact", "kibanaUtils"], + "requiredBundles": [ + "kibanaUtils" + ] } } diff --git a/src/plugins/share/public/components/context/index.tsx b/src/plugins/share/public/components/context/index.tsx new file mode 100644 index 00000000000000..5ec9f8d1734abf --- /dev/null +++ b/src/plugins/share/public/components/context/index.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 { createContext, useContext } from 'react'; + +import { AnonymousAccessServiceContract } from '../../../common'; +import type { + ShareMenuItem, + UrlParamExtension, + BrowserUrlService, + ShareContext, +} from '../../types'; + +export interface IShareContext extends ShareContext { + allowEmbed: boolean; + allowShortUrl: boolean; + shareMenuItems: ShareMenuItem[]; + embedUrlParamExtensions?: UrlParamExtension[]; + anonymousAccess?: AnonymousAccessServiceContract; + urlService: BrowserUrlService; + snapshotShareWarning?: string; + objectTypeTitle?: string; + isEmbedded: boolean; +} + +export const ShareTabsContext = createContext(null); + +export const useShareTabsContext = () => useContext(ShareTabsContext); diff --git a/src/plugins/share/public/components/share_tabs.tsx b/src/plugins/share/public/components/share_tabs.tsx index 9c28cf6dc72fc6..8866eba58adfc0 100644 --- a/src/plugins/share/public/components/share_tabs.tsx +++ b/src/plugins/share/public/components/share_tabs.tsx @@ -6,44 +6,43 @@ * Side Public License, v 1. */ -import { Capabilities } from '@kbn/core-capabilities-common'; -import React from 'react'; -import { EuiModal } from '@elastic/eui'; -import { LocatorPublic, AnonymousAccessServiceContract } from '../../common'; -import { ShareMenuItem, UrlParamExtension, BrowserUrlService } from '../types'; - -export interface ModalTabActionHandler { - id: string; - dataTestSubj: string; - formattedMessageId: string; - defaultMessage: string; -} - -export interface ShareContextTabProps { - allowEmbed: boolean; - allowShortUrl: boolean; - objectId?: string; - objectType: string; - shareableUrl?: string; - shareableUrlForSavedObject?: string; - shareableUrlLocatorParams?: { - locator: LocatorPublic; - params: any; - }; - shareMenuItems: ShareMenuItem[]; - sharingData: any; - onClose: () => void; - embedUrlParamExtensions?: UrlParamExtension[]; - anonymousAccess?: AnonymousAccessServiceContract; - showPublicUrlSwitch?: (anonymousUserCapabilities: Capabilities) => boolean; - urlService: BrowserUrlService; - snapshotShareWarning?: string; - objectTypeTitle?: string; - disabledShareUrl?: boolean; - isDirty: boolean; - isEmbedded: boolean; -} - -export const ShareMenuTabs = ({ onClose }: ShareContextTabProps) => { - return {'placeholder'}; +import React, { type FC } from 'react'; +import { TabbedModal } from '@kbn/shared-ux-tabbed-modal'; + +import { ShareTabsContext, useShareTabsContext, type IShareContext } from './context'; +import { linkTab, embedTab } from './tabs'; + +export const ShareMenuV2: FC<{ shareContext: IShareContext }> = ({ shareContext }) => { + return ( + + + + ); +}; + +// this file is intended to replace share_context_menu +export const ShareMenuTabs = () => { + const shareContext = useShareTabsContext(); + + if (!shareContext) { + return null; + } + + const { allowEmbed, objectType, onClose } = shareContext; + const tabs = []; + tabs.push(linkTab); + + if (allowEmbed) { + tabs.push(embedTab); + } + + return ( + + ); }; diff --git a/src/plugins/share/public/components/tabs/embed/embed_content.tsx b/src/plugins/share/public/components/tabs/embed/embed_content.tsx new file mode 100644 index 00000000000000..78a9ef65b9abf9 --- /dev/null +++ b/src/plugins/share/public/components/tabs/embed/embed_content.tsx @@ -0,0 +1,247 @@ +/* + * Copyright 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 { EuiForm, EuiFormRow, EuiSpacer, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useCallback, useEffect, useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; +import { format as formatUrl, parse as parseUrl } from 'url'; +import { AnonymousAccessState } from '../../../../common'; + +import { type IShareContext } from '../../context'; + +type EmbedProps = Pick< + IShareContext, + | 'shareableUrlLocatorParams' + | 'shareableUrlForSavedObject' + | 'shareableUrl' + | 'isEmbedded' + | 'embedUrlParamExtensions' + | 'objectType' +> & { + onChange: (url: string) => void; +}; + +interface UrlParams { + [extensionName: string]: { + [queryParam: string]: boolean; + }; +} + +export enum ExportUrlAsType { + EXPORT_URL_AS_SAVED_OBJECT = 'savedObject', + EXPORT_URL_AS_SNAPSHOT = 'snapshot', +} + +export const EmbedContent = ({ + embedUrlParamExtensions: urlParamExtensions, + shareableUrlForSavedObject, + shareableUrl, + isEmbedded, + onChange, + objectType, +}: EmbedProps) => { + const isMounted = useMountedState(); + const [urlParams, setUrlParams] = useState(undefined); + const [useShortUrl] = useState(true); + const [exportUrlAs] = useState(ExportUrlAsType.EXPORT_URL_AS_SAVED_OBJECT); + const [url, setUrl] = useState(''); + const [shortUrlCache, setShortUrlCache] = useState(undefined); + const [anonymousAccessParameters] = useState(null); + const [usePublicUrl] = useState(false); + + useEffect(() => { + onChange(url); + }, [url, onChange]); + + const getUrlParamExtensions = useCallback( + (tempUrl: string): string => { + return urlParams + ? Object.keys(urlParams).reduce((urlAccumulator, key) => { + const urlParam = urlParams[key]; + return urlParam + ? Object.keys(urlParam).reduce((queryAccumulator, queryParam) => { + const isQueryParamEnabled = urlParam[queryParam]; + return isQueryParamEnabled + ? queryAccumulator + `&${queryParam}=true` + : queryAccumulator; + }, urlAccumulator) + : urlAccumulator; + }, tempUrl) + : tempUrl; + }, + [urlParams] + ); + + const updateUrlParams = useCallback( + (tempUrl: string) => { + tempUrl = urlParams ? getUrlParamExtensions(tempUrl) : tempUrl; + return tempUrl; + }, + [getUrlParamExtensions, urlParams] + ); + + const getSnapshotUrl = useCallback( + (forSavedObject?: boolean) => { + let tempUrl = ''; + if (forSavedObject && shareableUrlForSavedObject) { + tempUrl = shareableUrlForSavedObject; + } + if (!tempUrl) { + tempUrl = shareableUrl || window.location.href; + } + return updateUrlParams(tempUrl); + }, + [shareableUrl, shareableUrlForSavedObject, updateUrlParams] + ); + + const getSavedObjectUrl = useCallback(() => { + const tempUrl = getSnapshotUrl(true); + + const parsedUrl = parseUrl(tempUrl); + + if (!parsedUrl || !parsedUrl.hash) { + return; + } + + // Get the application route, after the hash, and remove the #. + const parsedAppUrl = parseUrl(parsedUrl.hash.slice(1), true); + + const formattedUrl = formatUrl({ + protocol: parsedUrl.protocol, + auth: parsedUrl.auth, + host: parsedUrl.host, + pathname: parsedUrl.pathname, + hash: formatUrl({ + pathname: parsedAppUrl.pathname, + query: { + // Add global state to the URL so that the iframe doesn't just show the time range + // default. + _g: parsedAppUrl.query._g, + }, + }), + }); + + return updateUrlParams(formattedUrl); + }, [getSnapshotUrl, updateUrlParams]); + + const addUrlAnonymousAccessParameters = useCallback( + (tempUrl: string): string => { + if (!anonymousAccessParameters || !usePublicUrl) { + return tempUrl; + } + + const parsedUrl = new URL(tempUrl); + + for (const [name, value] of Object.entries(anonymousAccessParameters)) { + parsedUrl.searchParams.set(name, value); + } + + return parsedUrl.toString(); + }, + [anonymousAccessParameters, usePublicUrl] + ); + + const makeIframeTag = (tempUrl: string) => { + if (!tempUrl) { + return; + } + + return ``; + }; + + const setUrlHelper = useCallback(() => { + let tempUrl: string | undefined; + + if (exportUrlAs === ExportUrlAsType.EXPORT_URL_AS_SAVED_OBJECT) { + tempUrl = getSavedObjectUrl(); + } else if (useShortUrl && shortUrlCache) { + tempUrl = shortUrlCache; + } else { + tempUrl = getSnapshotUrl(); + } + + if (tempUrl) { + tempUrl = addUrlAnonymousAccessParameters(tempUrl!); + } + + if (isEmbedded) { + tempUrl = makeIframeTag(tempUrl!); + } + setUrl(tempUrl!); + }, [ + addUrlAnonymousAccessParameters, + exportUrlAs, + getSavedObjectUrl, + getSnapshotUrl, + isEmbedded, + shortUrlCache, + useShortUrl, + ]); + + const resetUrl = useCallback(() => { + if (isMounted()) { + setShortUrlCache(undefined); + setUrlHelper(); + } + }, [isMounted, setUrlHelper]); + + useEffect(() => { + setUrlHelper(); + getUrlParamExtensions(url); + window.addEventListener('hashchange', resetUrl, false); + isMounted(); + }, [getUrlParamExtensions, resetUrl, setUrlHelper, url, isMounted]); + + const renderUrlParamExtensions = () => { + if (!urlParamExtensions) { + return null; + } + + const setParamValue = + (paramName: string) => + (values: { [queryParam: string]: boolean } = {}): void => { + setUrlParams({ ...urlParams, [paramName]: { ...values } }); + setUrlHelper(); + }; + + return ( + + {urlParamExtensions.map(({ paramName, component: UrlParamComponent }) => ( + + + + ))} + + ); + }; + + const helpText = + objectType === 'dashboard' ? ( + + ) : ( + + ); + + return ( + + + {helpText} + + {renderUrlParamExtensions()} + + + ); +}; diff --git a/src/plugins/share/public/components/tabs/embed/index.tsx b/src/plugins/share/public/components/tabs/embed/index.tsx new file mode 100644 index 00000000000000..4614355babafe5 --- /dev/null +++ b/src/plugins/share/public/components/tabs/embed/index.tsx @@ -0,0 +1,88 @@ +/* + * Copyright 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 React, { useCallback } from 'react'; +import { copyToClipboard } from '@elastic/eui'; +import { type IModalTabDeclaration } from '@kbn/shared-ux-tabbed-modal'; +import { EmbedContent } from './embed_content'; +import { useShareTabsContext } from '../../context'; + +const EMBED_TAB_ACTIONS = { + SET_EMBED_URL: 'SET_EMBED_URL', +}; + +type IEmbedTab = IModalTabDeclaration<{ url: string }>; + +const embedTabReducer: IEmbedTab['reducer'] = (state = { url: '' }, action) => { + switch (action.type) { + case EMBED_TAB_ACTIONS.SET_EMBED_URL: + return { + ...state, + url: action.payload, + }; + default: + return state; + } +}; + +const EmbedTabContent: NonNullable = ({ dispatch }) => { + const { + embedUrlParamExtensions, + shareableUrlForSavedObject, + shareableUrl, + isEmbedded, + objectType, + } = useShareTabsContext()!; + + const onChange = useCallback( + (shareUrl: string) => { + dispatch({ + type: EMBED_TAB_ACTIONS.SET_EMBED_URL, + payload: shareUrl, + }); + }, + [dispatch] + ); + + return ( + + ); +}; + +export const embedTab: IEmbedTab = { + id: 'embed', + name: i18n.translate('share.contextMenu.embedCodeTab', { + defaultMessage: 'Embed', + }), + description: i18n.translate('share.dashboard.embed.description', { + defaultMessage: + 'Embed this dashboard into another webpage. Select which menu items to include in the embeddable view.', + }), + reducer: embedTabReducer, + content: EmbedTabContent, + modalActionBtn: { + id: 'embed', + dataTestSubj: 'copyEmbedUrlButton', + label: i18n.translate('share.link.copyEmbedCodeButton', { + defaultMessage: 'Copy Embed', + }), + handler: ({ state }) => { + copyToClipboard(state.url); + }, + }, +}; diff --git a/src/plugins/share/public/components/tabs/index.ts b/src/plugins/share/public/components/tabs/index.ts new file mode 100644 index 00000000000000..a5855495aaec55 --- /dev/null +++ b/src/plugins/share/public/components/tabs/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright 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 { linkTab } from './link'; +export { embedTab } from './embed'; diff --git a/src/plugins/share/public/components/tabs/link/index.tsx b/src/plugins/share/public/components/tabs/link/index.tsx new file mode 100644 index 00000000000000..b7ae94fa1848e4 --- /dev/null +++ b/src/plugins/share/public/components/tabs/link/index.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 React, { useCallback } from 'react'; +import { i18n } from '@kbn/i18n'; +import { copyToClipboard } from '@elastic/eui'; +import { type IModalTabDeclaration } from '@kbn/shared-ux-tabbed-modal'; +import { useShareTabsContext } from '../../context'; +import { LinkContent } from './link_content'; + +type ILinkTab = IModalTabDeclaration<{ + dashboardUrl: string; + isNotSaved: boolean; +}>; + +const LINK_TAB_ACTIONS = { + SET_DASHBOARD_URL: 'SET_DASHBOARD_URL', + SET_IS_NOT_SAVED: 'SET_IS_NOT_SAVED', +}; + +const linkTabReducer: ILinkTab['reducer'] = ( + state = { + dashboardUrl: '', + isNotSaved: false, + }, + action +) => { + switch (action.type) { + case LINK_TAB_ACTIONS.SET_DASHBOARD_URL: + return { + ...state, + dashboardUrl: action.payload, + }; + case LINK_TAB_ACTIONS.SET_IS_NOT_SAVED: + return { + ...state, + isNotSaved: action.payload, + }; + default: + return state; + } +}; + +const LinkTabContent: ILinkTab['content'] = ({ state, dispatch }) => { + const { + objectType, + objectId, + isDirty, + isEmbedded, + shareableUrl, + shareableUrlForSavedObject, + urlService, + shareableUrlLocatorParams, + } = useShareTabsContext()!; + + const setDashboardLink = useCallback( + (url: string) => { + dispatch({ type: LINK_TAB_ACTIONS.SET_DASHBOARD_URL, payload: url }); + }, + [dispatch] + ); + + const setIsNotSaved = useCallback(() => { + dispatch({ + type: LINK_TAB_ACTIONS.SET_IS_NOT_SAVED, + payload: objectType === 'lens' ? isDirty : false, + }); + }, [dispatch, objectType, isDirty]); + + return ( + + ); +}; + +export const linkTab: ILinkTab = { + id: 'link', + name: i18n.translate('share.contextMenu.permalinksTab', { + defaultMessage: 'Links', + }), + description: i18n.translate('share.dashboard.link.description', { + defaultMessage: 'Share a direct link to this search.', + }), + content: LinkTabContent, + reducer: linkTabReducer, + modalActionBtn: { + id: 'link', + dataTestSubj: 'copyShareUrlButton', + label: i18n.translate('share.link.copyLinkButton', { defaultMessage: 'Copy link' }), + handler: ({ state }) => { + copyToClipboard(state.dashboardUrl); + }, + style: ({ state }) => state.isNotSaved, + }, +}; diff --git a/src/plugins/share/public/components/tabs/link/link_content.tsx b/src/plugins/share/public/components/tabs/link/link_content.tsx new file mode 100644 index 00000000000000..38d59de8cd67bb --- /dev/null +++ b/src/plugins/share/public/components/tabs/link/link_content.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 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 { EuiCodeBlock, EuiForm, EuiSpacer, EuiText } from '@elastic/eui'; +import { FormattedMessage } from '@kbn/i18n-react'; +import React, { useCallback, useEffect, useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; +import { format as formatUrl, parse as parseUrl } from 'url'; +import { IShareContext } from '../../context'; + +type LinkProps = Pick< + IShareContext, + | 'objectType' + | 'objectId' + | 'isDirty' + | 'isEmbedded' + | 'urlService' + | 'shareableUrl' + | 'shareableUrlForSavedObject' + | 'shareableUrlLocatorParams' +> & { + setDashboardLink: (url: string) => void; + setIsNotSaved: () => void; +}; + +interface UrlParams { + [extensionName: string]: { + [queryParam: string]: boolean; + }; +} + +export const LinkContent = ({ + objectType, + objectId, + isDirty, + isEmbedded, + shareableUrl, + shareableUrlForSavedObject, + urlService, + shareableUrlLocatorParams, + setDashboardLink, + setIsNotSaved, +}: LinkProps) => { + const isMounted = useMountedState(); + const [url, setUrl] = useState(''); + const [urlParams] = useState(undefined); + const [shortUrlCache, setShortUrlCache] = useState(undefined); + + useEffect(() => { + // propagate url updates upwards to tab + setDashboardLink(url); + setIsNotSaved(); + }, [setDashboardLink, url, setIsNotSaved, isDirty]); + + const isNotSaved = useCallback(() => { + return objectId === undefined || objectId === '' || isDirty; + }, [objectId, isDirty]); + + const makeUrlEmbeddable = useCallback((tempUrl: string): string => { + const embedParam = '?embed=true'; + const urlHasQueryString = tempUrl.indexOf('?') !== -1; + + if (urlHasQueryString) { + return tempUrl.replace('?', `${embedParam}&`); + } + + return `${tempUrl}${embedParam}`; + }, []); + + const getUrlParamExtensions = useCallback( + (tempUrl: string): string => { + if (!urlParams) return tempUrl; + + return Object.keys(urlParams).reduce((urlAccumulator, key) => { + const urlParam = urlParams[key]; + return urlParam + ? Object.keys(urlParam).reduce((queryAccumulator, queryParam) => { + const isQueryParamEnabled = urlParam[queryParam]; + return isQueryParamEnabled + ? queryAccumulator + `&${queryParam}=true` + : queryAccumulator; + }, urlAccumulator) + : urlAccumulator; + }, tempUrl); + }, + [urlParams] + ); + + const updateUrlParams = useCallback( + (tempUrl: string) => { + tempUrl = isEmbedded ? makeUrlEmbeddable(tempUrl) : tempUrl; + tempUrl = urlParams ? getUrlParamExtensions(tempUrl) : tempUrl; + setUrl(tempUrl); + return tempUrl; + }, + [makeUrlEmbeddable, getUrlParamExtensions, urlParams, isEmbedded] + ); + + const getSnapshotUrl = useCallback( + (forSavedObject?: boolean) => { + let tempUrl = ''; + if (forSavedObject && shareableUrlForSavedObject) { + tempUrl = shareableUrlForSavedObject; + } + if (!tempUrl) { + tempUrl = shareableUrl || window.location.href; + } + + return updateUrlParams(tempUrl); + }, + [shareableUrl, shareableUrlForSavedObject, updateUrlParams] + ); + + const getSavedObjectUrl = useCallback(() => { + if (isNotSaved()) { + return; + } + + const tempUrl = getSnapshotUrl(true); + + const parsedUrl = parseUrl(tempUrl); + if (!parsedUrl || !parsedUrl.hash) { + return; + } + + // Get the application route, after the hash, and remove the #. + const parsedAppUrl = parseUrl(parsedUrl.hash.slice(1), true); + + const formattedUrl = formatUrl({ + protocol: parsedUrl.protocol, + auth: parsedUrl.auth, + host: parsedUrl.host, + pathname: parsedUrl.pathname, + hash: formatUrl({ + pathname: parsedAppUrl.pathname, + query: { + // Add global state to the URL so that the iframe doesn't just show the time range + // default. + _g: parsedAppUrl.query._g, + }, + }), + }); + return updateUrlParams(formattedUrl); + }, [getSnapshotUrl, isNotSaved, updateUrlParams]); + + const createShortUrl = useCallback( + async (tempUrl: string) => { + if (!isMounted || shortUrlCache) return; + const shortUrl = shareableUrlLocatorParams + ? await urlService.shortUrls.get(null).createWithLocator(shareableUrlLocatorParams) + : (await urlService.shortUrls.get(null).createFromLongUrl(tempUrl)).url; + setShortUrlCache(shortUrl as string); + setUrl(shortUrl as string); + }, + [isMounted, shareableUrlLocatorParams, urlService.shortUrls, shortUrlCache] + ); + + const setUrlHelper = useCallback(() => { + let tempUrl: string | undefined; + + if (objectType === 'dashboard' || objectType === 'search') { + tempUrl = getSnapshotUrl(); + } else { + tempUrl = getSavedObjectUrl(); + } + return url === '' || objectType === 'lens' ? setUrl(tempUrl!) : createShortUrl(tempUrl!); + }, [getSavedObjectUrl, getSnapshotUrl, createShortUrl, objectType, url]); + + useEffect(() => { + isMounted(); + setUrlHelper(); + }, [isMounted, setUrlHelper]); + + return ( + + + + + + + + {objectType === 'lens' && isNotSaved() ? ( + + ) : ( + shareableUrl ?? url ?? '' + )} + + + + ); +}; diff --git a/src/plugins/share/public/services/share_menu_manager.tsx b/src/plugins/share/public/services/share_menu_manager.tsx index 842b2bce1d62a8..7c3d7554c0ba20 100644 --- a/src/plugins/share/public/services/share_menu_manager.tsx +++ b/src/plugins/share/public/services/share_menu_manager.tsx @@ -12,12 +12,13 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import { CoreStart, OverlayStart, ThemeServiceStart } from '@kbn/core/public'; import { EuiWrappingPopover } from '@elastic/eui'; import { I18nProvider } from '@kbn/i18n-react'; -import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; + +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { ShareMenuItem, ShowShareMenuOptions } from '../types'; import { ShareMenuRegistryStart } from './share_menu_registry'; import { AnonymousAccessServiceContract } from '../../common/anonymous_access'; import type { BrowserUrlService } from '../types'; -import { ShareMenuTabs } from '../components/share_tabs'; +import { ShareMenuV2 } from '../components/share_tabs'; import { ShareContextMenu } from '../components/share_context_menu'; export class ShareMenuManager { @@ -114,7 +115,7 @@ export class ShareMenuManager { if (!newVersionEnabled) { const element = ( - + { const session = overlays.openModal( toMountPoint( - { - onClose(); - session.close(); + { + onClose(); + session.close(); + }, }} - embedUrlParamExtensions={embedUrlParamExtensions} - anonymousAccess={anonymousAccess} - showPublicUrlSwitch={showPublicUrlSwitch} - urlService={urlService} - snapshotShareWarning={snapshotShareWarning} - disabledShareUrl={disabledShareUrl} - isDirty={isDirty} - isEmbedded={allowEmbed} />, { i18n, theme } ), diff --git a/src/plugins/share/tsconfig.json b/src/plugins/share/tsconfig.json index ea5f056f7862a1..49a25e75fbef05 100644 --- a/src/plugins/share/tsconfig.json +++ b/src/plugins/share/tsconfig.json @@ -6,7 +6,6 @@ "include": ["common/**/*", "public/**/*", "server/**/*"], "kbn_references": [ "@kbn/core", - "@kbn/kibana-react-plugin", "@kbn/kibana-utils-plugin", "@kbn/utility-types", "@kbn/i18n", @@ -19,8 +18,8 @@ "@kbn/shared-ux-error-boundary", "@kbn/core-chrome-browser", "@kbn/shared-ux-prompt-not-found", - "@kbn/core-capabilities-common", "@kbn/react-kibana-mount", + "@kbn/shared-ux-tabbed-modal", ], "exclude": [ "target/**/*", diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.test.ts b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.test.ts index 7a6cb3a4c5265f..8982c91dff9610 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.test.ts +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.test.ts @@ -13,13 +13,13 @@ import { PresentableGrouping } from '@kbn/ui-actions-browser'; const createTestAction = ({ type, - dispayName, + displayName, order, grouping = undefined, disabled, }: { type?: string; - dispayName: string; + displayName: string; order?: number; grouping?: PresentableGrouping; disabled?: boolean; @@ -27,7 +27,7 @@ const createTestAction = ({ createAction({ id: type as string, type, - getDisplayName: () => dispayName, + getDisplayName: () => displayName, order, execute: async () => {}, grouping, @@ -47,27 +47,27 @@ test('sorts items in DESC order by "order" field first, then by display name', a createTestAction({ order: 1, type: 'foo', - dispayName: 'a-1', + displayName: 'a-1', }), createTestAction({ order: 2, type: 'foo', - dispayName: 'a-2', + displayName: 'a-2', }), createTestAction({ order: 3, type: 'foo', - dispayName: 'a-3', + displayName: 'a-3', }), createTestAction({ order: 2, type: 'foo', - dispayName: 'b-2', + displayName: 'b-2', }), createTestAction({ order: 2, type: 'foo', - dispayName: 'c-2', + displayName: 'c-2', }), ].sort(() => 0.5 - Math.random()); @@ -133,7 +133,7 @@ test('can build menu with one action', async () => { actions: [ { action: createTestAction({ - dispayName: 'Foo', + displayName: 'Foo', }), context: {}, trigger: { @@ -162,11 +162,11 @@ test('orders items according to "order" field', async () => { const actions = [ createTestAction({ order: 1, - dispayName: 'Foo', + displayName: 'Foo', }), createTestAction({ order: 2, - dispayName: 'Bar', + displayName: 'Bar', }), ]; const menu = await buildContextMenuForActions({ @@ -179,11 +179,11 @@ test('orders items according to "order" field', async () => { const actions2 = [ createTestAction({ order: 2, - dispayName: 'Bar', + displayName: 'Bar', }), createTestAction({ order: 1, - dispayName: 'Foo', + displayName: 'Foo', }), ]; const menu2 = await buildContextMenuForActions({ @@ -197,19 +197,19 @@ test('orders items according to "order" field', async () => { test('hides items behind in "More" submenu if there are more than 4 actions', async () => { const actions = [ createTestAction({ - dispayName: 'Foo 1', + displayName: 'Foo 1', }), createTestAction({ - dispayName: 'Foo 2', + displayName: 'Foo 2', }), createTestAction({ - dispayName: 'Foo 3', + displayName: 'Foo 3', }), createTestAction({ - dispayName: 'Foo 4', + displayName: 'Foo 4', }), createTestAction({ - dispayName: 'Foo 5', + displayName: 'Foo 5', }), ]; const menu = await buildContextMenuForActions({ @@ -257,16 +257,16 @@ test('hides items behind in "More" submenu if there are more than 4 actions', as test('separates grouped items from main items with a separator', async () => { const actions = [ createTestAction({ - dispayName: 'Foo 1', + displayName: 'Foo 1', }), createTestAction({ - dispayName: 'Foo 2', + displayName: 'Foo 2', }), createTestAction({ - dispayName: 'Foo 3', + displayName: 'Foo 3', }), createTestAction({ - dispayName: 'Foo 4', + displayName: 'Foo 4', grouping: [ { id: 'testGroup', @@ -319,16 +319,16 @@ test('separates grouped items from main items with a separator', async () => { test('separates multiple groups each with its own separator', async () => { const actions = [ createTestAction({ - dispayName: 'Foo 1', + displayName: 'Foo 1', }), createTestAction({ - dispayName: 'Foo 2', + displayName: 'Foo 2', }), createTestAction({ - dispayName: 'Foo 3', + displayName: 'Foo 3', }), createTestAction({ - dispayName: 'Foo 4', + displayName: 'Foo 4', grouping: [ { id: 'testGroup', @@ -337,7 +337,7 @@ test('separates multiple groups each with its own separator', async () => { ], }), createTestAction({ - dispayName: 'Foo 5', + displayName: 'Foo 5', grouping: [ { id: 'testGroup2', @@ -405,7 +405,7 @@ test('separates multiple groups each with its own separator', async () => { test('does not add separator for first grouping if there are no main items', async () => { const actions = [ createTestAction({ - dispayName: 'Foo 4', + displayName: 'Foo 4', grouping: [ { id: 'testGroup', @@ -414,7 +414,7 @@ test('does not add separator for first grouping if there are no main items', asy ], }), createTestAction({ - dispayName: 'Foo 5', + displayName: 'Foo 5', grouping: [ { id: 'testGroup2', @@ -467,11 +467,11 @@ test('does not add separator for first grouping if there are no main items', asy test('it creates disabled actions', async () => { const actions = [ createTestAction({ - dispayName: 'Foo 4', + displayName: 'Foo 4', disabled: true, }), createTestAction({ - dispayName: 'Foo 5', + displayName: 'Foo 5', }), ]; const menu = await buildContextMenuForActions({ diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 4059f954001ec5..943077ae8e554b 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -8,7 +8,6 @@ import * as React from 'react'; import { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; -import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import type { Trigger } from '@kbn/ui-actions-browser/src/triggers'; import type { Action, ActionExecutionContext, ActionInternal } from '../actions'; @@ -179,10 +178,12 @@ export async function buildContextMenuForActions({ for (const panel of Object.values(panels)) { const items = panel.items.filter(Boolean) as ItemDescriptor[]; - panel.items = _.sortBy( - items, - (a) => -1 * (a._order ?? 0), - (a) => a._title + panel.items = items.sort( + ({ _order: orderA, _title: titleA }, { _order: orderB, _title: titleB }) => { + const orderComparison = (orderB || 0) - (orderA || 0); + if (orderComparison !== 0) return orderComparison; + return (titleA || '').localeCompare(titleB || ''); + } ); } diff --git a/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/vis.js b/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/vis.js index 2ad505c2590822..0701f9498c793e 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/vis.js +++ b/src/plugins/vis_types/timeseries/public/application/components/vis_types/markdown/vis.js @@ -11,7 +11,7 @@ import React from 'react'; import classNames from 'classnames'; import { get } from 'lodash'; import { ClassNames } from '@emotion/react'; -import { Markdown } from '@kbn/shared-ux-markdown'; +import { Markdown } from '@kbn/kibana-react-plugin/public'; import { ErrorComponent } from '../../error'; import { replaceVars } from '../../lib/replace_vars'; @@ -79,11 +79,9 @@ function MarkdownVisualization(props) { {!markdownError && ( - {markdownSource} - + /> )}
diff --git a/test/functional/apps/dashboard/group3/index.ts b/test/functional/apps/dashboard/group3/index.ts index efa86ffee010f7..035ac538ee99ab 100644 --- a/test/functional/apps/dashboard/group3/index.ts +++ b/test/functional/apps/dashboard/group3/index.ts @@ -33,7 +33,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { } else { loadTestFile(require.resolve('./dashboard_time_picker')); loadTestFile(require.resolve('./bwc_shared_urls')); - loadTestFile(require.resolve('./panel_replacing')); loadTestFile(require.resolve('./panel_cloning')); loadTestFile(require.resolve('./copy_panel_to')); loadTestFile(require.resolve('./panel_context_menu')); diff --git a/test/functional/apps/dashboard/group3/panel_context_menu.ts b/test/functional/apps/dashboard/group3/panel_context_menu.ts index 4abf860cb17fc8..d2807bc006d4c2 100644 --- a/test/functional/apps/dashboard/group3/panel_context_menu.ts +++ b/test/functional/apps/dashboard/group3/panel_context_menu.ts @@ -53,7 +53,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardPanelActions.expectExistsEditPanelAction(); await dashboardPanelActions.expectExistsClonePanelAction(); - await dashboardPanelActions.expectExistsReplacePanelAction(); await dashboardPanelActions.expectExistsRemovePanelAction(); await dashboardPanelActions.expectExistsToggleExpandAction(); }); @@ -69,7 +68,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await dashboardPanelActions.expectExistsEditPanelAction(); await dashboardPanelActions.expectExistsClonePanelAction(); - await dashboardPanelActions.expectExistsReplacePanelAction(); await dashboardPanelActions.expectExistsRemovePanelAction(); // Get rid of the timestamp in the url. @@ -156,7 +154,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('context menu actions are hidden in view mode', async function () { await dashboardPanelActions.expectMissingEditPanelAction(); await dashboardPanelActions.expectMissingDuplicatePanelAction(); - await dashboardPanelActions.expectMissingReplacePanelAction(); await dashboardPanelActions.expectMissingRemovePanelAction(); }); @@ -168,7 +165,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('some context menu actions should be present', async function () { await dashboardPanelActions.expectExistsEditPanelAction(); await dashboardPanelActions.expectExistsClonePanelAction(); - await dashboardPanelActions.expectExistsReplacePanelAction(); }); it('"remove panel" action should not be present', async function () { diff --git a/test/functional/apps/dashboard/group3/panel_replacing.ts b/test/functional/apps/dashboard/group3/panel_replacing.ts deleted file mode 100644 index 1cb344748594f9..00000000000000 --- a/test/functional/apps/dashboard/group3/panel_replacing.ts +++ /dev/null @@ -1,91 +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 expect from '@kbn/expect'; -import { - PIE_CHART_VIS_NAME, - AREA_CHART_VIS_NAME, - LINE_CHART_VIS_NAME, -} from '../../../page_objects/dashboard_page'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const browser = getService('browser'); - const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardAddPanel = getService('dashboardAddPanel'); - const dashboardReplacePanel = getService('dashboardReplacePanel'); - const dashboardVisualizations = getService('dashboardVisualizations'); - const PageObjects = getPageObjects([ - 'dashboard', - 'header', - 'visualize', - 'discover', - 'timePicker', - ]); - - describe('replace dashboard panels', function viewEditModeTests() { - let intialDimensions: undefined | Array<{ width: number; height: number }>; - - before(async function () { - await PageObjects.dashboard.initTests(); - await PageObjects.dashboard.preserveCrossAppState(); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.timePicker.setHistoricalDataRange(); - await dashboardAddPanel.addVisualization(PIE_CHART_VIS_NAME); - await dashboardAddPanel.addVisualization(LINE_CHART_VIS_NAME); - intialDimensions = await PageObjects.dashboard.getPanelDimensions(); - }); - - after(async function () { - await PageObjects.dashboard.gotoDashboardLandingPage(); - }); - - it('replaces old panel with selected panel', async () => { - await dashboardPanelActions.replacePanelByTitle(PIE_CHART_VIS_NAME); - await dashboardReplacePanel.replaceEmbeddable(AREA_CHART_VIS_NAME); - await PageObjects.header.waitUntilLoadingHasFinished(); - const panelTitles = await PageObjects.dashboard.getPanelTitles(); - expect(panelTitles.length).to.be(2); - expect(panelTitles[0]).to.be(AREA_CHART_VIS_NAME); - const newDimensions = await PageObjects.dashboard.getPanelDimensions(); - expect(intialDimensions![0]).to.eql(newDimensions[0]); - }); - - it('replaced panel persisted correctly when dashboard is hard refreshed', async () => { - const currentUrl = await browser.getCurrentUrl(); - await browser.get(currentUrl, true); - const alert = await browser.getAlert(); - await alert?.accept(); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - const panelTitles = await PageObjects.dashboard.getPanelTitles(); - expect(panelTitles.length).to.be(2); - expect(panelTitles[0]).to.be(AREA_CHART_VIS_NAME); - }); - - it('replaced panel with saved search', async () => { - const replacedSearch = 'replaced saved search'; - await dashboardVisualizations.createSavedSearch({ - name: replacedSearch, - fields: ['bytes', 'agent'], - }); - await PageObjects.header.clickDashboard(); - const inViewMode = await PageObjects.dashboard.getIsInViewMode(); - if (inViewMode) { - await PageObjects.dashboard.switchToEditMode(); - } - await dashboardPanelActions.replacePanelByTitle(AREA_CHART_VIS_NAME); - await dashboardReplacePanel.replaceEmbeddable(replacedSearch, 'Saved search'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - const panelTitles = await PageObjects.dashboard.getPanelTitles(); - expect(panelTitles.length).to.be(2); - expect(panelTitles[0]).to.be(replacedSearch); - }); - }); -} diff --git a/test/functional/apps/dashboard_elements/image_embeddable/image_embeddable.ts b/test/functional/apps/dashboard_elements/image_embeddable/image_embeddable.ts index 6fc586fb35bbab..0772c01def58da 100644 --- a/test/functional/apps/dashboard_elements/image_embeddable/image_embeddable.ts +++ b/test/functional/apps/dashboard_elements/image_embeddable/image_embeddable.ts @@ -54,6 +54,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('image embeddable should support drilldowns', async () => { await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickContextMenuMoreItem(); await dashboardDrilldownPanelActions.expectExistsCreateDrilldownAction(); await dashboardDrilldownPanelActions.clickCreateDrilldown(); await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutOpen(); diff --git a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts index 052e33f29f4e8f..f86358e584766d 100644 --- a/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts +++ b/test/functional/apps/discover/embeddable/_saved_search_embeddable.ts @@ -12,8 +12,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const dataGrid = getService('dataGrid'); const dashboardAddPanel = getService('dashboardAddPanel'); - const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardReplacePanel = getService('dashboardReplacePanel'); const filterBar = getService('filterBar'); const queryBar = getService('queryBar'); const esArchiver = getService('esArchiver'); @@ -129,18 +127,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); - it('should replace a panel with a saved search', async () => { - await dashboardAddPanel.addVisualization('Rendering Test: datatable'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - await dashboardPanelActions.replacePanelByTitle('Rendering Test: datatable'); - await dashboardReplacePanel.replaceEmbeddable('Rendering-Test:-saved-search'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - await testSubjects.missingOrFail('embeddableError'); - expect(await PageObjects.discover.getSavedSearchDocumentCount()).to.be('4,633 documents'); - }); - it('should not show the full screen button', async () => { await addSearchEmbeddableToDashboard(); await testSubjects.missingOrFail('dataGridFullScreenButton'); diff --git a/test/functional/apps/visualize/group6/_tsvb_markdown.ts b/test/functional/apps/visualize/group6/_tsvb_markdown.ts index 7652bf875aadcd..f015a0a0107483 100644 --- a/test/functional/apps/visualize/group6/_tsvb_markdown.ts +++ b/test/functional/apps/visualize/group6/_tsvb_markdown.ts @@ -80,7 +80,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const html = '

hello world

'; await visualBuilder.enterMarkdown(html); const markdownText = await visualBuilder.getMarkdownText(); - expect(markdownText).to.be(''); + expect(markdownText).to.be(html); }); it('markdown variables should be clickable', async () => { diff --git a/test/functional/page_objects/visualize_page.ts b/test/functional/page_objects/visualize_page.ts index ceae95f637493c..521d2afe578c4f 100644 --- a/test/functional/page_objects/visualize_page.ts +++ b/test/functional/page_objects/visualize_page.ts @@ -66,8 +66,30 @@ export class VisualizePageObject extends FtrService { }); } - public async gotoVisualizationLandingPage() { - await this.common.navigateToApp('visualize'); + /** + * Try to speed resets a bit if the Visualize Library breadcrumb is available + */ + private async clickOnVisualizeLibraryBreadcrumb() { + // Try to navigate to the Visualize Listing page from breadcrumb if available + const selector = '[data-test-subj="breadcrumb first"][title="Visualize Library"]'; + const visualizeLibraryBreadcrumb = await this.find.existsByCssSelector(selector); + if (visualizeLibraryBreadcrumb) { + await this.find.clickByCssSelector(selector); + // Lens offers a last modal before leaving the page for unsaved charts + // so close it as quick as possible + if (await this.testSubjects.exists('confirmModalConfirmButton')) { + await this.testSubjects.click('confirmModalConfirmButton'); + return true; + } + } + } + + public async gotoVisualizationLandingPage( + { forceRefresh }: { forceRefresh: boolean } = { forceRefresh: false } + ) { + if (forceRefresh || !(await this.clickOnVisualizeLibraryBreadcrumb())) { + await this.common.navigateToApp('visualize'); + } } public async selectVisualizationsTab() { @@ -142,8 +164,15 @@ export class VisualizePageObject extends FtrService { }); } - public async navigateToNewVisualization() { - await this.gotoVisualizationLandingPage(); + /** + * Navigation now happens without URL refresh by default + * so a new "forceRefresh" option has been passed in order to + * address those scenarios where a full refresh is required (i.e. changing default settings) + */ + public async navigateToNewVisualization( + options: { forceRefresh: boolean } = { forceRefresh: false } + ) { + await this.gotoVisualizationLandingPage(options); await this.header.waitUntilLoadingHasFinished(); await this.clickNewVisualization(); await this.waitForGroupsSelectPage(); @@ -158,8 +187,7 @@ export class VisualizePageObject extends FtrService { } public async navigateToLensFromAnotherVisualization() { - const button = await this.testSubjects.find('visualizeEditInLensButton'); - await button.click(); + await this.testSubjects.click('visualizeEditInLensButton'); } public async hasNavigateToLensButton() { diff --git a/test/functional/services/dashboard/panel_actions.ts b/test/functional/services/dashboard/panel_actions.ts index b322a553778c85..49a6f0ee1cebac 100644 --- a/test/functional/services/dashboard/panel_actions.ts +++ b/test/functional/services/dashboard/panel_actions.ts @@ -210,6 +210,8 @@ export class DashboardPanelActionsService extends FtrService { } else { await this.openContextMenu(); } + const isActionVisible = await this.testSubjects.exists(CLONE_PANEL_DATA_TEST_SUBJ); + if (!isActionVisible) await this.clickContextMenuMoreItem(); await this.testSubjects.click(CLONE_PANEL_DATA_TEST_SUBJ); await this.dashboard.waitForRenderComplete(); } @@ -352,11 +354,6 @@ export class DashboardPanelActionsService extends FtrService { await this.expectExistsPanelAction(testSubj, title); } - async expectExistsReplacePanelAction() { - this.log.debug('expectExistsReplacePanelAction'); - await this.expectExistsPanelAction(REPLACE_PANEL_DATA_TEST_SUBJ); - } - async expectExistsClonePanelAction() { this.log.debug('expectExistsClonePanelAction'); await this.expectExistsPanelAction(CLONE_PANEL_DATA_TEST_SUBJ); @@ -383,11 +380,6 @@ export class DashboardPanelActionsService extends FtrService { await this.expectMissingPanelAction(EDIT_PANEL_DATA_TEST_SUBJ); } - async expectMissingReplacePanelAction() { - this.log.debug('expectMissingReplacePanelAction'); - await this.expectMissingPanelAction(REPLACE_PANEL_DATA_TEST_SUBJ); - } - async expectMissingDuplicatePanelAction() { this.log.debug('expectMissingDuplicatePanelAction'); await this.expectMissingPanelAction(CLONE_PANEL_DATA_TEST_SUBJ); diff --git a/test/functional/services/dashboard/panel_drilldown_actions.ts b/test/functional/services/dashboard/panel_drilldown_actions.ts index 3a240d58c983d9..5b76ce62dd02d8 100644 --- a/test/functional/services/dashboard/panel_drilldown_actions.ts +++ b/test/functional/services/dashboard/panel_drilldown_actions.ts @@ -22,7 +22,7 @@ export function DashboardDrilldownPanelActionsProvider({ getService }: FtrProvid await testSubjects.existOrFail(CREATE_DRILLDOWN_DATA_TEST_SUBJ); } - async expectMissingCreateDrilldwonAction() { + async expectMissingCreateDrilldownAction() { log.debug('expectMissingCreateDrilldownAction'); await testSubjects.existOrFail(MANAGE_DRILLDOWNS_DATA_TEST_SUBJ); } diff --git a/tsconfig.base.json b/tsconfig.base.json index 0f694bcce75f28..fef61739470312 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1378,6 +1378,8 @@ "@kbn/search-examples-plugin/*": ["examples/search_examples/*"], "@kbn/search-index-documents": ["packages/kbn-search-index-documents"], "@kbn/search-index-documents/*": ["packages/kbn-search-index-documents/*"], + "@kbn/search-notebooks": ["x-pack/plugins/search_notebooks"], + "@kbn/search-notebooks/*": ["x-pack/plugins/search_notebooks/*"], "@kbn/search-playground": ["x-pack/plugins/search_playground"], "@kbn/search-playground/*": ["x-pack/plugins/search_playground/*"], "@kbn/search-response-warnings": ["packages/kbn-search-response-warnings"], @@ -1582,6 +1584,8 @@ "@kbn/shared-ux-storybook-config/*": ["packages/shared-ux/storybook/config/*"], "@kbn/shared-ux-storybook-mock": ["packages/shared-ux/storybook/mock"], "@kbn/shared-ux-storybook-mock/*": ["packages/shared-ux/storybook/mock/*"], + "@kbn/shared-ux-tabbed-modal": ["packages/shared-ux/modal/tabbed"], + "@kbn/shared-ux-tabbed-modal/*": ["packages/shared-ux/modal/tabbed/*"], "@kbn/shared-ux-utility": ["packages/kbn-shared-ux-utility"], "@kbn/shared-ux-utility/*": ["packages/kbn-shared-ux-utility/*"], "@kbn/slo-plugin": ["x-pack/plugins/observability_solution/slo"], diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index 04e968a7f9b5cf..98a4912804d1e0 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -107,6 +107,7 @@ ], "xpack.runtimeFields": "plugins/runtime_fields", "xpack.screenshotting": "plugins/screenshotting", + "xpack.searchNotebooks": "plugins/search_notebooks", "xpack.searchPlayground": "plugins/search_playground", "xpack.searchProfiler": "plugins/searchprofiler", "xpack.security": "plugins/security", diff --git a/x-pack/packages/ml/trained_models_utils/index.ts b/x-pack/packages/ml/trained_models_utils/index.ts index b9ad2e2ae4d4ea..ada09d62af0724 100644 --- a/x-pack/packages/ml/trained_models_utils/index.ts +++ b/x-pack/packages/ml/trained_models_utils/index.ts @@ -19,6 +19,7 @@ export { type ModelDefinition, type ModelDefinitionResponse, type ElserVersion, + type InferenceAPIConfigResponse, type GetModelDownloadConfigOptions, type ElasticCuratedModelName, ELSER_ID_V1, diff --git a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts index 395b8640e46610..eb1c0442fd8d8c 100644 --- a/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts +++ b/x-pack/packages/ml/trained_models_utils/src/constants/trained_models.ts @@ -177,3 +177,37 @@ export type ElserVersion = 1 | 2; export interface GetModelDownloadConfigOptions { version?: ElserVersion; } + +export type InferenceServiceSettings = + | { + service: 'elser'; + service_settings: { + num_allocations: number; + num_threads: number; + model_id: string; + }; + } + | { + service: 'openai'; + service_settings: { + api_key: string; + organization_id: string; + url: string; + }; + } + | { + service: 'hugging_face'; + service_settings: { + api_key: string; + url: string; + }; + }; + +export type InferenceAPIConfigResponse = { + // Refers to a deployment id + model_id: string; + task_type: 'sparse_embedding' | 'text_embedding'; + task_settings: { + model?: string; + }; +} & InferenceServiceSettings; 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 972a662706c479..c243d1802992a1 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 @@ -2921,6 +2921,49 @@ Object { ], "type": "string", }, + "headers": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "key": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "value": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "name": "entries", + }, + ], + "type": "record", + }, }, "preferences": Object { "stripUnknown": Object { @@ -2990,6 +3033,49 @@ Object { ], "type": "string", }, + "headers": Object { + "flags": Object { + "default": [Function], + "error": [Function], + "presence": "optional", + }, + "rules": Array [ + Object { + "args": Object { + "key": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + "value": Object { + "flags": Object { + "error": [Function], + }, + "rules": Array [ + Object { + "args": Object { + "method": [Function], + }, + "name": "custom", + }, + ], + "type": "string", + }, + }, + "name": "entries", + }, + ], + "type": "record", + }, }, "preferences": Object { "stripUnknown": Object { diff --git a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap index 06f4835d20f776..790e3f71e071c8 100644 --- a/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap +++ b/x-pack/plugins/alerting/server/integration_tests/__snapshots__/alert_as_data_fields.test.ts.snap @@ -88,6 +88,10 @@ Object { "required": false, "type": "keyword", }, + "container.id": Object { + "required": false, + "type": "keyword", + }, "error.grouping_key": Object { "required": false, "type": "keyword", @@ -96,6 +100,10 @@ Object { "required": false, "type": "keyword", }, + "host.name": Object { + "required": false, + "type": "keyword", + }, "kibana.alert.context": Object { "array": false, "required": false, @@ -172,6 +180,10 @@ Object { "required": false, "type": "keyword", }, + "container.id": Object { + "required": false, + "type": "keyword", + }, "error.grouping_key": Object { "required": false, "type": "keyword", @@ -180,6 +192,10 @@ Object { "required": false, "type": "keyword", }, + "host.name": Object { + "required": false, + "type": "keyword", + }, "kibana.alert.context": Object { "array": false, "required": false, @@ -256,6 +272,10 @@ Object { "required": false, "type": "keyword", }, + "container.id": Object { + "required": false, + "type": "keyword", + }, "error.grouping_key": Object { "required": false, "type": "keyword", @@ -264,6 +284,10 @@ Object { "required": false, "type": "keyword", }, + "host.name": Object { + "required": false, + "type": "keyword", + }, "kibana.alert.context": Object { "array": false, "required": false, @@ -340,6 +364,10 @@ Object { "required": false, "type": "keyword", }, + "container.id": Object { + "required": false, + "type": "keyword", + }, "error.grouping_key": Object { "required": false, "type": "keyword", @@ -348,6 +376,10 @@ Object { "required": false, "type": "keyword", }, + "host.name": Object { + "required": false, + "type": "keyword", + }, "kibana.alert.context": Object { "array": false, "required": false, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx index 9ad4ef51ca04ca..fd1e2415d05891 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/markdown/index.tsx @@ -11,7 +11,7 @@ import { CoreTheme } from '@kbn/core/public'; import { Observable } from 'rxjs'; import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { defaultTheme$ } from '@kbn/presentation-util-plugin/common'; -import { Markdown } from '@kbn/shared-ux-markdown'; +import { Markdown } from '@kbn/kibana-react-plugin/public'; import { StartInitializer } from '../../plugin'; import { RendererStrings } from '../../../i18n'; import { Return as Config } from '../../functions/browser/markdown'; @@ -29,24 +29,20 @@ export const getMarkdownRenderer = render(domNode, config, handlers) { const fontStyle = config.font ? config.font.spec : {}; - if (config.content) { - ReactDOM.render( - - - {config.content} - - , - domNode, - () => handlers.done() - ); + ReactDOM.render( + + + , + domNode, + () => handlers.done() + ); - handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); - } + handlers.onDestroy(() => ReactDOM.unmountComponentAtNode(domNode)); }, }); diff --git a/x-pack/plugins/canvas/tsconfig.json b/x-pack/plugins/canvas/tsconfig.json index 82fff09531bdf9..1af291ec89e8a4 100644 --- a/x-pack/plugins/canvas/tsconfig.json +++ b/x-pack/plugins/canvas/tsconfig.json @@ -87,7 +87,6 @@ "@kbn/reporting-server", "@kbn/reporting-export-types-pdf-common", "@kbn/code-editor", - "@kbn/shared-ux-markdown", "@kbn/presentation-containers", "@kbn/presentation-publishing", ], diff --git a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx index 479b8e39d232da..d84675d8e78836 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/suggest_users_popover.test.tsx @@ -18,7 +18,9 @@ import type { AssigneeWithProfile } from '../../user_profiles/types'; jest.mock('../../../containers/user_profiles/api'); -describe('SuggestUsersPopover', () => { +// FLAKY: https://github.com/elastic/kibana/issues/171600 +// FLAKY: https://github.com/elastic/kibana/issues/171601 +describe.skip('SuggestUsersPopover', () => { let appMockRender: AppMockRenderer; let defaultProps: SuggestUsersPopoverProps; diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.test.tsx b/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.test.tsx index a32ece05eac749..6742242b71fb25 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.test.tsx +++ b/x-pack/plugins/cases/public/components/visualizations/actions/add_to_existing_case.test.tsx @@ -110,7 +110,7 @@ describe('createAddToExistingCaseLensAction', () => { }); test('it should return display name', () => { - expect(action.getDisplayName(context)).toEqual('Add to existing case'); + expect(action.getDisplayName(context)).toEqual('Add to case'); }); it('should return icon type', () => { diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.test.tsx b/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.test.tsx deleted file mode 100644 index 3549ca3301d189..00000000000000 --- a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.test.tsx +++ /dev/null @@ -1,207 +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 { LENS_EMBEDDABLE_TYPE, type Embeddable as LensEmbeddable } from '@kbn/lens-plugin/public'; -import { ErrorEmbeddable } from '@kbn/embeddable-plugin/public'; -import type { Action } from '@kbn/ui-actions-plugin/public'; -import { waitFor } from '@testing-library/react'; - -import { createAddToNewCaseLensAction } from './add_to_new_case'; -import type { ActionContext } from './types'; -import { useCasesAddToNewCaseFlyout } from '../../create/flyout/use_cases_add_to_new_case_flyout'; -import React from 'react'; -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; -import { - getMockApplications$, - getMockCaseUiActionProps, - getMockCurrentAppId$, - mockAttributes, - MockEmbeddable, - mockTimeRange, -} from './mocks'; -import ReactDOM, { unmountComponentAtNode } from 'react-dom'; -import { useKibana } from '../../../common/lib/kibana'; -import { canUseCases } from '../../../client/helpers/can_use_cases'; -import { getCaseOwnerByAppId } from '../../../../common/utils/owner'; - -const element = document.createElement('div'); -document.body.appendChild(element); - -jest.mock('@kbn/kibana-react-plugin/public', () => ({ - toMountPoint: jest.fn(), -})); - -jest.mock('../../../common/lib/kibana', () => { - return { - useKibana: jest.fn(), - KibanaContextProvider: jest - .fn() - .mockImplementation(({ children, ...props }) =>
{children}
), - }; -}); - -jest.mock('../../create/flyout/use_cases_add_to_new_case_flyout', () => ({ - useCasesAddToNewCaseFlyout: jest.fn(), -})); - -jest.mock('../../../client/helpers/can_use_cases', () => { - const actual = jest.requireActual('../../../client/helpers/can_use_cases'); - return { - ...actual, - canUseCases: jest.fn(), - }; -}); - -jest.mock('react-dom', () => { - const original = jest.requireActual('react-dom'); - return { ...original, unmountComponentAtNode: jest.fn() }; -}); - -jest.mock('./action_wrapper'); - -jest.mock('../../../../common/utils/owner', () => ({ - getCaseOwnerByAppId: jest.fn().mockReturnValue('securitySolution'), -})); - -describe('createAddToNewCaseLensAction', () => { - const mockEmbeddable = new MockEmbeddable(LENS_EMBEDDABLE_TYPE, { - id: 'mockId', - attributes: mockAttributes, - timeRange: mockTimeRange, - }) as unknown as LensEmbeddable; - - const context = { - embeddable: mockEmbeddable, - } as unknown as ActionContext; - - const caseUiActionProps = getMockCaseUiActionProps(); - - const mockUseCasesAddToNewCaseFlyout = useCasesAddToNewCaseFlyout as jest.Mock; - const mockOpenFlyout = jest.fn(); - const mockMount = jest.fn(); - let action: Action; - const mockCasePermissions = jest.fn(); - - beforeEach(() => { - jest.clearAllMocks(); - mockUseCasesAddToNewCaseFlyout.mockReturnValue({ - open: mockOpenFlyout, - }); - - (useKibana as jest.Mock).mockReturnValue({ - services: { - application: { - currentAppId$: getMockCurrentAppId$(), - applications$: getMockApplications$(), - }, - }, - }); - - (canUseCases as jest.Mock).mockReturnValue( - mockCasePermissions.mockReturnValue({ create: true, update: true }) - ); - - (toMountPoint as jest.Mock).mockImplementation((node) => { - ReactDOM.render(node, element); - return mockMount; - }); - - jest.clearAllMocks(); - action = createAddToNewCaseLensAction(caseUiActionProps); - }); - - test('it should return display name', () => { - expect(action.getDisplayName(context)).toEqual('Add to new case'); - }); - - it('should return icon type', () => { - expect(action.getIconType(context)).toEqual('casesApp'); - }); - - describe('isCompatible', () => { - it('should return false if error embeddable', async () => { - expect( - await action.isCompatible({ - ...context, - embeddable: new ErrorEmbeddable('some error', { - id: '123', - }) as unknown as LensEmbeddable, - }) - ).toEqual(false); - }); - - it('should return false if not lens embeddable', async () => { - expect( - await action.isCompatible({ - ...context, - embeddable: new MockEmbeddable('not_lens') as unknown as LensEmbeddable, - }) - ).toEqual(false); - }); - - it('should return false if no permission', async () => { - mockCasePermissions.mockReturnValue({ create: false, update: false }); - expect(await action.isCompatible(context)).toEqual(false); - }); - - it('should return true if is lens embeddable', async () => { - expect(await action.isCompatible(context)).toEqual(true); - }); - - it('should check permission with undefined if owner is not found', async () => { - (getCaseOwnerByAppId as jest.Mock).mockReturnValue(undefined); - await action.isCompatible(context); - expect(mockCasePermissions).toBeCalledWith(undefined); - }); - }); - - describe('execute', () => { - beforeEach(async () => { - await action.execute(context); - }); - - it('should execute', () => { - expect(toMountPoint).toHaveBeenCalled(); - expect(mockMount).toHaveBeenCalled(); - }); - }); - - describe('Add to new case flyout', () => { - beforeEach(async () => { - await action.execute(context); - }); - - it('should open flyout', async () => { - await waitFor(() => { - expect(mockOpenFlyout).toHaveBeenCalledWith({ - attachments: [ - { - persistableStateAttachmentState: { - attributes: mockAttributes, - timeRange: mockTimeRange, - }, - persistableStateAttachmentTypeId: '.lens', - type: 'persistableState', - }, - ], - }); - }); - }); - - it('should have correct onClose handler', () => { - const onClose = mockUseCasesAddToNewCaseFlyout.mock.calls[0][0].onClose; - onClose(); - expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); - }); - - it('should have correct onSuccess handler', () => { - const onSuccess = mockUseCasesAddToNewCaseFlyout.mock.calls[0][0].onSuccess; - onSuccess(); - expect(unmountComponentAtNode as jest.Mock).toHaveBeenCalled(); - }); - }); -}); diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx b/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx deleted file mode 100644 index 269b38dc4e3b93..00000000000000 --- a/x-pack/plugins/cases/public/components/visualizations/actions/add_to_new_case.tsx +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import React, { useEffect, useMemo } from 'react'; -import { unmountComponentAtNode } from 'react-dom'; - -import { createAction } from '@kbn/ui-actions-plugin/public'; -import { isErrorEmbeddable } from '@kbn/embeddable-plugin/public'; - -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; -import type { Embeddable as LensEmbeddable } from '@kbn/lens-plugin/public'; -import { getCaseOwnerByAppId } from '../../../../common/utils/owner'; -import { hasInput, isLensEmbeddable, getLensCaseAttachment } from './utils'; - -import type { ActionContext, CasesUIActionProps } from './types'; -import { ADD_TO_CASE_SUCCESS, ADD_TO_NEW_CASE_DISPLAYNAME } from './translations'; -import { useCasesAddToNewCaseFlyout } from '../../create/flyout/use_cases_add_to_new_case_flyout'; -import { ActionWrapper } from './action_wrapper'; -import { canUseCases } from '../../../client/helpers/can_use_cases'; - -export const ACTION_ID = 'embeddable_addToNewCase'; -export const DEFAULT_DARK_MODE = 'theme:darkMode' as const; - -interface Props { - embeddable: LensEmbeddable; - onSuccess: () => void; - onClose: () => void; -} - -const AddToNewCaseFlyoutWrapper: React.FC = ({ embeddable, onClose, onSuccess }) => { - const { timeRange } = embeddable.getInput(); - const attributes = embeddable.getFullAttributes(); - const createNewCaseFlyout = useCasesAddToNewCaseFlyout({ - onClose, - onSuccess, - toastContent: ADD_TO_CASE_SUCCESS, - }); - - // we've checked attributes exists before rendering (isCompatible), attributes should not be undefined here - const attachments = useMemo( - () => (attributes != null ? [getLensCaseAttachment({ attributes, timeRange })] : []), - [attributes, timeRange] - ); - - useEffect(() => { - createNewCaseFlyout.open({ attachments }); - }, [attachments, createNewCaseFlyout]); - - return null; -}; - -AddToNewCaseFlyoutWrapper.displayName = 'AddToNewCaseFlyoutWrapper'; - -export const createAddToNewCaseLensAction = ({ - core, - plugins, - storage, - history, - caseContextProps, -}: CasesUIActionProps) => { - const { application: applicationService, theme } = core; - - let currentAppId: string | undefined; - - applicationService?.currentAppId$.subscribe((appId) => { - currentAppId = appId; - }); - - return createAction({ - id: ACTION_ID, - type: 'actionButton', - getIconType: () => 'casesApp', - getDisplayName: () => ADD_TO_NEW_CASE_DISPLAYNAME, - isCompatible: async ({ embeddable }) => { - const owner = getCaseOwnerByAppId(currentAppId); - const casePermissions = canUseCases(applicationService.capabilities)( - owner ? [owner] : undefined - ); - - return ( - !isErrorEmbeddable(embeddable) && - isLensEmbeddable(embeddable) && - casePermissions.update && - casePermissions.create && - hasInput(embeddable) - ); - }, - execute: async ({ embeddable }) => { - const targetDomElement = document.createElement('div'); - - const cleanupDom = () => { - if (targetDomElement != null) { - unmountComponentAtNode(targetDomElement); - } - }; - - const onFlyoutClose = () => { - cleanupDom(); - }; - - const mount = toMountPoint( - - - , - { theme$: theme.theme$ } - ); - - mount(targetDomElement); - }, - }); -}; diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/register.ts b/x-pack/plugins/cases/public/components/visualizations/actions/register.ts index f470a0a34fdcdd..70d0d6d7a84d4d 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/register.ts +++ b/x-pack/plugins/cases/public/components/visualizations/actions/register.ts @@ -7,7 +7,6 @@ import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; -import { createAddToNewCaseLensAction } from './add_to_new_case'; import { createAddToExistingCaseLensAction } from './add_to_existing_case'; import type { CasesUIActionProps } from './types'; @@ -28,15 +27,6 @@ const registerLensActions = ({ history, storage, }: CasesUIActionProps) => { - const addToNewCaseAction = createAddToNewCaseLensAction({ - core, - plugins, - caseContextProps, - history, - storage, - }); - plugins.uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, addToNewCaseAction); - const addToExistingCaseAction = createAddToExistingCaseLensAction({ core, plugins, diff --git a/x-pack/plugins/cases/public/components/visualizations/actions/translations.ts b/x-pack/plugins/cases/public/components/visualizations/actions/translations.ts index ed7ee1370d8753..1039700ba67aeb 100644 --- a/x-pack/plugins/cases/public/components/visualizations/actions/translations.ts +++ b/x-pack/plugins/cases/public/components/visualizations/actions/translations.ts @@ -14,16 +14,9 @@ export const ADD_TO_CASE_SUCCESS = i18n.translate( } ); -export const ADD_TO_NEW_CASE_DISPLAYNAME = i18n.translate( - 'xpack.cases.actions.visualizationActions.addToNewCase.displayName', - { - defaultMessage: 'Add to new case', - } -); - export const ADD_TO_EXISTING_CASE_DISPLAYNAME = i18n.translate( 'xpack.cases.actions.visualizationActions.addToExistingCase.displayName', { - defaultMessage: 'Add to existing case', + defaultMessage: 'Add to case', } ); diff --git a/x-pack/plugins/cases/server/services/user_actions/test_utils.ts b/x-pack/plugins/cases/server/services/user_actions/test_utils.ts index 5e7ca3971b0c23..3006faf916bd09 100644 --- a/x-pack/plugins/cases/server/services/user_actions/test_utils.ts +++ b/x-pack/plugins/cases/server/services/user_actions/test_utils.ts @@ -52,7 +52,7 @@ export const createUserActionFindSO = ( }); export const createConnectorUserAction = ( - overrides?: Partial + overrides?: Partial> ): SavedObject => { const { id, ...restConnector } = createConnectorObject().connector; return { @@ -146,7 +146,7 @@ export const createUserActionSO = ({ export const updateConnectorUserAction = ({ overrides, }: { - overrides?: Partial; + overrides?: Partial>; } = {}): SavedObject => { const { id, ...restConnector } = createJiraConnector(); return { @@ -163,7 +163,7 @@ export const updateConnectorUserAction = ({ export const pushConnectorUserAction = ({ overrides, }: { - overrides?: Partial; + overrides?: Partial>; } = {}): SavedObject => { const { connector_id: connectorId, ...restExternalService } = createExternalService(); return { diff --git a/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc b/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc index 660f6e64a24464..a8dbc9b23af630 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc +++ b/x-pack/plugins/cloud_integrations/cloud_links/kibana.jsonc @@ -12,9 +12,7 @@ "security", "guidedOnboarding" ], - "requiredBundles": [ - "kibanaReact" - ], + "requiredBundles": [], "requiredPlugins": [ "share" ] diff --git a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx index 20085172b2c688..731dc6768c48f8 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx +++ b/x-pack/plugins/cloud_integrations/cloud_links/public/maybe_add_cloud_links/theme_darkmode_toggle.tsx @@ -19,7 +19,7 @@ import type { SecurityPluginStart } from '@kbn/security-plugin/public'; import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { UserProfilesKibanaProvider } from '@kbn/user-profile-components'; import { CoreStart } from '@kbn/core-lifecycle-browser'; -import { toMountPoint } from '@kbn/kibana-react-plugin/public'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import { useThemeDarkmodeToggle } from './theme_darkmode_hook'; diff --git a/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json b/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json index 43f411cadf060d..b7759fb7f1c5eb 100644 --- a/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json +++ b/x-pack/plugins/cloud_integrations/cloud_links/tsconfig.json @@ -22,7 +22,6 @@ "@kbn/core-ui-settings-browser", "@kbn/user-profile-components", "@kbn/core-lifecycle-browser", - "@kbn/kibana-react-plugin", "@kbn/share-plugin", "@kbn/cloud", "@kbn/react-kibana-mount", diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts deleted file mode 100644 index a3b81fa0a5e162..00000000000000 --- a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_belongs_to_runtime_mapping.ts +++ /dev/null @@ -1,48 +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 { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/types'; - -/** - * Creates the `belongs_to` runtime field with the value of either - * `account.cloud.name` or `cluster.id` based on the value of `rule.benchmark.posture_type` - */ -export const getBelongsToRuntimeMapping = (): MappingRuntimeFields => ({ - belongs_to: { - type: 'keyword', - script: { - source: ` - def postureTypeAvailable = doc.containsKey("rule.benchmark.posture_type") && - !doc["rule.benchmark.posture_type"].empty; - def orchestratorIdAvailable = doc.containsKey("orchestrator.cluster.id") && - !doc["orchestrator.cluster.id"].empty; - - if (!postureTypeAvailable) { - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } else { - def policy_template_type = doc["rule.benchmark.posture_type"].value; - - if (policy_template_type == "cspm") { - def belongs_to = doc["cloud.account.name"].value; - emit(belongs_to); - } else if (policy_template_type == "kspm") { - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } else { - // Default behaviour when policy_template_type is unknown - def belongs_to = orchestratorIdAvailable ? - doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; - emit(belongs_to); - } - } - `, - }, - }, -}); diff --git a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts index e077574d449ecf..82137a3dafffb3 100644 --- a/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts +++ b/x-pack/plugins/cloud_security_posture/common/runtime_mappings/get_identifier_runtime_mapping.ts @@ -20,6 +20,8 @@ export const getIdentifierRuntimeMapping = (): MappingRuntimeFields => ({ !doc["rule.benchmark.posture_type"].empty; def orchestratorIdAvailable = doc.containsKey("orchestrator.cluster.id") && !doc["orchestrator.cluster.id"].empty; + def cloudAccountIdAvailable = doc.containsKey("cloud.account.id") && !doc["cloud.account.id"].empty && + doc["cloud.account.id"].value != ""; if (!postureTypeAvailable) { def identifier = orchestratorIdAvailable ? doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; @@ -28,7 +30,13 @@ export const getIdentifierRuntimeMapping = (): MappingRuntimeFields => ({ def policy_template_type = doc["rule.benchmark.posture_type"].value; if (policy_template_type == "cspm") { - emit(doc["cloud.account.id"].value); + // Checking for emptiness due to backwards compatibility with 8.13 + // where cloud.account.id was not available and no field was eligible for asset identifier + if (cloudAccountIdAvailable) { + emit(doc["cloud.account.id"].value); + } else { + return; + } } else if (policy_template_type == "kspm") { def identifier = orchestratorIdAvailable ? doc["orchestrator.cluster.id"].value : doc["cluster_id"].value; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index 2c6bd8074a6892..6fd7d7602ebec5 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -7,7 +7,6 @@ import { apiHasDynamicActions, - embeddableEnhancedDrilldownGrouping, type HasDynamicActions, } from '@kbn/embeddable-enhanced-plugin/public'; import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; @@ -59,7 +58,6 @@ export class FlyoutCreateDrilldownAction implements Action public readonly type = OPEN_FLYOUT_ADD_DRILLDOWN; public readonly id = OPEN_FLYOUT_ADD_DRILLDOWN; public order = 12; - public grouping = embeddableEnhancedDrilldownGrouping; constructor(protected readonly params: OpenFlyoutAddDrilldownParams) {} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx index bf5588e7625749..a6f08d9921ca55 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx @@ -26,7 +26,6 @@ import { import { CONTEXT_MENU_TRIGGER } from '@kbn/embeddable-plugin/public'; import { apiHasDynamicActions, - embeddableEnhancedDrilldownGrouping, type HasDynamicActions, } from '@kbn/embeddable-enhanced-plugin/public'; import { StartServicesGetter } from '@kbn/kibana-utils-plugin/public'; @@ -54,7 +53,6 @@ export class FlyoutEditDrilldownAction implements Action { public readonly type = OPEN_FLYOUT_EDIT_DRILLDOWN; public readonly id = OPEN_FLYOUT_EDIT_DRILLDOWN; public order = 10; - public grouping = embeddableEnhancedDrilldownGrouping; constructor(protected readonly params: FlyoutEditDrilldownParams) {} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx index b3f06abf72e122..74a71347b41f01 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/components/agent_policy_create_inline.tsx @@ -114,7 +114,7 @@ export const AgentPolicyCreateInlineForm: React.FunctionComponent = ({ ) : ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.test.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.test.tsx index 0321f9f8310558..d0a2b371404f4c 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.test.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.test.tsx @@ -15,8 +15,11 @@ import { MultiTextInput } from './multi_text_input'; function renderInput(value = ['value1']) { const renderer = createFleetTestRendererMock(); const mockOnChange = jest.fn(); + const fieldLabel = 'Hosts'; - const utils = renderer.render(); + const utils = renderer.render( + + ); return { utils, mockOnChange }; } @@ -61,7 +64,9 @@ test('it should allow to remove a row', async () => { const { utils, mockOnChange } = renderInput(['value1', 'value2']); await act(async () => { - const deleteRowEl = await utils.container.querySelector('[aria-label="Delete row"]'); + const deleteRowEl = await utils.container.querySelector( + `[aria-label='Delete "Hosts" input 1']` + ); if (!deleteRowEl) { throw new Error('Delete row button not found'); } diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.tsx index ebcf666d247102..ba17c3081f9359 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/steps/components/multi_text_input.tsx @@ -21,6 +21,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; interface Props { value: string[]; onChange: (newValue: string[]) => void; + fieldLabel: string; onBlur?: () => void; errors?: Array<{ message: string; index?: number }>; isInvalid?: boolean; @@ -30,6 +31,7 @@ interface Props { interface RowProps { index: number; + fieldLabel: string; value: string; onChange: (index: number, value: string) => void; onDelete: (index: number) => void; @@ -42,6 +44,7 @@ interface RowProps { const Row: FunctionComponent = ({ index, value, + fieldLabel, onChange, onDelete, onBlur, @@ -81,7 +84,11 @@ const Row: FunctionComponent = ({ iconType="cross" disabled={isDisabled} aria-label={i18n.translate('xpack.fleet.multiTextInput.deleteRowButton', { - defaultMessage: 'Delete row', + defaultMessage: 'Delete "{fieldLabel}" input {index}', + values: { + fieldLabel, + index: index + 1, + }, })} /> @@ -95,6 +102,7 @@ function defaultValue(value: string[]) { } export const MultiTextInput: FunctionComponent = ({ + fieldLabel, value, onChange, onBlur, @@ -147,6 +155,7 @@ export const MultiTextInput: FunctionComponent = ({ setIsDirty(true)} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/add_first_integration_splash.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/add_first_integration_splash.tsx index 7dbfae011d64f1..f620e74c2be02e 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/add_first_integration_splash.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/multi_page_layout/components/add_first_integration_splash.tsx @@ -97,13 +97,13 @@ const AddIntegrationStepsIllustrations = () => {
- -

+ +

-

+

{
- -

+ +

-

+

{
- -

+ +

-

+

{ }); expect(window.open).toHaveBeenCalledWith('https://google.com', '_blank'); }); + + it.each([true, false])( + 'renders card with a badge when quickstart flag is enabled', + async (isQuickstart) => { + const { + utils: { queryByTitle }, + } = renderPackageCard({ + id: 'card-1', + url: 'https://google.com', + fromIntegrations: 'installed', + title: 'System', + description: 'System', + isQuickstart, + } as PackageCardProps); + const badgeElement = await queryByTitle('Quickstart'); + expect(!!badgeElement).toEqual(isQuickstart); + } + ); }); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx index 2177f8e21436ca..5618cc918bb717 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_card.tsx @@ -11,6 +11,7 @@ import { EuiBadge, EuiCard, EuiFlexGroup, EuiFlexItem, EuiSpacer, EuiToolTip } f import { TrackApplicationView } from '@kbn/usage-collection-plugin/public'; +import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { @@ -29,8 +30,9 @@ export type PackageCardProps = IntegrationCardItem; // Min-height is roughly 3 lines of content. // This keeps the cards from looking overly unbalanced because of content differences. -const Card = styled(EuiCard)` +const Card = styled(EuiCard)<{ isquickstart?: boolean }>` min-height: 127px; + border-color: ${({ isquickstart }) => (isquickstart ? '#ba3d76' : null)}; `; export function PackageCard({ @@ -49,6 +51,8 @@ export function PackageCard({ isUpdateAvailable, showLabels = true, extraLabelsBadges, + isQuickstart = false, + onCardClick: onClickProp = undefined, }: PackageCardProps) { let releaseBadge: React.ReactNode | null = null; @@ -144,6 +148,8 @@ export function PackageCard({ } - onClick={onCardClick} + onClick={onClickProp ?? onCardClick} > {showLabels && extraLabelsBadges ? extraLabelsBadges : null} @@ -172,3 +178,14 @@ export function PackageCard({ ); } + +function quickstartBadge(isQuickstart: boolean): { label: string; color: 'accent' } | undefined { + return isQuickstart + ? { + label: i18n.translate('xpack.fleet.packageCard.quickstartBadge.label', { + defaultMessage: 'Quickstart', + }), + color: 'accent', + } + : undefined; +} diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/grid.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/grid.tsx index 214ce24463e547..21cdf57c0d50f9 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/grid.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/grid.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useRef, useEffect } from 'react'; +import React, { useCallback, useRef, useEffect, forwardRef } from 'react'; import { css } from '@emotion/react'; import { EuiFlexGrid, EuiFlexItem, EuiSpacer, EuiText, EuiAutoSizer } from '@elastic/eui'; import { VariableSizeList as List } from 'react-window'; @@ -47,6 +47,8 @@ const VirtualizedRow: React.FC<{ ); }; +const CARD_OFFSET = 16; + export const GridColumn = ({ list, showMissingIntegrationMessage = false, @@ -105,6 +107,17 @@ export const GridColumn = ({ ref={listRef} layout="vertical" itemCount={Math.ceil(list.length / 3)} + innerElementType={forwardRef(({ style, children, ...rest }, ref) => ( +
+ {children} +
+ ))} itemSize={(index) => { const test = itemsSizeRefs.current.get(index) ?? 200; @@ -116,7 +129,13 @@ export const GridColumn = ({ > {({ index, style }) => { return ( - + {list.slice(index * 3, index * 3 + 3).map((item) => { return ( diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.stories.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.stories.tsx index 8aabb1771680ab..0cfb8049800080 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.stories.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.stories.tsx @@ -17,12 +17,17 @@ export default { title: 'Sections/EPM/Package List Grid', }; -type Args = Pick; +type Args = Pick< + Props, + 'title' | 'isLoading' | 'showMissingIntegrationMessage' | 'showControls' | 'showSearchTools' +>; const args: Args = { title: 'Installed integrations', isLoading: false, showMissingIntegrationMessage: false, + showControls: true, + showSearchTools: true, }; const categories = [ { diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.tsx index fee2a12974c695..0ff1a708dabc2b 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/components/package_list_grid/index.tsx @@ -67,6 +67,8 @@ export interface Props { selectedSubCategory?: string; setSelectedSubCategory?: (c: string | undefined) => void; showMissingIntegrationMessage?: boolean; + showControls?: boolean; + showSearchTools?: boolean; } export const PackageListGrid: FunctionComponent = ({ @@ -87,6 +89,8 @@ export const PackageListGrid: FunctionComponent = ({ showMissingIntegrationMessage = false, callout, showCardLabels = true, + showControls = true, + showSearchTools = true, }) => { const localSearchRef = useLocalSearch(list, !!isLoading); @@ -174,23 +178,29 @@ export const PackageListGrid: FunctionComponent = ({ gutterSize="xl" data-test-subj="epmList.integrationCards" > - - - + {showControls && ( + + + + )} + - - - + {showSearchTools && ( + + + + )} + {showIntegrationsSubcategories && availableSubCategories?.length ? : null} {showIntegrationsSubcategories ? ( @@ -257,7 +267,7 @@ export const PackageListGrid: FunctionComponent = ({ {callout} ) : null} - + void; } export const mapToCard = ({ diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx index 310f441b042456..a3216d9c684042 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/agent_policy_selection.tsx @@ -80,7 +80,7 @@ export const AgentPolicySelection: React.FC = (props) => { ) : ( diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx index a0828bb72f4890..972fb4f2b5df3a 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/steps/agent_policy_selection_step.tsx @@ -34,7 +34,7 @@ export const AgentPolicySelectionStep = ({ }): EuiContainedStepProps => { return { title: i18n.translate('xpack.fleet.agentEnrollment.stepChooseAgentPolicyTitle', { - defaultMessage: 'What type of host are you adding?', + defaultMessage: 'What type of host do you want to monitor?', }), children: ( <> diff --git a/x-pack/plugins/fleet/public/index.ts b/x-pack/plugins/fleet/public/index.ts index 1efc18a53e1e8a..003e3de3f35dd3 100644 --- a/x-pack/plugins/fleet/public/index.ts +++ b/x-pack/plugins/fleet/public/index.ts @@ -64,3 +64,12 @@ export { PackagePolicyEditorDatastreamMappings } from './applications/fleet/sect export type { PackagePolicyEditorDatastreamMappingsProps } from './applications/fleet/sections/agent_policy/create_package_policy_page/components/datastream_mappings'; export type { DynamicPagePathValues } from './constants'; + +export const PackageList = () => { + return import('./applications/integrations/sections/epm/components/package_list_grid'); +}; +export const AvailablePackagesHook = () => { + return import( + './applications/integrations/sections/epm/screens/home/hooks/use_available_packages' + ); +}; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx index 94681672dfc018..ba9dce4d8ced6b 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/index_details_page/index_details_page.test.tsx @@ -577,6 +577,44 @@ describe('', () => { JSON.stringify({ mappings: mockIndexMappingResponse }, null, 2) ); }); + + it('can add a semantic_text field and can save mappings', async () => { + const mockIndexMappingResponseForSemanticText: any = { + ...testIndexMappings.mappings, + properties: { + ...testIndexMappings.mappings.properties, + sem: { + type: 'semantic_text', + inference_id: 'my-elser', + }, + }, + }; + httpRequestsMockHelpers.setLoadIndexMappingResponse(testIndexName, { + mappings: mockIndexMappingResponseForSemanticText, + }); + await testBed.actions.mappings.addNewMappingFieldNameAndType([ + { name: 'sem', type: 'semantic_text' }, + ]); + await testBed.actions.mappings.clickSaveMappingsButton(); + // add field button is available again + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + expect(testBed.find('semField-datatype').props()['data-type-value']).toBe('semantic_text'); + expect(httpSetup.get).toHaveBeenCalledTimes(5); + expect(httpSetup.get).toHaveBeenLastCalledWith( + `${API_BASE_PATH}/mapping/${testIndexName}`, + requestOptions + ); + // refresh mappings and page re-renders + expect(testBed.exists('indexDetailsMappingsAddField')).toBe(true); + expect(testBed.actions.mappings.isSearchBarDisabled()).toBe(false); + const treeViewContent = testBed.actions.mappings.getTreeViewContent('semField'); + expect(treeViewContent).toContain('sem'); + await testBed.actions.mappings.clickToggleViewButton(); + const jsonContent = testBed.actions.mappings.getCodeBlockContent(); + expect(jsonContent).toEqual( + JSON.stringify({ mappings: mockIndexMappingResponseForSemanticText }, null, 2) + ); + }); it('there is a callout with error message when save mappings fail', async () => { const error = { statusCode: 400, diff --git a/x-pack/plugins/index_management/kibana.jsonc b/x-pack/plugins/index_management/kibana.jsonc index 529caf57e3ec0c..84e4a6221c502d 100644 --- a/x-pack/plugins/index_management/kibana.jsonc +++ b/x-pack/plugins/index_management/kibana.jsonc @@ -6,27 +6,9 @@ "id": "indexManagement", "server": true, "browser": true, - "configPath": [ - "xpack", - "index_management" - ], - "requiredPlugins": [ - "home", - "management", - "features", - "share" - ], - "optionalPlugins": [ - "security", - "usageCollection", - "fleet", - "cloud", - "console" - ], - "requiredBundles": [ - "kibanaReact", - "esUiShared", - "runtimeFields" - ] + "configPath": ["xpack", "index_management"], + "requiredPlugins": ["home", "management", "features", "share"], + "optionalPlugins": ["security", "usageCollection", "fleet", "cloud", "ml", "console"], + "requiredBundles": ["kibanaReact", "esUiShared", "runtimeFields"] } } diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts index ca6f8f242d288a..68602acfb409e7 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/api.ts @@ -95,6 +95,13 @@ export const getApi = ( }); } + async function getInferenceModels() { + return sendRequest({ + path: `${apiBasePath}/inference/all`, + method: 'get', + }); + } + async function postDataStreamRollover(name: string) { return sendRequest({ path: `${apiBasePath}/data_streams/${encodeURIComponent(name)}/rollover`, @@ -119,5 +126,6 @@ export const getApi = ( getComponentTemplateDatastreams, postDataStreamRollover, postDataStreamMappingsFromTemplate, + getInferenceModels, }; }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx index 4aeaacd89fa52e..5002a1b5dff727 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx @@ -20,9 +20,18 @@ interface Props { searchResultComponent?: React.ReactElement; onCancelAddingNewFields?: () => void; isAddingFields?: boolean; + isSemanticTextEnabled?: boolean; + indexName?: string; } export const DocumentFields = React.memo( - ({ searchComponent, searchResultComponent, onCancelAddingNewFields, isAddingFields }: Props) => { + ({ + searchComponent, + searchResultComponent, + onCancelAddingNewFields, + isAddingFields, + isSemanticTextEnabled, + indexName, + }: Props) => { const { fields, documentFields } = useMappingsState(); const dispatch = useDispatch(); const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = @@ -44,6 +53,8 @@ export const DocumentFields = React.memo( ); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/inference_id_selects.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/inference_id_selects.tsx new file mode 100644 index 00000000000000..bb823b2ba36b48 --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/inference_id_selects.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import React, { useEffect, useState } from 'react'; + +import type { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { useComponentTemplatesContext } from '../../../../component_templates/component_templates_context'; +import { getFieldConfig } from '../../../lib'; +import { Form, SuperSelectField, UseField, useForm } from '../../../shared_imports'; +import { SuperSelectOption } from '../../../types'; +interface Props { + onChange(value: string): void; + 'data-test-subj'?: string; +} + +interface InferenceModel { + data: InferenceAPIConfigResponse[]; +} + +export const InferenceIdSelects = ({ onChange, 'data-test-subj': dataTestSubj }: Props) => { + const { form } = useForm({ defaultValue: { main: 'elser_model_2' } }); + const { subscribe } = form; + const { api } = useComponentTemplatesContext(); + const [inferenceModels, setInferenceModels] = useState({ data: [] }); + + const fieldConfigModelId = getFieldConfig('inference_id'); + const defaultInferenceIds: SuperSelectOption[] = [ + { value: 'elser_model_2', inputDisplay: 'elser_model_2' }, + { value: 'e5', inputDisplay: 'e5' }, + ]; + + const inferenceIdOptionsFromModels: SuperSelectOption[] = + inferenceModels?.data?.map((model: InferenceAPIConfigResponse) => ({ + value: model.model_id, + inputDisplay: model.model_id, + })) || []; + + const inferenceIdOptions: SuperSelectOption[] = [ + ...defaultInferenceIds, + ...inferenceIdOptionsFromModels, + ]; + + useEffect(() => { + const fetchInferenceModels = async () => { + const models = await api.getInferenceModels(); + setInferenceModels(models); + }; + + fetchInferenceModels(); + }, [api]); + + useEffect(() => { + const subscription = subscribe((updateData) => { + const formData = updateData.data.internal; + const value = formData.main; + onChange(value); + }); + + return subscription.unsubscribe; + }, [subscribe, onChange]); + + return ( +
+ + + + {(field) => ( + + )} + + + + + + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx new file mode 100644 index 00000000000000..e8b939ab81f5da --- /dev/null +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/reference_field_selects.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect } from 'react'; + +import { useLoadIndexMappings } from '../../../../../services'; +import { getFieldConfig } from '../../../lib'; +import { Form, SuperSelectField, UseField, useForm } from '../../../shared_imports'; +import { SuperSelectOption } from '../../../types'; + +interface Props { + onChange(value: string): void; + 'data-test-subj'?: string; + indexName?: string; +} + +export const ReferenceFieldSelects = ({ + onChange, + 'data-test-subj': dataTestSubj, + indexName, +}: Props) => { + const { form } = useForm(); + const { subscribe } = form; + + const { data } = useLoadIndexMappings(indexName ?? ''); + const referenceFieldOptions: SuperSelectOption[] = []; + if (data && data.mappings && data.mappings.properties) { + Object.keys(data.mappings.properties).forEach((key) => { + const field = data.mappings.properties[key]; + if (field.type === 'text') { + referenceFieldOptions.push({ value: key, inputDisplay: key }); + } + }); + } + const fieldConfigReferenceField = getFieldConfig('reference_field'); + + useEffect(() => { + const subscription = subscribe((updateData) => { + const formData = updateData.data.internal; + const value = formData.main; + onChange(value); + }); + + return subscription.unsubscribe; + }, [subscribe, onChange]); + + return ( +
+ + {(field) => ( + + )} + +
+ ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/type_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/type_parameter.tsx index 24bee0dae15a5c..07a3bbb4496941 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/type_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/type_parameter.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useMemo } from 'react'; import { EuiFormRow, EuiComboBox, EuiText, EuiLink } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -23,60 +23,82 @@ interface Props { isRootLevelField: boolean; isMultiField?: boolean | null; showDocLink?: boolean; + isSemanticTextEnabled?: boolean; } -export const TypeParameter = ({ isMultiField, isRootLevelField, showDocLink = false }: Props) => ( - path="type" config={getFieldConfig('type')}> - {(typeField) => { - const error = typeField.getErrorsMessages(); - const isInvalid = error ? Boolean(error.length) : false; +export const TypeParameter = ({ + isMultiField, + isRootLevelField, + showDocLink = false, + isSemanticTextEnabled = false, +}: Props) => { + const fieldTypeOptions = useMemo(() => { + let options = isMultiField + ? filterTypesForMultiField(FIELD_TYPES_OPTIONS) + : isRootLevelField + ? FIELD_TYPES_OPTIONS + : filterTypesForNonRootFields(FIELD_TYPES_OPTIONS); - let docLink = null; - if (showDocLink && typeField.value.length > 0) { - const selectedType = typeField.value[0].value as DataType; - docLink = documentationService.getTypeDocLink(selectedType); - } + if (!isSemanticTextEnabled) { + options = options.filter((option) => option.value !== 'semantic_text'); + } - return ( - - - {i18n.translate('xpack.idxMgmt.mappingsEditor.typeField.documentationLinkLabel', { - defaultMessage: '{typeName} documentation', - values: { - typeName: - typeField.value && typeField.value[0] ? typeField.value[0].label : '', - }, - })} - - - ) : null - } - > - path="type" config={getFieldConfig('type')}> + {(typeField) => { + const error = typeField.getErrorsMessages(); + const isInvalid = error ? Boolean(error.length) : false; + + let docLink = null; + if (showDocLink && typeField.value.length > 0) { + const selectedType = typeField.value[0].value as DataType; + docLink = documentationService.getTypeDocLink(selectedType); + } + + return ( + + + {i18n.translate( + 'xpack.idxMgmt.mappingsEditor.typeField.documentationLinkLabel', + { + defaultMessage: '{typeName} documentation', + values: { + typeName: + typeField.value && typeField.value[0] ? typeField.value[0].label : '', + }, + } + )} + + + ) : null } - selectedOptions={typeField.value} - onChange={typeField.setValue} - isClearable={false} - data-test-subj="fieldType" - /> - - ); - }} - -); + > + + + ); + }} + + ); +}; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx index d4dd3e21d8b36e..d3cae30b457a1b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/create_field/create_field.tsx @@ -5,26 +5,35 @@ * 2.0. */ -import React, { useEffect } from 'react'; import classNames from 'classnames'; +import React, { useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; - import { - EuiButtonEmpty, EuiButton, + EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiOutsideClickDetector, EuiSpacer, } from '@elastic/eui'; +import { FieldWithSemanticTextInfo } from '../../../../types'; -import { useForm, Form, FormDataProvider } from '../../../../shared_imports'; import { EUI_SIZE, TYPE_DEFINITION } from '../../../../constants'; -import { useDispatch } from '../../../../mappings_state_context'; import { fieldSerializer } from '../../../../lib'; -import { Field, NormalizedFields, MainType } from '../../../../types'; -import { NameParameter, TypeParameter, SubTypeParameter } from '../../field_parameters'; +import { useDispatch } from '../../../../mappings_state_context'; +import { + Form, + FormDataProvider, + FormHook, + UseField, + useForm, + useFormData, +} from '../../../../shared_imports'; +import { MainType, NormalizedFields } from '../../../../types'; +import { NameParameter, SubTypeParameter, TypeParameter } from '../../field_parameters'; +import { InferenceIdSelects } from '../../field_parameters/inference_id_selects'; +import { ReferenceFieldSelects } from '../../field_parameters/reference_field_selects'; import { FieldBetaBadge } from '../field_beta_badge'; import { getRequiredParametersFormForType } from './required_parameters_forms'; @@ -39,8 +48,23 @@ interface Props { maxNestedDepth?: number; onCancelAddingNewFields?: () => void; isAddingFields?: boolean; + isSemanticTextEnabled?: boolean; + indexName?: string; } +const useFieldEffect = ( + form: FormHook, + fieldName: string, + setState: React.Dispatch> +) => { + const fieldValue = form.getFields()?.[fieldName]?.value as string; + useEffect(() => { + if (fieldValue !== undefined) { + setState(fieldValue); + } + }, [form, fieldValue, setState]); +}; + export const CreateField = React.memo(function CreateFieldComponent({ allFields, isRootLevelField, @@ -50,14 +74,18 @@ export const CreateField = React.memo(function CreateFieldComponent({ maxNestedDepth, onCancelAddingNewFields, isAddingFields, + isSemanticTextEnabled, + indexName, }: Props) { const dispatch = useDispatch(); - const { form } = useForm({ + const { form } = useForm({ serializer: fieldSerializer, options: { stripEmptyFields: false }, }); + useFormData({ form }); + const { subscribe } = form; useEffect(() => { @@ -76,6 +104,25 @@ export const CreateField = React.memo(function CreateFieldComponent({ } }; + const [referenceFieldComboValue, setReferenceFieldComboValue] = useState(); + const [nameValue, setNameValue] = useState(); + const [inferenceIdComboValue, setInferenceIdComboValue] = useState(); + const [semanticFieldType, setSemanticTextFieldType] = useState(); + + useFieldEffect(form, 'referenceField', setReferenceFieldComboValue); + useFieldEffect(form, 'inferenceId', setInferenceIdComboValue); + useFieldEffect(form, 'name', setNameValue); + + const fieldTypeValue = form.getFields()?.type?.value as Array<{ value: string }>; + useEffect(() => { + if (fieldTypeValue === undefined || fieldTypeValue.length === 0) { + return; + } + setSemanticTextFieldType( + fieldTypeValue[0]?.value === 'semantic_text' ? fieldTypeValue[0].value : undefined + ); + }, [form, fieldTypeValue]); + const submitForm = async (e?: React.FormEvent, exitAfter: boolean = false) => { if (e) { e.preventDefault(); @@ -85,7 +132,11 @@ export const CreateField = React.memo(function CreateFieldComponent({ if (isValid) { form.reset(); - dispatch({ type: 'field.add', value: data }); + if (data.type === 'semantic_text') { + dispatch({ type: 'field.addSemanticText', value: data }); + } else { + dispatch({ type: 'field.add', value: data }); + } if (exitAfter) { cancel(); @@ -107,17 +158,13 @@ export const CreateField = React.memo(function CreateFieldComponent({ const renderFormFields = () => ( - {/* Field name */} - - - - {/* Field type */} - + @@ -139,9 +186,25 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }} + + {/* Field reference_field for semantic_text field type */} + + + {/* Field name */} + + + ); + const isAddFieldButtonDisabled = (): boolean => { + if (semanticFieldType) { + return !referenceFieldComboValue || !nameValue || !inferenceIdComboValue; + } + + return false; + }; + const renderFormActions = () => ( {(isCancelable !== false || isAddingFields) && ( @@ -160,6 +223,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ onClick={submitForm} type="submit" data-test-subj="addButton" + isDisabled={isAddFieldButtonDisabled()} > {isMultiField ? i18n.translate('xpack.idxMgmt.mappingsEditor.createField.addMultiFieldButtonLabel', { @@ -197,10 +261,7 @@ export const CreateField = React.memo(function CreateFieldComponent({ >
- - {renderFormFields()} - - {renderFormActions()} + {renderFormFields()} @@ -230,9 +291,49 @@ export const CreateField = React.memo(function CreateFieldComponent({ ); }} + {/* Field inference_id for semantic_text field type */} + + + + + {renderFormActions()} +
); }); + +function ReferenceFieldCombo({ indexName }: { indexName?: string }) { + const [{ type }] = useFormData({ watch: 'type' }); + + if (type === undefined || type[0]?.value !== 'semantic_text') { + return null; + } + + return ( + + + {(field) => } + + + ); +} + +function InferenceIdCombo() { + const [{ type }] = useFormData({ watch: 'type' }); + + if (type === undefined || type[0]?.value !== 'semantic_text') { + return null; + } + + return ( + <> + + + {(field) => } + + + ); +} diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx index b88abe7ac99d7c..a857fcf7de68a0 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields_tree_editor.tsx @@ -15,9 +15,16 @@ import { FieldsList, CreateField } from './fields'; interface Props { onCancelAddingNewFields?: () => void; isAddingFields?: boolean; + isSemanticTextEnabled?: boolean; + indexName?: string; } -export const DocumentFieldsTreeEditor = ({ onCancelAddingNewFields, isAddingFields }: Props) => { +export const DocumentFieldsTreeEditor = ({ + onCancelAddingNewFields, + isAddingFields, + isSemanticTextEnabled = false, + indexName, +}: Props) => { const dispatch = useDispatch(); const { fields: { byId, rootLevelFields }, @@ -46,6 +53,8 @@ export const DocumentFieldsTreeEditor = ({ onCancelAddingNewFields, isAddingFiel isRootLevelField onCancelAddingNewFields={onCancelAddingNewFields} isAddingFields={isAddingFields} + isSemanticTextEnabled={isSemanticTextEnabled} + indexName={indexName} /> ); }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx index 187ba5c8474105..1c39bac607f461 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/data_types_definition.tsx @@ -900,6 +900,23 @@ export const TYPE_DEFINITION: { [key in DataType]: DataTypeDefinition } = {

), }, + semantic_text: { + label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.semanticTextDescription', { + defaultMessage: 'Semantic text', + }), + value: 'semantic_text', + documentation: { + main: 'semantic-text.html', + }, + description: () => ( +

+ +

+ ), + }, point: { label: i18n.translate('xpack.idxMgmt.mappingsEditor.dataType.pointDescription', { defaultMessage: 'Point', @@ -1007,6 +1024,7 @@ export const MAIN_TYPES: MainType[] = [ 'rank_features', 'search_as_you_type', 'shape', + 'semantic_text', 'sparse_vector', 'text', 'token_count', diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx index d108c1427c9d89..881318b52cdc57 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/constants/parameters_definition.tsx @@ -1041,6 +1041,7 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, schema: t.number, }, + dims: { fieldConfig: { defaultValue: '', @@ -1067,6 +1068,26 @@ export const PARAMETERS_DEFINITION: { [key in ParameterName]: ParameterDefinitio }, schema: t.string, }, + reference_field: { + fieldConfig: { + label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldLabel', { + defaultMessage: 'Reference field', + }), + helpText: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.referenceFieldHelpText', { + defaultMessage: 'Reference field for model inference.', + }), + }, + schema: t.string, + }, + inference_id: { + fieldConfig: { + label: i18n.translate('xpack.idxMgmt.mappingsEditor.parameters.inferenceIdLabel', { + defaultMessage: 'Select an inference endpoint:', + }), + }, + schema: t.string, + }, + relations: { fieldConfig: { defaultValue: [] as any, // Needed for FieldParams typing diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts index a650176f5f77cd..691c8a2d5c21ce 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/reducer.ts @@ -5,18 +5,25 @@ * 2.0. */ -import { Field, NormalizedFields, NormalizedField, State, Action } from './types'; +import { PARAMETERS_DEFINITION } from './constants'; import { - getFieldMeta, - getUniqueId, - shouldDeleteChildFieldsAfterTypeChange, getAllChildFields, + getFieldMeta, getMaxNestedDepth, + getUniqueId, normalize, - updateFieldsPathAfterFieldNameChange, searchFields, + shouldDeleteChildFieldsAfterTypeChange, + updateFieldsPathAfterFieldNameChange, } from './lib'; -import { PARAMETERS_DEFINITION } from './constants'; +import { + Action, + Field, + FieldWithSemanticTextInfo, + NormalizedField, + NormalizedFields, + State, +} from './types'; export const addFieldToState = (field: Field, state: State): State => { const updatedFields = { ...state.fields }; @@ -316,6 +323,28 @@ export const reducer = (state: State, action: Action): State => { case 'field.add': { return addFieldToState(action.value, state); } + case 'field.addSemanticText': { + const addTexFieldWithCopyToActionValue: FieldWithSemanticTextInfo = { + name: action.value.referenceField as string, + type: 'text', + copy_to: [action.value.name], + }; + + // Add text field to state with copy_to of semantic_text field + let updatedState = addFieldToState(addTexFieldWithCopyToActionValue, state); + + const addSemanticTextFieldActionValue: FieldWithSemanticTextInfo = { + name: action.value.name, + inference_id: action.value.inferenceId, + type: 'semantic_text', + }; + + // Add semantic_text field to state and reset fieldToAddFieldTo + updatedState = addFieldToState(addSemanticTextFieldActionValue, updatedState); + updatedState.documentFields.fieldToAddFieldTo = undefined; + + return updatedState; + } case 'field.remove': { const field = state.fields.byId[action.value]; const { id, hasChildFields, hasMultiFields } = field; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts index bf56c8752fe5e8..8383263c5b65e5 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/document_fields.ts @@ -59,6 +59,7 @@ export type MainType = | 'shape' | 'search_as_you_type' | 'sparse_vector' + | 'semantic_text' | 'date' | 'date_nanos' | 'geo_point' @@ -155,6 +156,8 @@ export type ParameterName = | 'points_only' | 'path' | 'dims' + | 'inference_id' + | 'reference_field' | 'depth_limit' | 'relations' | 'max_shingle_size' @@ -192,6 +195,11 @@ type FieldParams = { export type Field = FieldBasic & Partial; +export interface FieldWithSemanticTextInfo extends Field { + referenceField?: string; + inferenceId?: string; +} + export interface FieldMeta { childFieldsName: ChildFieldName | undefined; canHaveChildFields: boolean; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts index e14001234065b1..7667a03ec2198e 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/types/state.ts @@ -8,6 +8,7 @@ import { FormHook, OnFormUpdateArg, RuntimeField } from '../shared_imports'; import { Field, + FieldWithSemanticTextInfo, NormalizedFields, NormalizedRuntimeField, NormalizedRuntimeFields, @@ -107,6 +108,10 @@ export type Action = | { type: 'templates.save'; value: MappingsTemplates } | { type: 'fieldForm.update'; value: OnFormUpdateArg } | { type: 'field.add'; value: Field } + | { + type: 'field.addSemanticText'; + value: FieldWithSemanticTextInfo; + } | { type: 'field.remove'; value: string } | { type: 'field.edit'; value: Field } | { type: 'field.toggleExpand'; value: { fieldId: string; isExpanded?: boolean } } diff --git a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx index 9273834c07492d..1449c472ff6484 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/index_list/details_page/details_page_mappings_content.tsx @@ -70,7 +70,15 @@ export const DetailsPageMappingsContent: FunctionComponent<{ showAboutMappings: boolean; jsonData: any; refetchMapping: () => void; -}> = ({ index, data, jsonData, refetchMapping, showAboutMappings }) => { + isSemanticTextEnabled?: boolean; +}> = ({ + index, + data, + jsonData, + refetchMapping, + showAboutMappings, + isSemanticTextEnabled = false, +}) => { const { services: { extensionsService }, core: { getUrlForApp }, @@ -481,9 +489,15 @@ export const DetailsPageMappingsContent: FunctionComponent<{ ) : ( - + )} diff --git a/x-pack/plugins/index_management/server/routes/api/inference_models/index.ts b/x-pack/plugins/index_management/server/routes/api/inference_models/index.ts new file mode 100644 index 00000000000000..838a81f616e02a --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/inference_models/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 { RouteDependencies } from '../../../types'; + +import { registerGetAllRoute } from './register_get_route'; + +export function registerInferenceModelRoutes(dependencies: RouteDependencies) { + registerGetAllRoute(dependencies); +} diff --git a/x-pack/plugins/index_management/server/routes/api/inference_models/register_get_route.ts b/x-pack/plugins/index_management/server/routes/api/inference_models/register_get_route.ts new file mode 100644 index 00000000000000..68f385228f776d --- /dev/null +++ b/x-pack/plugins/index_management/server/routes/api/inference_models/register_get_route.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 { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; +import { addBasePath } from '..'; +import { RouteDependencies } from '../../../types'; + +export function registerGetAllRoute({ router, lib: { handleEsError } }: RouteDependencies) { + // Get all inference models + router.get( + { + path: addBasePath('/inference/all'), + validate: {}, + }, + async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + + // TODO: Use the client's built-in function rather than the transport when it's available + try { + const { models } = await client.asCurrentUser.transport.request<{ + models: InferenceAPIConfigResponse[]; + }>({ + method: 'GET', + path: `/_inference/_all`, + }); + + return response.ok({ + body: models, + }); + } catch (error) { + return handleEsError({ error, response }); + } + } + ); +} diff --git a/x-pack/plugins/index_management/server/routes/index.ts b/x-pack/plugins/index_management/server/routes/index.ts index ca29dbb7bf8978..33595ab2ea9772 100644 --- a/x-pack/plugins/index_management/server/routes/index.ts +++ b/x-pack/plugins/index_management/server/routes/index.ts @@ -7,15 +7,16 @@ import { RouteDependencies } from '../types'; +import { registerComponentTemplateRoutes } from './api/component_templates'; import { registerDataStreamRoutes } from './api/data_streams'; +import { registerEnrichPoliciesRoute } from './api/enrich_policies'; import { registerIndicesRoutes } from './api/indices'; -import { registerTemplateRoutes } from './api/templates'; +import { registerInferenceModelRoutes } from './api/inference_models'; +import { registerIndexMappingRoutes } from './api/mapping/register_index_mapping_route'; +import { registerNodesRoute } from './api/nodes'; import { registerSettingsRoutes } from './api/settings'; import { registerStatsRoute } from './api/stats'; -import { registerComponentTemplateRoutes } from './api/component_templates'; -import { registerNodesRoute } from './api/nodes'; -import { registerEnrichPoliciesRoute } from './api/enrich_policies'; -import { registerIndexMappingRoutes } from './api/mapping/register_index_mapping_route'; +import { registerTemplateRoutes } from './api/templates'; export class ApiRoutes { setup(dependencies: RouteDependencies) { @@ -25,6 +26,7 @@ export class ApiRoutes { registerSettingsRoutes(dependencies); registerIndexMappingRoutes(dependencies); registerComponentTemplateRoutes(dependencies); + registerInferenceModelRoutes(dependencies); registerNodesRoute(dependencies); registerEnrichPoliciesRoute(dependencies); diff --git a/x-pack/plugins/index_management/tsconfig.json b/x-pack/plugins/index_management/tsconfig.json index 3c23b586002d1c..3247b35bec4217 100644 --- a/x-pack/plugins/index_management/tsconfig.json +++ b/x-pack/plugins/index_management/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "outDir": "target/types", + "outDir": "target/types" }, "include": [ "__jest__/**/*", @@ -9,7 +9,7 @@ "public/**/*", "server/**/*", "test/**/*", - "../../../typings/**/*", + "../../../typings/**/*" ], "kbn_references": [ "@kbn/core", @@ -24,6 +24,7 @@ "@kbn/runtime-fields-plugin", "@kbn/test-jest-helpers", "@kbn/i18n", + "@kbn/ml-trained-models-utils", "@kbn/analytics", "@kbn/utility-types", "@kbn/i18n-react", @@ -45,9 +46,7 @@ "@kbn/code-editor", "@kbn/monaco", "@kbn/console-plugin", - "@kbn/shared-ux-utility", + "@kbn/shared-ux-utility" ], - "exclude": [ - "target/**/*", - ] + "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts index 286da05449cc11..0d211cfe9d3487 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts @@ -60,7 +60,7 @@ describe('', () => { // Verify documentation link expect(exists('documentationLink')).toBe(true); - expect(find('documentationLink').text()).toBe('Ingest Pipelines docs'); + expect(find('documentationLink').text()).toBe('Documentation'); // Verify create dropdown exists expect(exists('createPipelineDropdown')).toBe(true); @@ -70,7 +70,14 @@ describe('', () => { tableCellsValues.forEach((row, i) => { const pipeline = pipelines[i]; - expect(row).toEqual(['', pipeline.name, 'EditDelete']); + expect(row).toEqual([ + '', + pipeline.name, + '', + `test_pipeline${i + 1} description`, + '0', + 'EditDelete', + ]); }); }); @@ -162,7 +169,7 @@ describe('', () => { expect(exists('sectionLoading')).toBe(false); expect(exists('emptyList')).toBe(true); - expect(find('emptyList.title').text()).toEqual('Start by creating a pipeline'); + expect(find('emptyList.title').text()).toEqual('Create your first pipeline'); }); }); diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx index abece34aa1574c..ba3963baebcc47 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx @@ -42,12 +42,13 @@ export const EmptyList: FunctionComponent = () => { return ( {i18n.translate('xpack.ingestPipelines.list.table.emptyPromptTitle', { - defaultMessage: 'Start by creating a pipeline', + defaultMessage: 'Create your first pipeline', })} } diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx index 70369a83e686f1..cf972abe5db59c 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx @@ -10,8 +10,18 @@ import { RouteComponentProps } from 'react-router-dom'; import { FormattedMessage } from '@kbn/i18n-react'; import { Location } from 'history'; import { parse } from 'query-string'; +import { i18n } from '@kbn/i18n'; -import { EuiPageHeader, EuiButtonEmpty, EuiButton, EuiSpacer, EuiPageTemplate } from '@elastic/eui'; +import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; +import { + EuiPageHeader, + EuiButtonEmpty, + EuiButton, + EuiSpacer, + EuiPageTemplate, + EuiContextMenu, + EuiPopover, +} from '@elastic/eui'; import { Pipeline } from '../../../../common/types'; import { useKibana, SectionLoading } from '../../../shared_imports'; @@ -39,6 +49,7 @@ export const PipelinesList: React.FunctionComponent = ({ const [selectedPipeline, setSelectedPipeline] = useState(undefined); const [showFlyout, setShowFlyout] = useState(false); + const [showPopover, setShowPopover] = useState(false); const [pipelinesToDelete, setPipelinesToDelete] = useState([]); @@ -100,7 +111,7 @@ export const PipelinesList: React.FunctionComponent = ({ ); } - if (isLoading) { + if (isLoading && !data) { return ( = ({ return ; } + const createMenuItems = [ + /** + * Create pipeline + */ + { + name: i18n.translate('xpack.ingestPipelines.list.table.createPipelineButtonLabel', { + defaultMessage: 'New pipeline', + }), + ...reactRouterNavigate(history, '/create'), + 'data-test-subj': `createNewPipeline`, + }, + /** + * Create pipeline from CSV + */ + { + name: i18n.translate('xpack.ingestPipelines.list.table.createPipelineFromCsvButtonLabel', { + defaultMessage: 'New pipeline from CSV', + }), + ...reactRouterNavigate(history, '/csv_create'), + 'data-test-subj': `createPipelineFromCsv`, + }, + ]; + const renderFlyout = (): React.ReactNode => { if (!showFlyout) { return; @@ -154,10 +188,42 @@ export const PipelinesList: React.FunctionComponent = ({ description={ } rightSideItems={[ + setShowPopover(false)} + button={ + setShowPopover((previousBool) => !previousBool)} + > + {i18n.translate('xpack.ingestPipelines.list.table.createPipelineDropdownLabel', { + defaultMessage: 'Create pipeline', + })} + + } + panelPaddingSize="none" + repositionOnScroll + > + + , = ({ > , ]} @@ -175,6 +241,7 @@ export const PipelinesList: React.FunctionComponent = ({ void; + isLoading: boolean; onEditPipelineClick: (pipelineName: string) => void; onClonePipelineClick: (pipelineName: string) => void; onDeletePipelineClick: (pipelineName: string[]) => void; @@ -59,6 +62,7 @@ const managedFilterLabel = i18n.translate('xpack.ingestPipelines.list.table.mana export const PipelineTable: FunctionComponent = ({ pipelines, + isLoading, onReloadClick, onEditPipelineClick, onClonePipelineClick, @@ -70,30 +74,6 @@ export const PipelineTable: FunctionComponent = ({ ]); const { history } = useKibana().services; const [selection, setSelection] = useState([]); - const [showPopover, setShowPopover] = useState(false); - - const createMenuItems = [ - /** - * Create pipeline - */ - { - name: i18n.translate('xpack.ingestPipelines.list.table.createPipelineButtonLabel', { - defaultMessage: 'New pipeline', - }), - ...reactRouterNavigate(history, '/create'), - 'data-test-subj': `createNewPipeline`, - }, - /** - * Create pipeline from CSV - */ - { - name: i18n.translate('xpack.ingestPipelines.list.table.createPipelineFromCsvButtonLabel', { - defaultMessage: 'New pipeline from CSV', - }), - ...reactRouterNavigate(history, '/csv_create'), - 'data-test-subj': `createPipelineFromCsv`, - }, - ]; const filteredPipelines = useMemo(() => { return (pipelines || []).filter((pipeline) => { @@ -166,49 +146,16 @@ export const PipelineTable: FunctionComponent = ({ ) : undefined, toolsRight: [ - - {i18n.translate('xpack.ingestPipelines.list.table.reloadButtonLabel', { - defaultMessage: 'Reload', - })} - , - setShowPopover(false)} - button={ - setShowPopover((previousBool) => !previousBool)} - > - {i18n.translate('xpack.ingestPipelines.list.table.createPipelineDropdownLabel', { - defaultMessage: 'Create pipeline', - })} - - } - panelPaddingSize="none" - repositionOnScroll - > - - , + />, ], box: { incremental: true, @@ -253,12 +200,13 @@ export const PipelineTable: FunctionComponent = ({ }, columns: [ { + width: '25%', field: 'name', name: i18n.translate('xpack.ingestPipelines.list.table.nameColumnTitle', { defaultMessage: 'Name', }), sortable: true, - render: (name: string, pipeline) => ( + render: (name: string) => ( = ({ })} > {name} - {pipeline.deprecated && ( - <> -   - - - {deprecatedPipelineBadge.badge} - - - - )} - {pipeline.isManaged && ( - <> -   - - {i18n.translate('xpack.ingestPipelines.list.table.managedBadgeLabel', { - defaultMessage: 'Managed', - })} - - - )} ), }, { + width: '100px', + render: (pipeline: Pipeline) => { + return ( + + {pipeline.isManaged && ( + + + {i18n.translate('xpack.ingestPipelines.list.table.managedBadgeLabel', { + defaultMessage: 'Managed', + })} + + + )} + {pipeline.deprecated && ( + + + + {deprecatedPipelineBadge.badge} + + + + )} + + ); + }, + }, + { + field: 'description', + sortable: true, + name: i18n.translate('xpack.ingestPipelines.list.table.descriptionColumnTitle', { + defaultMessage: 'Description', + }), + }, + { + width: '120px', + name: i18n.translate('xpack.ingestPipelines.list.table.preprocessorsColumnTitle', { + defaultMessage: 'Preprocessors', + }), + align: 'right', + dataType: 'number', + sortable: ({ processors }: Pipeline) => processors.length, + render: ({ processors }: Pipeline) => processors.length, + }, + { + width: '120px', name: ( = ({ }, ], items: filteredPipelines, + loading: isLoading, }; return ; diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index 891f9b4ae5a211..ae1a8fec7a88e5 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -161,7 +161,7 @@ function getLensTopNavConfig(options: { if (actions.getUnderlyingDataUrl.visible) { const exploreDataInDiscoverLabel = i18n.translate('xpack.lens.app.exploreDataInDiscover', { - defaultMessage: 'Explore data in Discover', + defaultMessage: 'Explore in Discover', }); topNavMenu.push({ diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index e67a6feda2e09d..5f66bd2e838c03 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -238,10 +238,9 @@ export function LayerPanels( [dispatchLens, props.framePublicAPI.dataViews.indexPatterns, props.indexPatternService] ); - const addLayer: AddLayerFunction = (layerType, extraArg, ignoreInitialValues) => { + const addLayer: AddLayerFunction = (layerType, extraArg, ignoreInitialValues, seriesType) => { const layerId = generateId(); - - dispatchLens(addLayerAction({ layerId, layerType, extraArg, ignoreInitialValues })); + dispatchLens(addLayerAction({ layerId, layerType, extraArg, ignoreInitialValues, seriesType })); setNextFocusedLayerId(layerId); }; @@ -335,6 +334,7 @@ export function LayerPanels( })} {!hideAddLayerButton && activeVisualization?.getAddLayerButtonComponent?.({ + state: visualization.state, supportedLayers: activeVisualization.getSupportedLayers( visualization.state, props.framePublicAPI diff --git a/x-pack/plugins/lens/public/state_management/lens_slice.ts b/x-pack/plugins/lens/public/state_management/lens_slice.ts index dc59192c2d1956..3146f61d3c5d08 100644 --- a/x-pack/plugins/lens/public/state_management/lens_slice.ts +++ b/x-pack/plugins/lens/public/state_management/lens_slice.ts @@ -13,6 +13,7 @@ import { History } from 'history'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; import { EventAnnotationGroupConfig } from '@kbn/event-annotation-common'; import { DragDropIdentifier, DropType } from '@kbn/dom-drag-drop'; +import { SeriesType } from '@kbn/visualizations-plugin/common'; import { LensEmbeddableInput } from '..'; import { TableInspectorAdapter } from '../editor_frame_service/types'; import type { @@ -244,6 +245,7 @@ export const addLayer = createAction<{ layerType: LayerType; extraArg: unknown; ignoreInitialValues?: boolean; + seriesType?: SeriesType; }>('lens/addLayer'); export const onDropToDimension = createAction<{ source: DragDropIdentifier; @@ -908,7 +910,7 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { .addCase( addLayer, - (state, { payload: { layerId, layerType, extraArg, ignoreInitialValues } }) => { + (state, { payload: { layerId, layerType, extraArg, seriesType, ignoreInitialValues } }) => { if (!state.activeDatasourceId || !state.visualization.activeId) { return state; } @@ -924,7 +926,8 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { layerId, layerType, currentDataViewsId, - extraArg + extraArg, + seriesType ); const framePublicAPI = selectFramePublicAPI({ lens: current(state) }, datasourceMap); diff --git a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts index 13a44055a1cfb2..9b48c41e418562 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_in_discover_action.ts @@ -26,8 +26,8 @@ export const createOpenInDiscoverAction = ( order: 19, // right after Inspect which is 20 getIconType: () => 'popout', getDisplayName: () => - i18n.translate('xpack.lens.app.exploreDataInDiscover', { - defaultMessage: 'Explore data in Discover', + i18n.translate('xpack.lens.action.exploreInDiscover', { + defaultMessage: 'Explore in Discover', }), getHref: async (context: EmbeddableApiContext) => { const { getHref } = await getDiscoverHelpersAsync(); diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 1f189f80c14b29..c1c7be77b9608b 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -17,7 +17,11 @@ import type { Datatable, ExpressionRendererEvent, } from '@kbn/expressions-plugin/public'; -import type { Configuration, NavigateToLensContext } from '@kbn/visualizations-plugin/common'; +import type { + Configuration, + NavigateToLensContext, + SeriesType, +} from '@kbn/visualizations-plugin/common'; import type { Query } from '@kbn/es-query'; import type { UiActionsStart, @@ -1000,7 +1004,8 @@ interface VisualizationStateFromContextChangeProps { export type AddLayerFunction = ( layerType: LayerType, extraArg?: T, - ignoreInitialValues?: boolean + ignoreInitialValues?: boolean, + seriesType?: SeriesType ) => void; export type AnnotationGroups = Record; @@ -1024,7 +1029,8 @@ export type RegisterLibraryAnnotationGroupFunction = (groupInfo: { id: string; group: EventAnnotationGroupConfig; }) => void; -interface AddLayerButtonProps { +interface AddLayerButtonProps { + state: T; supportedLayers: VisualizationLayerDescription[]; addLayer: AddLayerFunction; ensureIndexPattern: (specOrId: DataViewSpec | string) => Promise; @@ -1110,7 +1116,8 @@ export interface Visualization T; /** Retrieve a list of supported layer types with initialization data */ @@ -1254,8 +1261,8 @@ export interface Visualization null | ReactElement<{ columnId: string; label: string }>; getAddLayerButtonComponent?: ( - props: AddLayerButtonProps - ) => null | ReactElement; + props: AddLayerButtonProps + ) => null | ReactElement>; /** * Creates map of columns ids and unique lables. Used only for noDatasource layers */ diff --git a/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx b/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.tsx new file mode 100644 index 00000000000000..5ecef7e45eebea --- /dev/null +++ b/x-pack/plugins/lens/public/visualizations/xy/add_layer.test.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 from 'react'; +import { fireEvent, render, screen, waitFor, within } from '@testing-library/react'; +import { AddLayerButton } from './add_layer'; +import { XYState } from './types'; +import { Position } from '@elastic/charts'; +import { LayerTypes } from '@kbn/visualizations-plugin/common'; +import { eventAnnotationServiceMock } from '@kbn/event-annotation-plugin/public/mocks'; +import { IconChartBarAnnotations } from '@kbn/chart-icons'; + +describe('AddLayerButton', () => { + const addLayer = jest.fn(); + + const renderAddLayerButton = () => { + const state: XYState = { + legend: { position: Position.Bottom, isVisible: true }, + valueLabels: 'show', + preferredSeriesType: 'bar', + layers: [ + { + layerId: 'first', + layerType: LayerTypes.DATA, + seriesType: 'area', + splitAccessor: 'd', + xAccessor: 'a', + accessors: ['b', 'c'], + }, + ], + }; + const supportedLayers = [ + { + type: LayerTypes.DATA, + label: 'Visualization', + }, + { + type: LayerTypes.REFERENCELINE, + label: LayerTypes.REFERENCELINE, + }, + { + type: LayerTypes.ANNOTATIONS, + label: 'Annotations', + icon: IconChartBarAnnotations, + disabled: true, + }, + ]; + + const rtlRender = render( + + ); + return { + ...rtlRender, + clickAddLayer: () => { + fireEvent.click(screen.getByLabelText('Add layer')); + }, + clickVisualizationButton: () => { + fireEvent.click(screen.getByRole('button', { name: 'Visualization' })); + }, + clickSeriesOptionsButton: (seriesType = 'line') => { + const lineOption = screen.getByTestId(`lnsXY_seriesType-${seriesType}`); + fireEvent.click(lineOption); + }, + waitForSeriesOptions: async () => { + await waitFor(() => { + expect(screen.queryByTestId('lnsXY_seriesType-area')).toBeInTheDocument(); + }); + }, + getSeriesTypeOptions: () => { + return within( + screen.getByTestId('contextMenuPanelTitleButton').parentElement as HTMLElement + ) + .getAllByRole('button') + .map((el) => el.textContent); + }, + }; + }; + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('renders all compatible series types', async () => { + const { clickAddLayer, clickVisualizationButton, waitForSeriesOptions, getSeriesTypeOptions } = + renderAddLayerButton(); + clickAddLayer(); + clickVisualizationButton(); + await waitForSeriesOptions(); + + expect(getSeriesTypeOptions()).toEqual([ + 'Select visualization type', + 'Bar vertical', + 'Bar vertical stacked', + 'Bar vertical percentage', + 'Area', + 'Area stacked', + 'Area percentage', + 'Line', + ]); + }); + it('calls addLayer with a proper series type when button is clicked', async () => { + const { + clickAddLayer, + clickVisualizationButton, + waitForSeriesOptions, + clickSeriesOptionsButton, + } = renderAddLayerButton(); + clickAddLayer(); + clickVisualizationButton(); + await waitForSeriesOptions(); + clickSeriesOptionsButton('line'); + expect(addLayer).toHaveBeenCalledWith(LayerTypes.DATA, undefined, undefined, 'line'); + }); +}); diff --git a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx index 93cfd1a48e6281..933aaca9f3915d 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx @@ -20,16 +20,27 @@ import { EventAnnotationServiceType } from '@kbn/event-annotation-plugin/public' import { AddLayerFunction, VisualizationLayerDescription } from '../../types'; import { LoadAnnotationLibraryFlyout } from './load_annotation_library_flyout'; import type { ExtraAppendLayerArg } from './visualization'; +import { SeriesType, XYState, visualizationTypes } from './types'; +import { isHorizontalChart, isHorizontalSeries } from './state_helpers'; +import { getDataLayers } from './visualization_helpers'; import { ExperimentalBadge } from '../../shared_components'; interface AddLayerButtonProps { + state: XYState; supportedLayers: VisualizationLayerDescription[]; addLayer: AddLayerFunction; eventAnnotationService: EventAnnotationServiceType; isInlineEditing?: boolean; } +export enum AddLayerPanelType { + main = 'main', + selectAnnotationMethod = 'selectAnnotationMethod', + selectVisualizationType = 'selectVisualizationType', +} + export function AddLayerButton({ + state, supportedLayers, addLayer, eventAnnotationService, @@ -47,7 +58,7 @@ export function AddLayerButton({ toolTipContent, }: typeof supportedLayers[0]) => { return { - panel: 1, + panel: AddLayerPanelType.selectAnnotationMethod, toolTipContent, disabled, name: ( @@ -66,6 +77,33 @@ export function AddLayerButton({ }; }; + const dataPanel = ({ + type, + label, + icon, + disabled, + toolTipContent, + }: typeof supportedLayers[0]) => { + return { + panel: AddLayerPanelType.selectVisualizationType, + toolTipContent, + disabled, + name: {label}, + className: 'lnsLayerAddButton', + icon: icon && , + ['data-test-subj']: `lnsLayerAddButton-${type}`, + }; + }; + + const horizontalOnly = isHorizontalChart(state.layers); + + const availableVisTypes = visualizationTypes.filter( + (t) => isHorizontalSeries(t.id as SeriesType) === horizontalOnly + ); + + const currentLayerVisType = + availableVisTypes.findIndex((t) => t.id === getDataLayers(state.layers)?.[0]?.seriesType) || 0; + return ( <> ({ + name: t.fullLabel || t.label, + icon: t.icon && , + onClick: () => { + addLayer(LayerTypes.DATA, undefined, undefined, t.id as SeriesType); + toggleLayersChoice(false); + }, + 'data-test-subj': `lnsXY_seriesType-${t.id}`, + })), + }, ]} /> diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 1fc617ce91fe55..1d678ef9029915 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -208,20 +208,20 @@ export const getXyVisualization = ({ return state; }, - appendLayer(state, layerId, layerType, indexPatternId, extraArg) { + appendLayer(state, layerId, layerType, indexPatternId, extraArg, seriesType) { if (layerType === 'metricTrendline') { return state; } - const firstUsedSeriesType = getDataLayers(state.layers)?.[0]?.seriesType; return { ...state, layers: [ ...state.layers, newLayerState({ - seriesType: firstUsedSeriesType || state.preferredSeriesType, layerId, layerType, + seriesType: + seriesType || getDataLayers(state.layers)?.[0]?.seriesType || state.preferredSeriesType, indexPatternId, extraArg, }), @@ -734,7 +734,7 @@ export const getXyVisualization = ({ { + addLayer={async (type, loadedGroupInfo, _, seriesType) => { if (type === LayerTypes.ANNOTATIONS && loadedGroupInfo) { await props.ensureIndexPattern( loadedGroupInfo.dataViewSpec ?? loadedGroupInfo.indexPatternId @@ -745,8 +745,7 @@ export const getXyVisualization = ({ group: loadedGroupInfo, }); } - - props.addLayer(type, loadedGroupInfo, !!loadedGroupInfo); + props.addLayer(type, loadedGroupInfo, !!loadedGroupInfo, seriesType); }} /> ); diff --git a/x-pack/plugins/ml/common/types/trained_models.ts b/x-pack/plugins/ml/common/types/trained_models.ts index 2a677f942b65f2..0d71e90ac30ff5 100644 --- a/x-pack/plugins/ml/common/types/trained_models.ts +++ b/x-pack/plugins/ml/common/types/trained_models.ts @@ -12,6 +12,7 @@ import type { TotalFeatureImportance, } from '@kbn/ml-data-frame-analytics-utils'; import type { IndexName, IndicesIndexState } from '@elastic/elasticsearch/lib/api/types'; +import type { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; import type { XOR } from './common'; import type { MlSavedObjectType } from './saved_objects'; @@ -128,40 +129,6 @@ export interface PipelineDefinition { description?: string; } -export type InferenceServiceSettings = - | { - service: 'elser'; - service_settings: { - num_allocations: number; - num_threads: number; - model_id: string; - }; - } - | { - service: 'openai'; - service_settings: { - api_key: string; - organization_id: string; - url: string; - }; - } - | { - service: 'hugging_face'; - service_settings: { - api_key: string; - url: string; - }; - }; - -export type InferenceAPIConfigResponse = { - // Refers to a deployment id - model_id: string; - task_type: 'sparse_embedding' | 'text_embedding'; - task_settings: { - model?: string; - }; -} & InferenceServiceSettings; - export interface ModelPipelines { model_id: string; pipelines: Record; diff --git a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js index f9aa282b4b1182..7703ca87317e15 100644 --- a/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js +++ b/x-pack/plugins/ml/public/application/components/annotations/annotations_table/annotations_table.js @@ -278,7 +278,6 @@ class AnnotationsTableUI extends Component { entityCondition[annotation.by_field_name] = annotation.by_field_value; } mlTimeSeriesExplorer.entities = entityCondition; - // appState.mlTimeSeriesExplorer = mlTimeSeriesExplorer; const mlLocator = share.url.locators.get(ML_APP_LOCATOR); const singleMetricViewerLink = await mlLocator.getUrl( diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js index 13f7bb58a0f448..147880031e4528 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js @@ -77,7 +77,10 @@ export function extractJobDetails(job, basePath, refreshJobList) { if (job.calendars) { calendars.items = job.calendars.map((c) => [ '', - + {c} , ]); diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx index 9ee4f5dcdc9911..ddea5031d4bb06 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/job_type/page.tsx @@ -6,7 +6,7 @@ */ import type { FC } from 'react'; -import React, { useState, useMemo } from 'react'; +import React, { useEffect, useState, useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiTitle, @@ -24,7 +24,6 @@ import { useMlKibana, useNavigateToPath } from '../../../../contexts/kibana'; import { useDataSource } from '../../../../contexts/ml'; import { DataRecognizer } from '../../../../components/data_recognizer'; import { addItemToRecentlyAccessed } from '../../../../util/recently_accessed'; -import { timeBasedIndexCheck } from '../../../../util/index_utils'; import { LinkCard } from '../../../../components/link_card'; import { CategorizationIcon } from './categorization_job_icon'; import { ML_APP_LOCATOR, ML_PAGES } from '../../../../../../common/constants/locator'; @@ -35,7 +34,10 @@ import { MlPageHeader } from '../../../../components/page_header'; export const Page: FC = () => { const { - services: { share }, + services: { + share, + notifications: { toasts }, + }, } = useMlKibana(); const dataSourceContext = useDataSource(); @@ -48,7 +50,22 @@ export const Page: FC = () => { const { selectedDataView, selectedSavedSearch } = dataSourceContext; - const isTimeBasedIndex = timeBasedIndexCheck(selectedDataView); + const isTimeBasedIndex: boolean = selectedDataView.isTimeBased(); + + useEffect(() => { + if (!isTimeBasedIndex) { + toasts.addWarning({ + title: i18n.translate('xpack.ml.dataViewNotBasedOnTimeSeriesNotificationTitle', { + defaultMessage: 'The data view {dataViewIndexPattern} is not based on a time series', + values: { dataViewIndexPattern: selectedDataView.getIndexPattern() }, + }), + text: i18n.translate('xpack.ml.dataViewNotBasedOnTimeSeriesNotificationDescription', { + defaultMessage: 'Anomaly detection only runs over time-based indices', + }), + }); + } + }, [isTimeBasedIndex, selectedDataView, toasts]); + const hasGeoFields = useMemo( () => [ diff --git a/x-pack/plugins/ml/public/application/model_management/inference_api_tab.tsx b/x-pack/plugins/ml/public/application/model_management/inference_api_tab.tsx index c48a7c496745a6..dba6621a269b5b 100644 --- a/x-pack/plugins/ml/public/application/model_management/inference_api_tab.tsx +++ b/x-pack/plugins/ml/public/application/model_management/inference_api_tab.tsx @@ -16,7 +16,7 @@ import { EuiTitle, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { InferenceAPIConfigResponse } from '../../../common/types/trained_models'; +import type { InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; export interface InferenceAPITabProps { inferenceApis: InferenceAPIConfigResponse[]; diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx index b26dc876a33e13..6ad84f892eb318 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/plot_function_controls/plot_function_controls.tsx @@ -15,6 +15,7 @@ import { getFunctionDescription, isMetricDetector } from '../../get_function_des import { useToastNotificationService } from '../../../services/toast_notification_service'; import { useMlResultsService } from '../../../services/results_service'; import type { CombinedJob } from '../../../../../common/types/anomaly_detection_jobs'; +import type { MlEntity } from '../../../../embeddables'; const plotByFunctionOptions = [ { @@ -50,7 +51,7 @@ export const PlotByFunctionControls = ({ setFunctionDescription: (func: string) => void; selectedDetectorIndex: number; selectedJobId: string; - selectedEntities: Record; + selectedEntities?: MlEntity; entityControlsCount: number; }) => { const toastNotificationService = useToastNotificationService(); @@ -59,7 +60,7 @@ export const PlotByFunctionControls = ({ const getFunctionDescriptionToPlot = useCallback( async ( _selectedDetectorIndex: number, - _selectedEntities: Record, + _selectedEntities: MlEntity | undefined, _selectedJobId: string, _selectedJob: CombinedJob ) => { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx index 26556f9d1f4c62..ee96494a77e09c 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/components/series_controls/series_controls.tsx @@ -37,6 +37,7 @@ import { import type { FieldDefinition } from '../../../services/results_service/result_service_rx'; import { getViewableDetectors } from '../../timeseriesexplorer_utils/get_viewable_detectors'; import { PlotByFunctionControls } from '../plot_function_controls'; +import type { MlEntity } from '../../../../embeddables'; function getEntityControlOptions(fieldValues: FieldDefinition['values']): ComboBoxOption[] { if (!Array.isArray(fieldValues)) { @@ -76,7 +77,7 @@ interface SeriesControlsProps { functionDescription?: string; job?: CombinedJob | MlJob; selectedDetectorIndex: number; - selectedEntities: Record; + selectedEntities?: MlEntity; selectedJobId: JobId; setFunctionDescription: (func: string) => void; } diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/get_controls_for_detector.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/get_controls_for_detector.ts index 69b85acad86658..214fe8bf45f472 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/get_controls_for_detector.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/get_controls_for_detector.ts @@ -8,13 +8,14 @@ import { mlJobService } from '../services/job_service'; import type { Entity } from './components/entity_control/entity_control'; import type { JobId, CombinedJob } from '../../../common/types/anomaly_detection_jobs'; +import type { MlEntity } from '../../embeddables'; /** * Extracts entities from the detector configuration */ export function getControlsForDetector( selectedDetectorIndex: number, - selectedEntities: Record, + selectedEntities: MlEntity | undefined, selectedJobId: JobId, job?: CombinedJob ): Entity[] { diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/get_function_description.ts b/x-pack/plugins/ml/public/application/timeseriesexplorer/get_function_description.ts index 30e6afb9cf66f6..274bfd3c6f27cc 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/get_function_description.ts +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/get_function_description.ts @@ -14,6 +14,7 @@ import { getControlsForDetector } from './get_controls_for_detector'; import { getCriteriaFields } from './get_criteria_fields'; import type { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; import { getViewableDetectors } from './timeseriesexplorer_utils/get_viewable_detectors'; +import type { MlEntity } from '../../embeddables'; export function isMetricDetector(selectedJob: CombinedJob, selectedDetectorIndex: number) { const detectors = getViewableDetectors(selectedJob); @@ -37,7 +38,7 @@ export const getFunctionDescription = async ( selectedJob, }: { selectedDetectorIndex: number; - selectedEntities: Record; + selectedEntities: MlEntity | undefined; selectedJobId: string; selectedJob: CombinedJob; }, diff --git a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js index 945a765616f8fb..42e942ae907fc7 100644 --- a/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js +++ b/x-pack/plugins/ml/public/application/timeseriesexplorer/timeseriesexplorer_embeddable_chart/timeseriesexplorer_embeddable_chart.js @@ -717,6 +717,7 @@ export class TimeSeriesExplorerEmbeddableChart extends React.Component { !isEqual(previousProps.selectedDetectorIndex, this.props.selectedDetectorIndex) || !isEqual(previousProps.selectedEntities, this.props.selectedEntities) || previousProps.selectedForecastId !== this.props.selectedForecastId || + previousProps.selectedJob?.job_id !== this.props.selectedJob?.job_id || previousProps.selectedJobId !== this.props.selectedJobId || previousProps.functionDescription !== this.props.functionDescription ) { @@ -727,6 +728,7 @@ export class TimeSeriesExplorerEmbeddableChart extends React.Component { !isEqual(previousProps.selectedEntities, this.props.selectedEntities) || previousProps.selectedForecastId !== this.props.selectedForecastId || previousProps.selectedJobId !== this.props.selectedJobId || + previousProps.selectedJob?.job_id !== this.props.selectedJob?.job_id || previousProps.functionDescription !== this.props.functionDescription; this.loadSingleMetricData(fullRefresh); } diff --git a/x-pack/plugins/ml/public/application/util/index_service.ts b/x-pack/plugins/ml/public/application/util/index_service.ts index 84da4ee567ab46..bbdddbd6372685 100644 --- a/x-pack/plugins/ml/public/application/util/index_service.ts +++ b/x-pack/plugins/ml/public/application/util/index_service.ts @@ -11,7 +11,6 @@ import type { Job } from '../../../common/types/anomaly_detection_jobs'; import { useMlKibana } from '../contexts/kibana'; -// TODO Consolidate with legacy code in `ml/public/application/util/index_utils.ts`. export function indexServiceFactory(dataViewsService: DataViewsContract) { /** * Retrieves the data view ID from the given name. diff --git a/x-pack/plugins/ml/public/application/util/index_utils.ts b/x-pack/plugins/ml/public/application/util/index_utils.ts index a9074e573e55a7..4d8eddde1a54b3 100644 --- a/x-pack/plugins/ml/public/application/util/index_utils.ts +++ b/x-pack/plugins/ml/public/application/util/index_utils.ts @@ -5,11 +5,9 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import type { SavedSearch, SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { Query, Filter } from '@kbn/es-query'; import type { DataView, DataViewField, DataViewsContract } from '@kbn/data-views-plugin/common'; -import { getToastNotifications } from './dependency_cache'; export interface DataViewAndSavedSearch { savedSearch: SavedSearch | null; @@ -48,31 +46,6 @@ export function getQueryFromSavedSearchObject(savedSearch: SavedSearch) { }; } -/** - * Returns true if the index passed in is time based - * an optional flag will trigger the display a notification at the top of the page - * warning that the index is not time based - */ -export function timeBasedIndexCheck(dataView: DataView, showNotification = false) { - if (!dataView.isTimeBased()) { - if (showNotification) { - const toastNotifications = getToastNotifications(); - toastNotifications.addWarning({ - title: i18n.translate('xpack.ml.dataViewNotBasedOnTimeSeriesNotificationTitle', { - defaultMessage: 'The data view {dataViewIndexPattern} is not based on a time series', - values: { dataViewIndexPattern: dataView.getIndexPattern() }, - }), - text: i18n.translate('xpack.ml.dataViewNotBasedOnTimeSeriesNotificationDescription', { - defaultMessage: 'Anomaly detection only runs over time-based indices', - }), - }); - } - return false; - } else { - return true; - } -} - /** * Returns true if the index pattern contains a : * which means it is cross-cluster diff --git a/x-pack/plugins/ml/public/embeddables/constants.ts b/x-pack/plugins/ml/public/embeddables/constants.ts index 1001cd89c74989..1e42301676dfcd 100644 --- a/x-pack/plugins/ml/public/embeddables/constants.ts +++ b/x-pack/plugins/ml/public/embeddables/constants.ts @@ -11,5 +11,7 @@ export const ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE = 'ml_single_metric_vi export type AnomalySwimLaneEmbeddableType = typeof ANOMALY_SWIMLANE_EMBEDDABLE_TYPE; export type AnomalyExplorerChartsEmbeddableType = typeof ANOMALY_EXPLORER_CHARTS_EMBEDDABLE_TYPE; +export type AnomalySingleMetricViewerEmbeddableType = + typeof ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE; export type MlEmbeddableTypes = AnomalySwimLaneEmbeddableType | AnomalyExplorerChartsEmbeddableType; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/embeddable_single_metric_viewer_container.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/embeddable_single_metric_viewer_container.tsx index 3aa0e332dcaf5c..d7dae512e19354 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/embeddable_single_metric_viewer_container.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/embeddable_single_metric_viewer_container.tsx @@ -38,7 +38,7 @@ interface AppStateZoom { export interface EmbeddableSingleMetricViewerContainerProps { id: string; embeddableContext: InstanceType; - embeddableInput: Observable; + embeddableInput$: Observable; services: SingleMetricViewerEmbeddableServices; refresh: Observable; onInputChange: (input: Partial) => void; @@ -50,10 +50,10 @@ export interface EmbeddableSingleMetricViewerContainerProps { export const EmbeddableSingleMetricViewerContainer: FC< EmbeddableSingleMetricViewerContainerProps -> = ({ id, embeddableContext, embeddableInput, services, refresh, onRenderComplete }) => { +> = ({ id, embeddableContext, embeddableInput$, services, refresh, onRenderComplete }) => { useEmbeddableExecutionContext( services[0].executionContext, - embeddableInput, + embeddableInput$, ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE, id ); @@ -66,7 +66,7 @@ export const EmbeddableSingleMetricViewerContainer: FC< const { mlApiServices, mlJobService } = services[2]; const { data, bounds, lastRefresh } = useSingleMetricViewerInputResolver( - embeddableInput, + embeddableInput$, refresh, services[1].data.query.timefilter.timefilter, onRenderComplete diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable.tsx index 719d300162d094..8cbd2ad30ae8e1 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_embeddable.tsx @@ -9,11 +9,11 @@ import React, { Suspense } from 'react'; import ReactDOM from 'react-dom'; import { pick } from 'lodash'; -import { Embeddable } from '@kbn/embeddable-plugin/public'; +import { Embeddable, embeddableInputToSubject } from '@kbn/embeddable-plugin/public'; +import { Subject, Subscription, type BehaviorSubject } from 'rxjs'; import type { CoreStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; -import { Subject } from 'rxjs'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; import type { IContainer } from '@kbn/embeddable-plugin/public'; import { DatePickerContextProvider, type DatePickerDependencies } from '@kbn/ml-date-picker'; @@ -28,6 +28,7 @@ import type { } from '..'; import { ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE } from '..'; import { EmbeddableLoading } from '../common/components/embeddable_loading_fallback'; +import type { MlEntity } from '..'; export const getDefaultSingleMetricViewerPanelTitle = (jobIds: JobId[]) => i18n.translate('xpack.ml.singleMetricViewerEmbeddable.title', { @@ -45,12 +46,49 @@ export class SingleMetricViewerEmbeddable extends Embeddable< private reload$ = new Subject(); public readonly type: string = ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE; + // API + public readonly functionDescription: BehaviorSubject; + public readonly jobIds: BehaviorSubject; + public readonly selectedDetectorIndex: BehaviorSubject; + public readonly selectedEntities: BehaviorSubject; + + private apiSubscriptions = new Subscription(); + constructor( initialInput: SingleMetricViewerEmbeddableInput, public services: [CoreStart, MlDependencies, SingleMetricViewerServices], parent?: IContainer ) { super(initialInput, {} as AnomalyChartsEmbeddableOutput, parent); + + this.jobIds = embeddableInputToSubject( + this.apiSubscriptions, + this, + 'jobIds' + ); + + this.functionDescription = embeddableInputToSubject< + string | undefined, + SingleMetricViewerEmbeddableInput + >(this.apiSubscriptions, this, 'functionDescription'); + + this.selectedDetectorIndex = embeddableInputToSubject< + number | undefined, + SingleMetricViewerEmbeddableInput + >(this.apiSubscriptions, this, 'selectedDetectorIndex'); + + this.selectedEntities = embeddableInputToSubject< + MlEntity | undefined, + SingleMetricViewerEmbeddableInput + >(this.apiSubscriptions, this, 'selectedEntities'); + } + + public updateUserInput(update: SingleMetricViewerEmbeddableInput) { + this.updateInput(update); + } + + public reportsEmbeddableLoad() { + return true; } public onLoading() { @@ -65,7 +103,7 @@ export class SingleMetricViewerEmbeddable extends Embeddable< public onRenderComplete() { this.renderComplete.dispatchComplete(); - this.updateOutput({ loading: false, error: undefined }); + this.updateOutput({ loading: false, rendered: true, error: undefined }); } public render(node: HTMLElement) { @@ -102,7 +140,7 @@ export class SingleMetricViewerEmbeddable extends Embeddable< @@ -58,11 +59,16 @@ export class SingleMetricViewerEmbeddableFactory const { resolveEmbeddableSingleMetricViewerUserInput } = await import( './single_metric_viewer_setup_flyout' ); - return await resolveEmbeddableSingleMetricViewerUserInput( + const userInput = await resolveEmbeddableSingleMetricViewerUserInput( coreStart, pluginStart, - singleMetricServices + singleMetricServices.mlApiServices ); + + return { + ...userInput, + title: userInput.panelTitle, + }; } catch (e) { return Promise.reject(); } @@ -142,7 +148,10 @@ export class SingleMetricViewerEmbeddableFactory ]; } - public async create(initialInput: SingleMetricViewerEmbeddableInput, parent?: IContainer) { + public async create( + initialInput: SingleMetricViewerEmbeddableInput, + parent?: IContainer + ): Promise> { const services = await this.getServices(); const { SingleMetricViewerEmbeddable } = await import('./single_metric_viewer_embeddable'); return new SingleMetricViewerEmbeddable(initialInput, services, parent); diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx index b14539480a9557..e3d35fa472b982 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_initializer.tsx @@ -23,52 +23,60 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import type { MlJob } from '@elastic/elasticsearch/lib/api/types'; import type { TimeRangeBounds } from '@kbn/ml-time-buckets'; -import type { SingleMetricViewerServices } from '..'; +import type { SingleMetricViewerEmbeddableInput } from '..'; import { SeriesControls } from '../../application/timeseriesexplorer/components/series_controls'; import { APP_STATE_ACTION, type TimeseriesexplorerActionType, } from '../../application/timeseriesexplorer/timeseriesexplorer_constants'; +import type { SingleMetricViewerEmbeddableCustomInput, MlEntity } from '..'; export interface SingleMetricViewerInitializerProps { bounds: TimeRangeBounds; defaultTitle: string; - initialInput?: SingleMetricViewerServices; + initialInput?: Partial; job: MlJob; - onCreate: (props: { - panelTitle: string; - functionDescription?: string; - selectedDetectorIndex: number; - selectedEntities: any; - }) => void; + onCreate: (props: Partial) => void; onCancel: () => void; } export const SingleMetricViewerInitializer: FC = ({ - bounds, defaultTitle, + bounds, initialInput, job, onCreate, onCancel, }) => { + const isNewJob = initialInput?.jobIds !== undefined && initialInput?.jobIds[0] !== job.job_id; + const [panelTitle, setPanelTitle] = useState(defaultTitle); - const [functionDescription, setFunctionDescription] = useState(); - const [selectedDetectorIndex, setSelectedDetectorIndex] = useState(0); - const [selectedEntities, setSelectedEntities] = useState(); + const [functionDescription, setFunctionDescription] = useState( + initialInput?.functionDescription + ); + // Reset detector index and entities if the job has changed + const [selectedDetectorIndex, setSelectedDetectorIndex] = useState( + !isNewJob && initialInput?.selectedDetectorIndex ? initialInput.selectedDetectorIndex : 0 + ); + const [selectedEntities, setSelectedEntities] = useState( + !isNewJob && initialInput?.selectedEntities ? initialInput.selectedEntities : undefined + ); const isPanelTitleValid = panelTitle.length > 0; - const handleStateUpdate = (action: TimeseriesexplorerActionType, payload: any) => { + const handleStateUpdate = ( + action: TimeseriesexplorerActionType, + payload: string | number | MlEntity + ) => { switch (action) { case APP_STATE_ACTION.SET_ENTITIES: - setSelectedEntities(payload); + setSelectedEntities(payload as MlEntity); break; case APP_STATE_ACTION.SET_FUNCTION_DESCRIPTION: - setFunctionDescription(payload); + setFunctionDescription(payload as string); break; case APP_STATE_ACTION.SET_DETECTOR_INDEX: - setSelectedDetectorIndex(payload); + setSelectedDetectorIndex(payload as number); break; default: break; diff --git a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx index b20d032f5b907d..11927e9bca377f 100644 --- a/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/single_metric_viewer/single_metric_viewer_setup_flyout.tsx @@ -10,18 +10,19 @@ import type { CoreStart } from '@kbn/core/public'; import { toMountPoint } from '@kbn/react-kibana-mount'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { getDefaultSingleMetricViewerPanelTitle } from './single_metric_viewer_embeddable'; -import type { SingleMetricViewerEmbeddableInput, SingleMetricViewerServices } from '..'; +import type { SingleMetricViewerEmbeddableInput } from '..'; import { resolveJobSelection } from '../common/resolve_job_selection'; import { SingleMetricViewerInitializer } from './single_metric_viewer_initializer'; import type { MlStartDependencies } from '../../plugin'; +import type { MlApiServices } from '../../application/services/ml_api_service'; export async function resolveEmbeddableSingleMetricViewerUserInput( coreStart: CoreStart, pluginStart: MlStartDependencies, - input: SingleMetricViewerServices + mlApiServices: MlApiServices, + input?: SingleMetricViewerEmbeddableInput ): Promise> { const { overlays, theme, i18n } = coreStart; - const { mlApiServices } = input; const timefilter = pluginStart.data.query.timefilter.timefilter; return new Promise(async (resolve, reject) => { @@ -29,39 +30,30 @@ export async function resolveEmbeddableSingleMetricViewerUserInput( const { jobIds } = await resolveJobSelection( coreStart, pluginStart.data.dataViews, - undefined, + input?.jobIds ? input.jobIds : undefined, true ); - const title = getDefaultSingleMetricViewerPanelTitle(jobIds); + const title = input?.title ?? getDefaultSingleMetricViewerPanelTitle(jobIds); const { jobs } = await mlApiServices.getJobs({ jobId: jobIds.join(',') }); const modalSession = overlays.openModal( toMountPoint( { + onCreate={(explicitInput) => { modalSession.close(); resolve({ jobIds, - title: panelTitle, - functionDescription, - panelTitle, - selectedDetectorIndex, - selectedEntities, + ...explicitInput, }); }} onCancel={() => { diff --git a/x-pack/plugins/ml/public/embeddables/types.ts b/x-pack/plugins/ml/public/embeddables/types.ts index 14ee0e7c6d444a..38032b7d80b91a 100644 --- a/x-pack/plugins/ml/public/embeddables/types.ts +++ b/x-pack/plugins/ml/public/embeddables/types.ts @@ -17,6 +17,8 @@ import type { HasType, PublishesUnifiedSearch, PublishesViewMode, + PublishesWritablePanelTitle, + PublishingSubject, } from '@kbn/presentation-publishing'; import type { JobId } from '../../common/types/anomaly_detection_jobs'; import type { MlDependencies } from '../application/app'; @@ -33,6 +35,7 @@ import type { MlResultsService } from '../application/services/results_service'; import type { MlTimeSeriesSearchService } from '../application/timeseriesexplorer/timeseriesexplorer_utils/time_series_search_service'; import type { AnomalyExplorerChartsEmbeddableType, + AnomalySingleMetricViewerEmbeddableType, AnomalySwimLaneEmbeddableType, MlEmbeddableTypes, } from './constants'; @@ -41,6 +44,8 @@ export type MlEmbeddableBaseApi = Partial< HasParentApi & PublishesViewMode & PublishesUnifiedSearch >; +export type MlEntity = Record; + /** Manual input by the user */ export interface AnomalySwimlaneEmbeddableUserInput { jobIds: JobId[]; @@ -122,7 +127,7 @@ export interface SingleMetricViewerEmbeddableCustomInput { functionDescription?: string; panelTitle: string; selectedDetectorIndex: number; - selectedEntities: MlEntityField[]; + selectedEntities?: MlEntity; // Embeddable inputs which are not included in the default interface filters: Filter[]; query: Query; @@ -133,6 +138,21 @@ export interface SingleMetricViewerEmbeddableCustomInput { export type SingleMetricViewerEmbeddableInput = EmbeddableInput & SingleMetricViewerEmbeddableCustomInput; +export interface SingleMetricViewerComponentApi { + functionDescription?: PublishingSubject; + jobIds: PublishingSubject; + selectedDetectorIndex: PublishingSubject; + selectedEntities?: PublishingSubject; + + updateUserInput: (input: Partial) => void; +} + +export interface SingleMetricViewerEmbeddableApi + extends HasType, + PublishesWritablePanelTitle, + MlEmbeddableBaseApi, + SingleMetricViewerComponentApi {} + export interface AnomalyChartsServices { anomalyDetectorService: AnomalyDetectorService; anomalyExplorerService: AnomalyExplorerChartsService; diff --git a/x-pack/plugins/ml/public/ui_actions/edit_single_metric_viewer_panel_action.tsx b/x-pack/plugins/ml/public/ui_actions/edit_single_metric_viewer_panel_action.tsx new file mode 100644 index 00000000000000..bb953b739d7127 --- /dev/null +++ b/x-pack/plugins/ml/public/ui_actions/edit_single_metric_viewer_panel_action.tsx @@ -0,0 +1,83 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 type { EmbeddableApiContext } from '@kbn/presentation-publishing'; +import type { UiActionsActionDefinition } from '@kbn/ui-actions-plugin/public'; +import { IncompatibleActionError } from '@kbn/ui-actions-plugin/public'; +import { isSingleMetricViewerEmbeddableContext } from './open_in_single_metric_viewer_action'; +import type { MlCoreSetup } from '../plugin'; +import { HttpService } from '../application/services/http_service'; +import type { + SingleMetricViewerEmbeddableInput, + SingleMetricViewerEmbeddableApi, +} from '../embeddables/types'; + +export const EDIT_SINGLE_METRIC_VIEWER_PANEL_ACTION = 'editSingleMetricViewerPanelAction'; + +export type EditSingleMetricViewerPanelActionContext = EmbeddableApiContext & { + embeddable: SingleMetricViewerEmbeddableApi; +}; + +export function createEditSingleMetricViewerPanelAction( + getStartServices: MlCoreSetup['getStartServices'] +): UiActionsActionDefinition { + return { + id: 'edit-single-metric-viewer', + type: EDIT_SINGLE_METRIC_VIEWER_PANEL_ACTION, + order: 50, + getIconType(): string { + return 'pencil'; + }, + getDisplayName: () => + i18n.translate('xpack.ml.actions.editSingleMetricViewerTitle', { + defaultMessage: 'Edit single metric viewer', + }), + async execute(context) { + if (!isSingleMetricViewerEmbeddableContext(context)) { + throw new IncompatibleActionError(); + } + + const [coreStart, pluginStart] = await getStartServices(); + + try { + const { resolveEmbeddableSingleMetricViewerUserInput } = await import( + '../embeddables/single_metric_viewer/single_metric_viewer_setup_flyout' + ); + + const { mlApiServicesProvider } = await import('../application/services/ml_api_service'); + const httpService = new HttpService(coreStart.http); + const mlApiServices = mlApiServicesProvider(httpService); + + const { jobIds, selectedEntities, selectedDetectorIndex, panelTitle } = context.embeddable; + + const result = await resolveEmbeddableSingleMetricViewerUserInput( + coreStart, + pluginStart, + mlApiServices, + { + jobIds: jobIds.getValue(), + selectedDetectorIndex: selectedDetectorIndex.getValue(), + selectedEntities: selectedEntities?.getValue(), + title: panelTitle?.getValue(), + } as SingleMetricViewerEmbeddableInput + ); + + context.embeddable.updateUserInput(result); + context.embeddable.setPanelTitle(result.panelTitle); + } catch (e) { + return Promise.reject(); + } + }, + async isCompatible(context: EmbeddableApiContext) { + return ( + isSingleMetricViewerEmbeddableContext(context) && + context.embeddable.viewMode?.getValue() === 'edit' + ); + }, + }; +} diff --git a/x-pack/plugins/ml/public/ui_actions/index.ts b/x-pack/plugins/ml/public/ui_actions/index.ts index e55b1fc1c7b003..1d0a7d39c28713 100644 --- a/x-pack/plugins/ml/public/ui_actions/index.ts +++ b/x-pack/plugins/ml/public/ui_actions/index.ts @@ -16,11 +16,13 @@ import { createApplyTimeRangeSelectionAction } from './apply_time_range_action'; import { createClearSelectionAction } from './clear_selection_action'; import { createEditAnomalyChartsPanelAction } from './edit_anomaly_charts_panel_action'; import { createEditSwimlanePanelAction } from './edit_swimlane_panel_action'; +import { createEditSingleMetricViewerPanelAction } from './edit_single_metric_viewer_panel_action'; import { createCategorizationADJobAction, createCategorizationADJobTrigger, } from './open_create_categorization_job_action'; import { createOpenInExplorerAction } from './open_in_anomaly_explorer_action'; +import { createOpenInSingleMetricViewerAction } from './open_in_single_metric_viewer_action'; import { createVisToADJobAction } from './open_vis_in_ml_action'; import { entityFieldSelectionTrigger, @@ -43,7 +45,13 @@ export function registerMlUiActions( ) { // Initialize actions const editSwimlanePanelAction = createEditSwimlanePanelAction(core.getStartServices); + const editSingleMetricViewerPanelAction = createEditSingleMetricViewerPanelAction( + core.getStartServices + ); const openInExplorerAction = createOpenInExplorerAction(core.getStartServices); + const openInSingleMetricViewerAction = createOpenInSingleMetricViewerAction( + core.getStartServices + ); const applyInfluencerFiltersAction = createApplyInfluencerFiltersAction(core.getStartServices); const applyEntityFieldFilterAction = createApplyEntityFieldFiltersAction(core.getStartServices); const applyTimeRangeSelectionAction = createApplyTimeRangeSelectionAction(core.getStartServices); @@ -59,8 +67,10 @@ export function registerMlUiActions( // Assign triggers uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editSwimlanePanelAction); + uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editSingleMetricViewerPanelAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, editExplorerPanelAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, openInExplorerAction); + uiActions.attachAction(CONTEXT_MENU_TRIGGER, openInSingleMetricViewerAction.id); uiActions.registerTrigger(swimLaneSelectionTrigger); uiActions.registerTrigger(entityFieldSelectionTrigger); @@ -69,6 +79,7 @@ export function registerMlUiActions( uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, applyInfluencerFiltersAction); uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, applyTimeRangeSelectionAction); uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, openInExplorerAction); + uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, openInSingleMetricViewerAction); uiActions.addTriggerAction(SWIM_LANE_SELECTION_TRIGGER, clearSelectionAction); uiActions.addTriggerAction(EXPLORER_ENTITY_FIELD_SELECTION_TRIGGER, applyEntityFieldFilterAction); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, visToAdJobAction); diff --git a/x-pack/plugins/ml/public/ui_actions/open_in_single_metric_viewer_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_in_single_metric_viewer_action.tsx new file mode 100644 index 00000000000000..7e13830ecdc5c8 --- /dev/null +++ b/x-pack/plugins/ml/public/ui_actions/open_in_single_metric_viewer_action.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { TimeRange } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; +import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import { type EmbeddableApiContext, apiIsOfType } from '@kbn/presentation-publishing'; +import { + type UiActionsActionDefinition, + IncompatibleActionError, +} from '@kbn/ui-actions-plugin/public'; +import { ML_APP_LOCATOR, ML_PAGES } from '../../common/constants/locator'; +import type { MlEmbeddableBaseApi, SingleMetricViewerEmbeddableApi } from '../embeddables'; +import { ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE } from '../embeddables'; + +import type { MlCoreSetup } from '../plugin'; + +export interface OpenInSingleMetricViewerActionContext extends EmbeddableApiContext { + embeddable: SingleMetricViewerEmbeddableApi; +} + +export const OPEN_IN_SINGLE_METRIC_VIEWER_ACTION = 'openInSingleMetricViewerAction'; + +export function isSingleMetricViewerEmbeddableContext( + arg: unknown +): arg is OpenInSingleMetricViewerActionContext { + return ( + isPopulatedObject(arg, ['embeddable']) && + apiIsOfType(arg.embeddable, ANOMALY_SINGLE_METRIC_VIEWER_EMBEDDABLE_TYPE) + ); +} + +const getTimeRange = (embeddable: MlEmbeddableBaseApi): TimeRange | undefined => { + return embeddable.timeRange$?.getValue() ?? embeddable.parentApi?.timeRange$?.getValue(); +}; + +export function createOpenInSingleMetricViewerAction( + getStartServices: MlCoreSetup['getStartServices'] +): UiActionsActionDefinition { + return { + id: 'open-in-single-metric-viewer', + type: OPEN_IN_SINGLE_METRIC_VIEWER_ACTION, + order: 100, + getIconType(): string { + return 'visLine'; + }, + getDisplayName() { + return i18n.translate('xpack.ml.actions.openInSingleMetricViewerTitle', { + defaultMessage: 'Open in Single Metric Viewer', + }); + }, + async getHref(context): Promise { + const [, pluginsStart] = await getStartServices(); + const locator = pluginsStart.share.url.locators.get(ML_APP_LOCATOR)!; + + if (isSingleMetricViewerEmbeddableContext(context)) { + const { embeddable } = context; + const { jobIds, query$, selectedEntities } = embeddable; + + return locator.getUrl( + { + page: ML_PAGES.SINGLE_METRIC_VIEWER, + // @ts-ignore entities is not compatible with SerializableRecord + pageState: { + timeRange: getTimeRange(embeddable), + refreshInterval: { + display: 'Off', + pause: true, + value: 0, + }, + jobIds: jobIds.getValue(), + query: query$?.getValue(), + entities: selectedEntities?.getValue(), + }, + }, + { absolute: true } + ); + } + }, + async execute(context) { + if (!isSingleMetricViewerEmbeddableContext(context)) { + throw new IncompatibleActionError(); + } + const [{ application }] = await getStartServices(); + const singleMetricViewerUrl = await this.getHref!(context); + if (singleMetricViewerUrl) { + await application.navigateToUrl(singleMetricViewerUrl!); + } + }, + async isCompatible(context: EmbeddableApiContext) { + return isSingleMetricViewerEmbeddableContext(context); + }, + }; +} diff --git a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx index e4ce56e8f5a549..84f053aafcaf57 100644 --- a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx @@ -28,7 +28,7 @@ export function createVisToADJobAction( }, getDisplayName: () => i18n.translate('xpack.ml.actions.createADJobFromLens', { - defaultMessage: 'Create anomaly detection job', + defaultMessage: 'Detect anomalies', }), async execute({ embeddable }: EmbeddableApiContext) { if (!embeddable) { diff --git a/x-pack/plugins/ml/server/routes/trained_models.ts b/x-pack/plugins/ml/server/routes/trained_models.ts index 27010e2c0d9920..6981443cadf043 100644 --- a/x-pack/plugins/ml/server/routes/trained_models.ts +++ b/x-pack/plugins/ml/server/routes/trained_models.ts @@ -10,7 +10,7 @@ import { groupBy } from 'lodash'; import { schema } from '@kbn/config-schema'; import type { ErrorType } from '@kbn/ml-error-utils'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; -import type { ElserVersion } from '@kbn/ml-trained-models-utils'; +import type { ElserVersion, InferenceAPIConfigResponse } from '@kbn/ml-trained-models-utils'; import { isDefined } from '@kbn/ml-is-defined'; import type { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; import { type MlFeatures, ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; @@ -31,10 +31,7 @@ import { createIngestPipelineSchema, modelDownloadsQuery, } from './schemas/inference_schema'; -import type { - InferenceAPIConfigResponse, - PipelineDefinition, -} from '../../common/types/trained_models'; +import type { PipelineDefinition } from '../../common/types/trained_models'; import { type TrainedModelConfigResponse } from '../../common/types/trained_models'; import { mlLog } from '../lib/log'; import { forceQuerySchema } from './schemas/anomaly_detectors_schema'; diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/rules/error_count.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/rules/error_count.cy.ts index 1a5d5b9bb16522..87cf228d62530d 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/rules/error_count.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/rules/error_count.cy.ts @@ -89,7 +89,8 @@ describe('Rules', () => { }); describe('when created from Stack management', () => { - it('creates a rule', () => { + // FIXME + it.skip('creates a rule', () => { cy.loginAsEditorUser(); // Go to stack management diff --git a/x-pack/plugins/observability_solution/apm/kibana.jsonc b/x-pack/plugins/observability_solution/apm/kibana.jsonc index e549a6b18883cd..800a669741b8ff 100644 --- a/x-pack/plugins/observability_solution/apm/kibana.jsonc +++ b/x-pack/plugins/observability_solution/apm/kibana.jsonc @@ -57,7 +57,8 @@ "kibanaUtils", "ml", "observability", - "maps" + "maps", + "observabilityAIAssistant" ] } } diff --git a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_contextual_insights.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_contextual_insights.tsx new file mode 100644 index 00000000000000..e6476dff265f56 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_contextual_insights.tsx @@ -0,0 +1,126 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { + createFunctionRequestMessage, + createFunctionResponseMessage, +} from '@kbn/observability-ai-assistant-plugin/public'; +import React, { useCallback } from 'react'; +import dedent from 'dedent'; + +import { i18n } from '@kbn/i18n'; +import { callApmApi } from '../../../../services/rest/create_call_apm_api'; +import { + CONTAINER_ID, + HOST_NAME, + SERVICE_ENVIRONMENT, + SERVICE_NAME, + TRANSACTION_NAME, + TRANSACTION_TYPE, +} from '../../../../../common/es_fields/apm'; +import { useKibana } from '../../../../context/kibana_context/use_kibana'; +import { AlertDetailsAppSectionProps } from './types'; + +export function AlertDetailContextualInsights({ + alert, +}: { + alert: AlertDetailsAppSectionProps['alert']; +}) { + const { + services: { observabilityAIAssistant }, + } = useKibana(); + + const ObservabilityAIAssistantContextualInsight = + observabilityAIAssistant?.ObservabilityAIAssistantContextualInsight; + + const getPromptMessages = useCallback(async () => { + const { + serviceSummary, + downstreamDependencies, + logCategories, + serviceChangePoints, + exitSpanChangePoints, + anomalies, + } = await callApmApi( + 'GET /internal/apm/assistant/get_apm_alert_details_context', + { + signal: null, + params: { + query: { + [SERVICE_NAME]: alert.fields[SERVICE_NAME], + [HOST_NAME]: alert.fields[HOST_NAME], + [CONTAINER_ID]: alert.fields[CONTAINER_ID], + [SERVICE_ENVIRONMENT]: alert.fields[SERVICE_ENVIRONMENT], + [TRANSACTION_TYPE]: alert.fields[TRANSACTION_TYPE], + [TRANSACTION_NAME]: alert.fields[TRANSACTION_NAME], + alert_started_at: new Date(alert.start).toISOString(), + }, + }, + } + ); + + const serviceName = alert.fields[SERVICE_NAME]; + const serviceEnvironment = alert.fields[SERVICE_ENVIRONMENT]; + + const content = { + apmAlertContext: dedent( + `High level information about the service where the alert occurred. Use this as background but do not repeat this information to the user. + ${JSON.stringify(serviceSummary)} + + Downstream dependencies from the service "${serviceName}". Problems in these services can negatively affect the performance of "${serviceName}": + ${JSON.stringify(downstreamDependencies)} + + Significant change points for "${serviceName}". Use this to spot dips or spikes in throughput, latency and failure rate. + ${JSON.stringify(serviceChangePoints)} + + Significant change points for the dependencies of "${serviceName}". Use this to spot dips or spikes in throughput, latency and failure rate for downstream dependencies: + ${JSON.stringify(exitSpanChangePoints)} + + Log events occurring around the time of the alert. The log messages can sometimes diagnose the root cause of the alert: + ${JSON.stringify(logCategories)} + + Anomalies for services running in the environment "${serviceEnvironment}" + ${anomalies} + + Help the user understand the root cause of the alert by using the above information. Suggest actions the user should take to investigate further. + ` + ), + }; + + return [ + createFunctionRequestMessage({ + name: 'get_apm_alert_details_context', + args: {}, + }).message, + + createFunctionResponseMessage({ + name: 'get_apm_alert_details_context', + content, + data: content, + }).message, + ]; + }, [alert]); + + if (!ObservabilityAIAssistantContextualInsight) { + return null; + } + + return ( + + + + + + ); +} diff --git a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx index f7e3d19694183b..07fa0129647afe 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/alerting/ui_components/alert_details_app_section/index.tsx @@ -22,7 +22,12 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { getPaddedAlertTimeRange } from '@kbn/observability-get-padded-alert-time-range-util'; import { EuiCallOut } from '@elastic/eui'; import { CoreStart } from '@kbn/core/public'; -import { SERVICE_ENVIRONMENT } from '../../../../../common/es_fields/apm'; +import { + SERVICE_ENVIRONMENT, + SERVICE_NAME, + TRANSACTION_NAME, + TRANSACTION_TYPE, +} from '../../../../../common/es_fields/apm'; import { ChartPointerEventContextProvider } from '../../../../context/chart_pointer_event/chart_pointer_event_context'; import { TimeRangeMetadataContextProvider } from '../../../../context/time_range_metadata/time_range_metadata_context'; import { getComparisonChartTheme } from '../../../shared/time_comparison/get_comparison_chart_theme'; @@ -31,13 +36,9 @@ import { getAggsTypeFromRule } from './helpers'; import { LatencyAlertsHistoryChart } from './latency_alerts_history_chart'; import LatencyChart from './latency_chart'; import ThroughputChart from './throughput_chart'; -import { - AlertDetailsAppSectionProps, - SERVICE_NAME, - TRANSACTION_TYPE, - TRANSACTION_NAME, -} from './types'; +import { AlertDetailsAppSectionProps } from './types'; import { createCallApmApi } from '../../../../services/rest/create_call_apm_api'; +import { AlertDetailContextualInsights } from './alert_details_contextual_insights'; export function AlertDetailsAppSection({ rule, @@ -51,6 +52,7 @@ export function AlertDetailsAppSection({ const alertRuleTypeId = alert.fields[ALERT_RULE_TYPE_ID]; const alertEvaluationValue = alert.fields[ALERT_EVALUATION_VALUE]; const alertEvaluationThreshold = alert.fields[ALERT_EVALUATION_THRESHOLD]; + const environment = alert.fields[SERVICE_ENVIRONMENT]; const serviceName = String(alert.fields[SERVICE_NAME]); const transactionName = alert.fields[TRANSACTION_NAME]; @@ -100,6 +102,19 @@ export function AlertDetailsAppSection({ ), value: serviceName, }, + ...(transactionName + ? [ + { + label: ( + + ), + value: transactionName, + }, + ] + : []), ]; setAlertSummaryFields(alertSummaryFields); }, [ @@ -108,6 +123,7 @@ export function AlertDetailsAppSection({ alertEvaluationThreshold, environment, serviceName, + transactionName, setAlertSummaryFields, ]); @@ -150,6 +166,8 @@ export function AlertDetailsAppSection({ return ( + + ; timeZone: string; setAlertSummaryFields: React.Dispatch< diff --git a/x-pack/plugins/observability_solution/apm/public/context/kibana_context/use_kibana.tsx b/x-pack/plugins/observability_solution/apm/public/context/kibana_context/use_kibana.tsx new file mode 100644 index 00000000000000..b36a4a1dea35be --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/public/context/kibana_context/use_kibana.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreStart } from '@kbn/core/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { type ApmPluginStartDeps } from '../../plugin'; + +export type StartServices = CoreStart & + ApmPluginStartDeps & + AdditionalServices; + +const useTypedKibana = () => + useKibana>(); + +export { useTypedKibana as useKibana }; diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts index 0440f684eeedd7..c82f5cb343eeab 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_downstream_dependencies.ts @@ -18,7 +18,7 @@ export function registerGetApmDownstreamDependenciesFunction({ name: 'get_apm_downstream_dependencies', contexts: ['apm'], description: `Get the downstream dependencies (services or uninstrumented backends) for a - service. This allows you to map the dowstream dependency name to a service, by + service. This allows you to map the downstream dependency name to a service, by returning both span.destination.service.resource and service.name. Use this to drilldown further if needed.`, descriptionForUser: i18n.translate( diff --git a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts index 178d47f8d33edf..ff8c62bbcd2dae 100644 --- a/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts +++ b/x-pack/plugins/observability_solution/apm/server/assistant_functions/get_apm_services_list.ts @@ -5,28 +5,15 @@ * 2.0. */ -import datemath from '@elastic/datemath'; import { i18n } from '@kbn/i18n'; import { FunctionRegistrationParameters } from '.'; -import { ApmDocumentType } from '../../common/document_type'; -import { ENVIRONMENT_ALL } from '../../common/environment_filter_values'; -import { RollupInterval } from '../../common/rollup'; import { ServiceHealthStatus } from '../../common/service_health_status'; import { getApmAlertsClient } from '../lib/helpers/get_apm_alerts_client'; import { getMlClient } from '../lib/helpers/get_ml_client'; import { getRandomSampler } from '../lib/helpers/get_random_sampler'; -import { getServicesItems } from '../routes/services/get_services/get_services_items'; +import { getApmServiceList } from '../routes/assistant_functions/get_apm_service_list'; import { NON_EMPTY_STRING } from '../utils/non_empty_string_ref'; -export interface ApmServicesListItem { - 'service.name': string; - 'agent.name'?: string; - 'transaction.type'?: string; - alertsCount: number; - healthStatus: ServiceHealthStatus; - 'service.environment'?: string[]; -} - export function registerGetApmServicesListFunction({ apmEventClient, resources, @@ -45,7 +32,6 @@ export function registerGetApmServicesListFunction({ ), parameters: { type: 'object', - additionalProperties: false, properties: { 'service.environment': { ...NON_EMPTY_STRING, @@ -65,8 +51,6 @@ export function registerGetApmServicesListFunction({ healthStatus: { type: 'array', description: 'Filter service list by health status', - additionalProperties: false, - additionalItems: false, items: { type: 'string', enum: [ @@ -82,7 +66,7 @@ export function registerGetApmServicesListFunction({ } as const, }, async ({ arguments: args }, signal) => { - const { healthStatus } = args; + const { logger } = resources; const [apmAlertsClient, mlClient, randomSampler] = await Promise.all([ getApmAlertsClient(resources), getMlClient(resources), @@ -93,44 +77,15 @@ export function registerGetApmServicesListFunction({ }), ]); - const start = datemath.parse(args.start)?.valueOf()!; - const end = datemath.parse(args.end)?.valueOf()!; - - const serviceItems = await getServicesItems({ - apmAlertsClient, - apmEventClient, - documentType: ApmDocumentType.TransactionMetric, - start, - end, - environment: args['service.environment'] || ENVIRONMENT_ALL.value, - kuery: '', - logger: resources.logger, - randomSampler, - rollupInterval: RollupInterval.OneMinute, - serviceGroup: null, - mlClient, - useDurationSummary: false, - }); - - let mappedItems = serviceItems.items.map((item): ApmServicesListItem => { - return { - 'service.name': item.serviceName, - 'agent.name': item.agentName, - alertsCount: item.alertsCount ?? 0, - healthStatus: item.healthStatus ?? ServiceHealthStatus.unknown, - 'service.environment': item.environments, - 'transaction.type': item.transactionType, - }; - }); - - if (healthStatus && healthStatus.length) { - mappedItems = mappedItems.filter((item): boolean => - healthStatus.includes(item.healthStatus) - ); - } - return { - content: mappedItems, + content: await getApmServiceList({ + apmEventClient, + apmAlertsClient, + randomSampler, + mlClient, + logger, + arguments: args, + }), }; } ); diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts index 071969cae7251c..f06411e9b8535b 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_random_sampler/index.ts @@ -9,6 +9,8 @@ import { KibanaRequest } from '@kbn/core/server'; import seedrandom from 'seedrandom'; import { APMRouteHandlerResources } from '../../../routes/apm_routes/register_apm_server_routes'; +export type RandomSampler = Awaited>; + export async function getRandomSampler({ security, request, @@ -35,5 +37,3 @@ export async function getRandomSampler({ seed, }; } - -export type RandomSampler = Awaited>; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts index 526fcc4b09701a..761e2f5faa0b57 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/register_apm_rule_types.ts @@ -23,8 +23,10 @@ import { legacyExperimentalFieldMap } from '@kbn/alerts-as-data-utils'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; import { AGENT_NAME, + CONTAINER_ID, ERROR_GROUP_ID, ERROR_GROUP_NAME, + HOST_NAME, PROCESSOR_EVENT, SERVICE_ENVIRONMENT, SERVICE_LANGUAGE_NAME, @@ -50,6 +52,14 @@ export const apmRuleTypeAlertFieldMap = { type: 'keyword', required: false, }, + [HOST_NAME]: { + type: 'keyword', + required: false, + }, + [CONTAINER_ID]: { + type: 'keyword', + required: false, + }, [TRANSACTION_TYPE]: { type: 'keyword', required: false, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts index 168d4456d3f2cd..cde1ba830b2cc1 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts @@ -18,7 +18,7 @@ import { } from '../../../../../common/es_fields/apm'; import { alertingEsClient } from '../../alerting_es_client'; import { - getServiceGroupFields, + getApmAlertSourceFields, getServiceGroupFieldsAgg, } from '../get_service_group_fields'; @@ -78,5 +78,5 @@ export async function getServiceGroupFieldsForAnomaly({ if (!response.aggregations) { return {}; } - return getServiceGroupFields(response.aggregations); + return getApmAlertSourceFields(response.aggregations); } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts index 786332a8f4196a..2a67764fb17b58 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts @@ -62,7 +62,7 @@ import { RegisterRuleDependencies, } from '../../register_apm_rule_types'; import { - getServiceGroupFields, + getApmAlertSourceFields, getServiceGroupFieldsAgg, } from '../get_service_group_fields'; import { getGroupByTerms } from '../utils/get_groupby_terms'; @@ -225,7 +225,7 @@ export function registerErrorCountRuleType({ return { errorCount: bucket.doc_count, - sourceFields: getServiceGroupFields(bucket), + sourceFields: getApmAlertSourceFields(bucket), groupByFields, bucketKey, }; diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.test.ts index 231d1d1ff9939b..3acd1543010e5e 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.test.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.test.ts @@ -6,7 +6,7 @@ */ import { - getServiceGroupFields, + getApmAlertSourceFields, getServiceGroupFieldsAgg, flattenSourceDoc, } from './get_service_group_fields'; @@ -19,6 +19,12 @@ const mockSourceObj = { name: 'typescript', }, }, + container: { + id: 'my-container', + }, + host: { + name: 'my-host', + }, labels: { team: 'test', event: ['event-0', 'event-1'], @@ -38,10 +44,12 @@ const mockBucket = { describe('getSourceFields', () => { it('should return a flattened record of fields and values for a given bucket except for labels', () => { - const result = getServiceGroupFields(mockBucket); + const result = getApmAlertSourceFields(mockBucket); expect(result).toMatchInlineSnapshot(` Object { "agent.name": "nodejs", + "container.id": "my-container", + "host.name": "my-host", "labels": Object { "event": Array [ "event-0", @@ -71,6 +79,8 @@ describe('getSourceFieldsAgg', () => { "service.environment", "service.language.name", "labels", + "host.name", + "container.id", ], }, "size": 1, @@ -95,6 +105,8 @@ describe('getSourceFieldsAgg', () => { "service.environment", "service.language.name", "labels", + "host.name", + "container.id", ], }, "size": 1, @@ -118,6 +130,8 @@ describe('flattenSourceDoc', () => { expect(result).toMatchInlineSnapshot(` Object { "agent.name": "nodejs", + "container.id": "my-container", + "host.name": "my-host", "labels": Object { "event": Array [ "event-0", diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.ts index 4964bd2f4c9cc7..97de147fa52f9c 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/get_service_group_fields.ts @@ -6,11 +6,18 @@ */ import { AggregationsTopHitsAggregation } from '@elastic/elasticsearch/lib/api/types'; +import { CONTAINER_ID, HOST_NAME } from '../../../../common/es_fields/apm'; import { LABELS, SERVICE_GROUP_SUPPORTED_FIELDS, } from '../../../../common/service_groups'; +const APM_ALERT_SOURCE_FIELDS = [ + ...SERVICE_GROUP_SUPPORTED_FIELDS, + HOST_NAME, + CONTAINER_ID, +]; + export interface SourceDoc { [key: string]: string | string[] | SourceDoc; } @@ -23,7 +30,7 @@ export function getServiceGroupFieldsAgg( top_hits: { size: 1, _source: { - includes: SERVICE_GROUP_SUPPORTED_FIELDS, + includes: APM_ALERT_SOURCE_FIELDS, }, ...topHitsOpts, }, @@ -39,7 +46,7 @@ interface AggResultBucket { }; } -export function getServiceGroupFields(bucket?: AggResultBucket) { +export function getApmAlertSourceFields(bucket?: AggResultBucket) { if (!bucket) { return {}; } diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts index 580c22d0944564..6ee99dd8d89ed9 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts @@ -73,7 +73,7 @@ import { RegisterRuleDependencies, } from '../../register_apm_rule_types'; import { - getServiceGroupFields, + getApmAlertSourceFields, getServiceGroupFieldsAgg, } from '../get_service_group_fields'; import { @@ -276,7 +276,7 @@ export function registerTransactionDurationRuleType({ transactionDuration > thresholdMicroseconds ) { triggeredBuckets.push({ - sourceFields: getServiceGroupFields(bucket), + sourceFields: getApmAlertSourceFields(bucket), transactionDuration, groupByFields, bucketKey, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts index 2eabee53c8d22b..f80ce41953b7d0 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts @@ -58,7 +58,7 @@ import { RegisterRuleDependencies, } from '../../register_apm_rule_types'; import { - getServiceGroupFields, + getApmAlertSourceFields, getServiceGroupFieldsAgg, } from '../get_service_group_fields'; import { getGroupByTerms } from '../utils/get_groupby_terms'; @@ -253,7 +253,7 @@ export function registerTransactionErrorRateRuleType({ if (errorRate >= ruleParams.threshold) { results.push({ errorRate, - sourceFields: getServiceGroupFields(failedOutcomeBucket), + sourceFields: getApmAlertSourceFields(failedOutcomeBucket), groupByFields, bucketKey, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_alert_details_context/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_alert_details_context/index.ts new file mode 100644 index 00000000000000..b69235d43a1531 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_alert_details_context/index.ts @@ -0,0 +1,240 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { ScopedAnnotationsClient } from '@kbn/observability-plugin/server'; +import type { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { CoreRequestHandlerContext, Logger } from '@kbn/core/server'; +import moment from 'moment'; +import * as t from 'io-ts'; +import { LatencyAggregationType } from '../../../../common/latency_aggregation_types'; +import type { MlClient } from '../../../lib/helpers/get_ml_client'; +import type { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import type { ApmAlertsClient } from '../../../lib/helpers/get_apm_alerts_client'; +import { getApmServiceSummary } from '../get_apm_service_summary'; +import { getAssistantDownstreamDependencies } from '../get_apm_downstream_dependencies'; +import { getLogCategories } from '../get_log_categories'; +import { + ApmTimeseriesType, + getApmTimeseries, + TimeseriesChangePoint, +} from '../get_apm_timeseries'; +import { getAnomalies } from '../get_apm_service_summary/get_anomalies'; + +export const apmAlertDetailsContextRt = t.intersection([ + t.type({ + 'service.name': t.string, + alert_started_at: t.string, + }), + t.partial({ + 'service.environment': t.string, + 'transaction.type': t.string, + 'transaction.name': t.string, + + // alert fields + 'host.name': t.string, + 'container.id': t.string, + }), +]); + +export async function getApmAlertDetailsContext({ + coreContext, + alertStartedAt, + annotationsClient, + apmAlertsClient, + apmEventClient, + esClient, + logger, + mlClient, + query, +}: { + coreContext: CoreRequestHandlerContext; + annotationsClient?: ScopedAnnotationsClient; + apmAlertsClient: ApmAlertsClient; + alertStartedAt: string; + apmEventClient: APMEventClient; + esClient: ElasticsearchClient; + logger: Logger; + mlClient?: MlClient; + query: t.TypeOf; +}) { + const serviceSummaryPromise = getApmServiceSummary({ + apmEventClient, + annotationsClient, + esClient, + apmAlertsClient, + mlClient, + logger, + arguments: { + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + start: moment(alertStartedAt).subtract(5, 'minute').toISOString(), + end: alertStartedAt, + }, + }); + + const downstreamDependenciesPromise = getAssistantDownstreamDependencies({ + apmEventClient, + arguments: { + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + start: moment(alertStartedAt).subtract(5, 'minute').toISOString(), + end: alertStartedAt, + }, + }); + + const logCategoriesPromise = getLogCategories({ + esClient, + coreContext, + arguments: { + start: moment(alertStartedAt).subtract(5, 'minute').toISOString(), + end: alertStartedAt, + 'service.name': query['service.name'], + 'host.name': query['host.name'], + 'container.id': query['container.id'], + }, + }); + + const serviceTimeseriesPromise = getApmTimeseries({ + apmEventClient, + arguments: { + start: moment(alertStartedAt).subtract(12, 'hours').toISOString(), + end: alertStartedAt, + stats: [ + { + title: 'Latency', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.transactionLatency, + function: LatencyAggregationType.p95, + 'transaction.type': query['transaction.type'], + 'transaction.name': query['transaction.name'], + }, + }, + { + title: 'Throughput', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.transactionThroughput, + 'transaction.type': query['transaction.type'], + 'transaction.name': query['transaction.name'], + }, + }, + { + title: 'Failure rate', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.transactionFailureRate, + 'transaction.type': query['transaction.type'], + 'transaction.name': query['transaction.name'], + }, + }, + { + title: 'Error events', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.errorEventRate, + }, + }, + ], + }, + }); + + const exitSpanTimeseriesPromise = getApmTimeseries({ + apmEventClient, + arguments: { + start: moment(alertStartedAt).subtract(30, 'minute').toISOString(), + end: alertStartedAt, + stats: [ + { + title: 'Exit span latency', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.exitSpanLatency, + }, + }, + { + title: 'Exit span failure rate', + 'service.name': query['service.name'], + 'service.environment': query['service.environment'], + timeseries: { + name: ApmTimeseriesType.exitSpanFailureRate, + }, + }, + ], + }, + }); + + const anomaliesPromise = getAnomalies({ + start: moment(alertStartedAt).subtract(1, 'hour').valueOf(), + end: moment(alertStartedAt).valueOf(), + environment: query['service.environment'], + mlClient, + logger, + }); + + const [ + serviceSummary, + downstreamDependencies, + logCategories, + serviceTimeseries, + exitSpanTimeseries, + anomalies, + ] = await Promise.all([ + serviceSummaryPromise, + downstreamDependenciesPromise, + logCategoriesPromise, + serviceTimeseriesPromise, + exitSpanTimeseriesPromise, + anomaliesPromise, + ]); + + const serviceChangePoints = serviceTimeseries.map( + ( + timeseries + ): { + title: string; + grouping: string; + changes: TimeseriesChangePoint[]; + } => { + return { + title: timeseries.stat.title, + grouping: timeseries.id, + changes: timeseries.changes, + }; + } + ); + + const exitSpanChangePoints = exitSpanTimeseries.map( + ( + timeseries + ): { + title: string; + grouping: string; + changes: TimeseriesChangePoint[]; + } => { + return { + title: timeseries.stat.title, + grouping: timeseries.id, + changes: timeseries.changes, + }; + } + ); + + return { + serviceSummary, + downstreamDependencies, + logCategories, + serviceChangePoints, + exitSpanChangePoints, + anomalies, + }; +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_list/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_list/index.ts new file mode 100644 index 00000000000000..0e28ec97feda2e --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_list/index.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 datemath from '@elastic/datemath'; +import { Logger } from '@kbn/core/server'; +import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; +import { RollupInterval } from '../../../../common/rollup'; +import { ApmDocumentType } from '../../../../common/document_type'; +import { ApmAlertsClient } from '../../../lib/helpers/get_apm_alerts_client'; +import { ServiceHealthStatus } from '../../../../common/service_health_status'; +import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; +import { MlClient } from '../../../lib/helpers/get_ml_client'; +import { getServicesItems } from '../../services/get_services/get_services_items'; +import { RandomSampler } from '../../../lib/helpers/get_random_sampler'; + +export interface ApmServicesListItem { + 'service.name': string; + 'agent.name'?: string; + 'transaction.type'?: string; + alertsCount: number; + healthStatus: ServiceHealthStatus; + 'service.environment'?: string[]; +} + +export async function getApmServiceList({ + arguments: args, + apmEventClient, + mlClient, + apmAlertsClient, + logger, + randomSampler, +}: { + arguments: { + 'service.environment'?: string | undefined; + healthStatus?: ServiceHealthStatus[] | undefined; + start: string; + end: string; + }; + apmEventClient: APMEventClient; + mlClient?: MlClient; + apmAlertsClient: ApmAlertsClient; + logger: Logger; + randomSampler: RandomSampler; +}): Promise { + const { healthStatus } = args; + + const start = datemath.parse(args.start)?.valueOf()!; + const end = datemath.parse(args.end)?.valueOf()!; + + const serviceItems = await getServicesItems({ + apmAlertsClient, + apmEventClient, + documentType: ApmDocumentType.TransactionMetric, + start, + end, + environment: args['service.environment'] || ENVIRONMENT_ALL.value, + kuery: '', + logger, + randomSampler, + rollupInterval: RollupInterval.OneMinute, + serviceGroup: null, + mlClient, + useDurationSummary: false, + }); + + let mappedItems = serviceItems.items.map((item) => { + return { + 'service.name': item.serviceName, + 'agent.name': item.agentName, + alertsCount: item.alertsCount ?? 0, + healthStatus: item.healthStatus ?? ServiceHealthStatus.unknown, + 'service.environment': item.environments, + 'transaction.type': item.transactionType, + }; + }); + + if (healthStatus && healthStatus.length) { + mappedItems = mappedItems.filter((item): boolean => + healthStatus.includes(item.healthStatus) + ); + } + + return mappedItems; +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/get_anomalies.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/get_anomalies.ts new file mode 100644 index 00000000000000..536a08ef5adddc --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/get_anomalies.ts @@ -0,0 +1,184 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { rangeQuery } from '@kbn/observability-plugin/server'; +import { compact, keyBy } from 'lodash'; +import { + SERVICE_ENVIRONMENT, + SERVICE_NAME, + TRANSACTION_TYPE, +} from '../../../../common/es_fields/apm'; +import { + AnomalyDetectorType, + getAnomalyDetectorType, +} from '../../../../common/anomaly_detection/apm_ml_detectors'; +import { asMutableArray } from '../../../../common/utils/as_mutable_array'; +import { maybe } from '../../../../common/utils/maybe'; +import { anomalySearch } from '../../../lib/anomaly_detection/anomaly_search'; +import { apmMlAnomalyQuery } from '../../../lib/anomaly_detection/apm_ml_anomaly_query'; +import { apmMlJobsQuery } from '../../../lib/anomaly_detection/apm_ml_jobs_query'; +import { getMlJobsWithAPMGroup } from '../../../lib/anomaly_detection/get_ml_jobs_with_apm_group'; +import { MlClient } from '../../../lib/helpers/get_ml_client'; + +export type ApmAnomalies = Awaited>; + +export async function getAnomalies({ + serviceName, + transactionType, + environment, + start, + end, + mlClient, + logger, +}: { + serviceName?: string; + transactionType?: string; + environment?: string; + start: number; + end: number; + mlClient?: MlClient; + logger: Logger; +}) { + if (!mlClient) { + return []; + } + + const mlJobs = ( + await getMlJobsWithAPMGroup(mlClient.anomalyDetectors) + ).filter((job) => job.environment === environment); + + if (!mlJobs.length) { + return []; + } + + const anomaliesResponse = await anomalySearch( + mlClient.mlSystem.mlAnomalySearch, + { + body: { + size: 0, + query: { + bool: { + filter: [ + ...apmMlAnomalyQuery({ serviceName, transactionType }), + ...rangeQuery(start, end, 'timestamp'), + ...apmMlJobsQuery(mlJobs), + ], + }, + }, + aggs: { + by_timeseries_id: { + composite: { + size: 5000, + sources: asMutableArray([ + { + jobId: { + terms: { + field: 'job_id', + }, + }, + }, + { + detectorIndex: { + terms: { + field: 'detector_index', + }, + }, + }, + { + serviceName: { + terms: { + field: 'partition_field_value', + }, + }, + }, + { + transactionType: { + terms: { + field: 'by_field_value', + }, + }, + }, + ] as const), + }, + aggs: { + record_scores: { + filter: { + term: { + result_type: 'record', + }, + }, + aggs: { + top_anomaly: { + top_metrics: { + metrics: asMutableArray([ + { field: 'record_score' }, + { field: 'actual' }, + { field: 'timestamp' }, + ] as const), + size: 1, + sort: { + record_score: 'desc', + }, + }, + }, + }, + }, + model_lower: { + min: { + field: 'model_lower', + }, + }, + model_upper: { + max: { + field: 'model_upper', + }, + }, + }, + }, + }, + }, + } + ); + + const jobsById = keyBy(mlJobs, (job) => job.jobId); + + const anomalies = + anomaliesResponse.aggregations?.by_timeseries_id.buckets.map((bucket) => { + const jobId = bucket.key.jobId as string; + const job = maybe(jobsById[jobId]); + + if (!job) { + logger.warn(`Could not find job for id ${jobId}`); + return undefined; + } + + const type = getAnomalyDetectorType(Number(bucket.key.detectorIndex)); + + // ml failure rate is stored as 0-100, we calculate failure rate as 0-1 + const divider = type === AnomalyDetectorType.txFailureRate ? 100 : 1; + + const metrics = bucket.record_scores.top_anomaly.top[0]?.metrics; + + if (!metrics) { + return undefined; + } + + return { + '@timestamp': new Date(metrics.timestamp as number).toISOString(), + metricName: type.replace('tx', 'transaction'), + [SERVICE_NAME]: bucket.key.serviceName as string, + [SERVICE_ENVIRONMENT]: job.environment, + [TRANSACTION_TYPE]: bucket.key.transactionType as string, + anomalyScore: metrics.record_score, + actualValue: Number(metrics.actual) / divider, + expectedBoundsLower: Number(bucket.model_lower.value) / divider, + expectedBoundsUpper: Number(bucket.model_upper.value) / divider, + }; + }); + + return compact(anomalies); +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts index d794cb14251b0b..376afb16b9b436 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts @@ -16,28 +16,18 @@ import { ALERT_STATUS_ACTIVE, } from '@kbn/rule-registry-plugin/common/technical_rule_data_field_names'; import * as t from 'io-ts'; -import { compact, keyBy } from 'lodash'; -import { - AnomalyDetectorType, - getAnomalyDetectorType, -} from '../../../../common/anomaly_detection/apm_ml_detectors'; import { ENVIRONMENT_ALL } from '../../../../common/environment_filter_values'; import { Environment } from '../../../../common/environment_rt'; import { SERVICE_NAME } from '../../../../common/es_fields/apm'; -import { asMutableArray } from '../../../../common/utils/as_mutable_array'; import { environmentQuery } from '../../../../common/utils/environment_query'; -import { maybe } from '../../../../common/utils/maybe'; import { termQuery } from '../../../../common/utils/term_query'; -import { anomalySearch } from '../../../lib/anomaly_detection/anomaly_search'; -import { apmMlAnomalyQuery } from '../../../lib/anomaly_detection/apm_ml_anomaly_query'; -import { apmMlJobsQuery } from '../../../lib/anomaly_detection/apm_ml_jobs_query'; -import { getMlJobsWithAPMGroup } from '../../../lib/anomaly_detection/get_ml_jobs_with_apm_group'; import { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { ApmAlertsClient } from '../../../lib/helpers/get_apm_alerts_client'; import { MlClient } from '../../../lib/helpers/get_ml_client'; import { getEnvironments } from '../../environments/get_environments'; import { getServiceAnnotations } from '../../services/annotations'; import { getServiceMetadataDetails } from '../../services/get_service_metadata_details'; +import { getAnomalies } from './get_anomalies'; export const serviceSummaryRouteRt = t.intersection([ t.type({ @@ -51,166 +41,6 @@ export const serviceSummaryRouteRt = t.intersection([ }), ]); -async function getAnomalies({ - serviceName, - transactionType, - environment, - start, - end, - mlClient, - logger, -}: { - serviceName: string; - transactionType?: string; - environment?: string; - start: number; - end: number; - mlClient?: MlClient; - logger: Logger; -}) { - if (!mlClient) { - return []; - } - - const mlJobs = ( - await getMlJobsWithAPMGroup(mlClient.anomalyDetectors) - ).filter((job) => job.environment !== environment); - - if (!mlJobs.length) { - return []; - } - - const anomaliesResponse = await anomalySearch( - mlClient.mlSystem.mlAnomalySearch, - { - body: { - size: 0, - query: { - bool: { - filter: [ - ...apmMlAnomalyQuery({ - serviceName, - transactionType, - }), - ...rangeQuery(start, end, 'timestamp'), - ...apmMlJobsQuery(mlJobs), - ], - }, - }, - aggs: { - by_timeseries_id: { - composite: { - size: 5000, - sources: asMutableArray([ - { - jobId: { - terms: { - field: 'job_id', - }, - }, - }, - { - detectorIndex: { - terms: { - field: 'detector_index', - }, - }, - }, - { - serviceName: { - terms: { - field: 'partition_field_value', - }, - }, - }, - { - transactionType: { - terms: { - field: 'by_field_value', - }, - }, - }, - ] as const), - }, - aggs: { - record_scores: { - filter: { - term: { - result_type: 'record', - }, - }, - aggs: { - top_anomaly: { - top_metrics: { - metrics: asMutableArray([ - { field: 'record_score' }, - { field: 'actual' }, - { field: 'timestamp' }, - ] as const), - size: 1, - sort: { - record_score: 'desc', - }, - }, - }, - }, - }, - model_lower: { - min: { - field: 'model_lower', - }, - }, - model_upper: { - max: { - field: 'model_upper', - }, - }, - }, - }, - }, - }, - } - ); - - const jobsById = keyBy(mlJobs, (job) => job.jobId); - - const anomalies = - anomaliesResponse.aggregations?.by_timeseries_id.buckets.map((bucket) => { - const jobId = bucket.key.jobId as string; - const job = maybe(jobsById[jobId]); - - if (!job) { - logger.warn(`Could not find job for id ${jobId}`); - return undefined; - } - - const type = getAnomalyDetectorType(Number(bucket.key.detectorIndex)); - - // ml failure rate is stored as 0-100, we calculate failure rate as 0-1 - const divider = type === AnomalyDetectorType.txFailureRate ? 100 : 1; - - const metrics = bucket.record_scores.top_anomaly.top[0]?.metrics; - - if (!metrics) { - return undefined; - } - - return { - '@timestamp': new Date(metrics.timestamp as number).toISOString(), - metricName: type.replace('tx', 'transaction'), - 'service.name': bucket.key.serviceName as string, - 'service.environment': job.environment, - 'transaction.type': bucket.key.transactionType as string, - anomalyScore: metrics.record_score, - actualValue: Number(metrics.actual) / divider, - expectedBoundsLower: Number(bucket.model_lower.value) / divider, - expectedBoundsUpper: Number(bucket.model_upper.value) / divider, - }; - }); - - return compact(anomalies); -} - export interface ServiceSummary { 'service.name': string; 'service.environment': string[]; @@ -281,7 +111,7 @@ export async function getApmServiceSummary({ serviceName, start, end, - environment, + environment: args['service.environment'], mlClient, logger, transactionType, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/fetch_timeseries.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/fetch_timeseries.ts index 423f4908ea9024..b266348c1ea290 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/fetch_timeseries.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/fetch_timeseries.ts @@ -50,7 +50,7 @@ export interface FetchSeriesProps { start: number; end: number; filter?: QueryDslQueryContainer[]; - groupBy?: string; + groupByFields: string[]; aggs: T; unit: 'ms' | 'rpm' | '%'; } @@ -64,7 +64,7 @@ export async function fetchSeries({ start, end, filter, - groupBy, + groupByFields, aggs, unit, }: FetchSeriesProps): Promise>> { @@ -81,18 +81,18 @@ export async function fetchSeries({ }, }, aggs: { - groupBy: { - ...(groupBy + groups: { + ...(groupByFields.length === 1 ? { terms: { - field: groupBy, size: 20, + field: groupByFields[0], }, } : { - terms: { - field: 'non_existing_field', - missing: '', + multi_terms: { + size: 20, + terms: groupByFields.map((field) => ({ field })), }, }), aggs: { @@ -117,15 +117,16 @@ export async function fetchSeries({ }, }); - if (!response.aggregations?.groupBy) { + if (!response.aggregations?.groups) { return []; } - return response.aggregations.groupBy.buckets.map((bucket) => { + return response.aggregations.groups.buckets.map((bucket) => { + const bucketValue = bucket.value as ValueAggregationMap | undefined; let value = - bucket.value?.value === undefined || bucket.value?.value === null + bucketValue?.value === undefined || bucketValue?.value === null ? null - : Number(bucket.value.value); + : Number(bucketValue.value); if (value !== null) { value = diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_error_event_rate.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_error_event_rate.ts index 9022d4fc87e4b2..2654c085fef15b 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_error_event_rate.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_error_event_rate.ts @@ -6,6 +6,7 @@ */ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; +import { ERROR_GROUP_NAME } from '../../../../common/es_fields/apm'; import { ApmDocumentType } from '../../../../common/document_type'; import { RollupInterval } from '../../../../common/rollup'; import type { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; @@ -40,7 +41,14 @@ export async function getErrorEventRate({ rollupInterval: RollupInterval.None, intervalString, filter, + groupByFields: [ERROR_GROUP_NAME], aggs: { + sample: { + top_metrics: { + metrics: { field: ERROR_GROUP_NAME }, + sort: '_score', + }, + }, value: { bucket_script: { buckets_path: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_failure_rate.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_failure_rate.ts index 35ca607e9e338a..c3f8e0f4d643b7 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_failure_rate.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_failure_rate.ts @@ -50,7 +50,7 @@ export async function getExitSpanFailureRate({ spanDestinationServiceResource ) ), - groupBy: SPAN_DESTINATION_SERVICE_RESOURCE, + groupByFields: [SPAN_DESTINATION_SERVICE_RESOURCE], aggs: { successful: { filter: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_latency.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_latency.ts index ad1f8cb8791be6..c6e02b6b2e8281 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_latency.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_latency.ts @@ -49,7 +49,7 @@ export async function getExitSpanLatency({ spanDestinationServiceResource ) ), - groupBy: SPAN_DESTINATION_SERVICE_RESOURCE, + groupByFields: [SPAN_DESTINATION_SERVICE_RESOURCE], aggs: { count: { sum: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_throughput.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_throughput.ts index ab1be9d2c20dc2..2f328d03d6b6d6 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_throughput.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_exit_span_throughput.ts @@ -49,7 +49,7 @@ export async function getExitSpanThroughput({ spanDestinationServiceResource ) ), - groupBy: SPAN_DESTINATION_SERVICE_RESOURCE, + groupByFields: [SPAN_DESTINATION_SERVICE_RESOURCE], aggs: { value: { bucket_script: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_failure_rate.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_failure_rate.ts index 8e44eac64e3e96..d6bece850099c9 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_failure_rate.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_failure_rate.ts @@ -8,7 +8,10 @@ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { termQuery } from '@kbn/observability-plugin/server'; import { ApmDocumentType } from '../../../../common/document_type'; -import { TRANSACTION_TYPE } from '../../../../common/es_fields/apm'; +import { + TRANSACTION_NAME, + TRANSACTION_TYPE, +} from '../../../../common/es_fields/apm'; import { RollupInterval } from '../../../../common/rollup'; import type { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { getOutcomeAggregation } from '../../../lib/helpers/transaction_error_rate'; @@ -21,6 +24,7 @@ export async function getTransactionFailureRate({ intervalString, filter, transactionType, + transactionName, }: { apmEventClient: APMEventClient; start: number; @@ -29,6 +33,7 @@ export async function getTransactionFailureRate({ bucketSize: number; filter: QueryDslQueryContainer[]; transactionType?: string; + transactionName?: string; }) { return ( await fetchSeries({ @@ -40,8 +45,12 @@ export async function getTransactionFailureRate({ documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, intervalString, - filter: filter.concat(...termQuery(TRANSACTION_TYPE, transactionType)), - groupBy: 'transaction.type', + filter: [ + ...filter, + ...termQuery(TRANSACTION_TYPE, transactionType), + ...termQuery(TRANSACTION_NAME, transactionName), + ], + groupByFields: [TRANSACTION_TYPE, TRANSACTION_NAME], aggs: { ...getOutcomeAggregation(ApmDocumentType.TransactionMetric), value: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_latency.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_latency.ts index f51378c647fd43..ce371435a3567a 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_latency.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_latency.ts @@ -7,6 +7,7 @@ import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { termQuery } from '@kbn/observability-plugin/server'; +import { TRANSACTION_NAME } from '@kbn/observability-shared-plugin/common'; import { ApmDocumentType } from '../../../../common/document_type'; import { TRANSACTION_DURATION_HISTOGRAM, @@ -25,6 +26,7 @@ export async function getTransactionLatency({ intervalString, filter, transactionType, + transactionName, latencyAggregationType, }: { apmEventClient: APMEventClient; @@ -34,6 +36,7 @@ export async function getTransactionLatency({ bucketSize: number; filter: QueryDslQueryContainer[]; transactionType?: string; + transactionName?: string; latencyAggregationType: LatencyAggregationType; }) { return ( @@ -46,8 +49,11 @@ export async function getTransactionLatency({ documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, intervalString, - filter: filter.concat(...termQuery(TRANSACTION_TYPE, transactionType)), - groupBy: 'transaction.type', + filter: filter.concat( + ...termQuery(TRANSACTION_TYPE, transactionType), + ...termQuery(TRANSACTION_NAME, transactionName) + ), + groupByFields: [TRANSACTION_TYPE, TRANSACTION_NAME], aggs: { ...getLatencyAggregation( latencyAggregationType, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_throughput.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_throughput.ts index 891ebd8b6a3568..53f1e1b8c4cc99 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_throughput.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/get_transaction_throughput.ts @@ -8,7 +8,10 @@ import type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { termQuery } from '@kbn/observability-plugin/server'; import { ApmDocumentType } from '../../../../common/document_type'; -import { TRANSACTION_TYPE } from '../../../../common/es_fields/apm'; +import { + TRANSACTION_NAME, + TRANSACTION_TYPE, +} from '../../../../common/es_fields/apm'; import { RollupInterval } from '../../../../common/rollup'; import type { APMEventClient } from '../../../lib/helpers/create_es_client/create_apm_event_client'; import { fetchSeries } from './fetch_timeseries'; @@ -21,6 +24,7 @@ export async function getTransactionThroughput({ bucketSize, filter, transactionType, + transactionName, }: { apmEventClient: APMEventClient; start: number; @@ -29,6 +33,7 @@ export async function getTransactionThroughput({ bucketSize: number; filter: QueryDslQueryContainer[]; transactionType?: string; + transactionName?: string; }) { const bucketSizeInMinutes = bucketSize / 60; const rangeInMinutes = (end - start) / 1000 / 60; @@ -43,8 +48,12 @@ export async function getTransactionThroughput({ documentType: ApmDocumentType.TransactionMetric, rollupInterval: RollupInterval.OneMinute, intervalString, - filter: filter.concat(...termQuery(TRANSACTION_TYPE, transactionType)), - groupBy: 'transaction.type', + filter: [ + ...filter, + ...termQuery(TRANSACTION_TYPE, transactionType), + ...termQuery(TRANSACTION_NAME, transactionName), + ], + groupByFields: [TRANSACTION_TYPE, TRANSACTION_NAME], aggs: { value: { bucket_script: { diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/index.ts index 7d0b4e2c3a4342..d7ced005fc05cc 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_apm_timeseries/index.ts @@ -48,6 +48,7 @@ export const getApmTimeseriesRt = t.type({ }), t.partial({ 'transaction.type': t.string, + 'transaction.name': t.string, }), ]), t.intersection([ @@ -73,6 +74,7 @@ export const getApmTimeseriesRt = t.type({ }), t.partial({ 'transaction.type': t.string, + 'transaction.name': t.string, }), ]), t.type({ @@ -93,6 +95,15 @@ export const getApmTimeseriesRt = t.type({ type ApmTimeseriesArgs = t.TypeOf; +export interface TimeseriesChangePoint { + change_point?: number | undefined; + r_value?: number | undefined; + trend?: string | undefined; + p_value: number; + date: string | undefined; + type: string; +} + export interface ApmTimeseries { stat: ApmTimeseriesArgs['stats'][number]; group: string; @@ -102,14 +113,7 @@ export interface ApmTimeseries { start: number; end: number; unit: string; - changes: Array<{ - change_point?: number | undefined; - r_value?: number | undefined; - trend?: string | undefined; - p_value: number; - date: string | undefined; - type: string; - }>; + changes: TimeseriesChangePoint[]; } export async function getApmTimeseries({ @@ -128,19 +132,15 @@ export async function getApmTimeseries({ numBuckets: 100, }); - const sharedParameters = { - apmEventClient, - start, - end, - bucketSize, - intervalString, - }; - return ( await Promise.all( args.stats.map(async (stat) => { const parameters = { - ...sharedParameters, + apmEventClient, + start, + end, + bucketSize, + intervalString, filter: [ ...rangeQuery(start, end), ...termQuery(SERVICE_NAME, stat['service.name']), @@ -156,18 +156,21 @@ export async function getApmTimeseries({ return await getTransactionThroughput({ ...parameters, transactionType: stat.timeseries['transaction.type'], + transactionName: stat.timeseries['transaction.name'], }); case ApmTimeseriesType.transactionFailureRate: return await getTransactionFailureRate({ ...parameters, transactionType: stat.timeseries['transaction.type'], + transactionName: stat.timeseries['transaction.name'], }); case ApmTimeseriesType.transactionLatency: return await getTransactionLatency({ ...parameters, transactionType: stat.timeseries['transaction.type'], + transactionName: stat.timeseries['transaction.name'], latencyAggregationType: stat.timeseries.function, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts new file mode 100644 index 00000000000000..1ce41749ba3a01 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/get_log_categories/index.ts @@ -0,0 +1,156 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 datemath from '@elastic/datemath'; +import { ElasticsearchClient } from '@kbn/core-elasticsearch-server'; +import type { CoreRequestHandlerContext } from '@kbn/core/server'; +import { aiAssistantLogsIndexPattern } from '@kbn/observability-ai-assistant-plugin/server'; +import { + SERVICE_NAME, + CONTAINER_ID, + HOST_NAME, +} from '../../../../common/es_fields/apm'; +import { getTypedSearch } from '../../diagnostics/create_typed_es_client'; + +export type LogCategories = + | Array<{ + key: string; + docCount: number; + sampleMessage: string; + }> + | undefined; + +export async function getLogCategories({ + esClient, + coreContext, + arguments: args, +}: { + esClient: ElasticsearchClient; + coreContext: CoreRequestHandlerContext; + arguments: { + start: string; + end: string; + 'service.name'?: string; + 'host.name'?: string; + 'container.id'?: string; + }; +}): Promise { + const start = datemath.parse(args.start)?.valueOf()!; + const end = datemath.parse(args.end)?.valueOf()!; + + const keyValueFilters = getShouldMatchOrNotExistFilter([ + { field: SERVICE_NAME, value: args[SERVICE_NAME] }, + { field: CONTAINER_ID, value: args[CONTAINER_ID] }, + { field: HOST_NAME, value: args[HOST_NAME] }, + ]); + + const index = + (await coreContext.uiSettings.client.get( + aiAssistantLogsIndexPattern + )) ?? 'logs-*'; + + const search = getTypedSearch(esClient); + + const query = { + bool: { + filter: [ + ...keyValueFilters, + { exists: { field: 'message' } }, + { + range: { + '@timestamp': { + gte: start, + lte: end, + }, + }, + }, + ], + }, + }; + + const hitCountRes = await search({ + index, + size: 0, + track_total_hits: true, + query, + }); + const totalDocCount = hitCountRes.hits.total.value; + const samplingProbability = Math.min(100_000 / totalDocCount, 1); + + const categorizedLogsRes = await search({ + index, + size: 0, + track_total_hits: 0, + query, + aggs: { + sampling: { + random_sampler: { + probability: samplingProbability, + }, + aggs: { + categories: { + categorize_text: { + field: 'message', + size: 500, + }, + aggs: { + sample: { + top_hits: { + sort: { '@timestamp': 'desc' as const }, + size: 1, + _source: ['message'], + }, + }, + }, + }, + }, + }, + }, + }); + + return categorizedLogsRes.aggregations?.sampling.categories?.buckets.map( + ({ doc_count: docCount, key, sample }) => { + const sampleMessage = (sample.hits.hits[0]._source as { message: string }) + .message; + return { key: key as string, docCount, sampleMessage }; + } + ); +} + +// field/value pairs should match, or the field should not exist +function getShouldMatchOrNotExistFilter( + keyValuePairs: Array<{ + field: string; + value?: string; + }> +) { + return keyValuePairs + .filter(({ value }) => value) + .map(({ field, value }) => { + return { + bool: { + should: [ + { + bool: { + filter: [{ term: { [field]: value } }], + }, + }, + { + bool: { + must_not: { + bool: { + filter: [{ exists: { field } }], + }, + }, + }, + }, + ], + minimum_should_match: 1, + }, + }; + }); +} diff --git a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts index 5aed2451858a95..88189c0ed77408 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/assistant_functions/route.ts @@ -10,7 +10,13 @@ import { omit } from 'lodash'; import { getApmAlertsClient } from '../../lib/helpers/get_apm_alerts_client'; import { getApmEventClient } from '../../lib/helpers/get_apm_event_client'; import { getMlClient } from '../../lib/helpers/get_ml_client'; +import { getRandomSampler } from '../../lib/helpers/get_random_sampler'; import { createApmServerRoute } from '../apm_routes/create_apm_server_route'; +import { + apmAlertDetailsContextRt, + getApmAlertDetailsContext, +} from './get_apm_alert_details_context'; + import { CorrelationValue, correlationValuesRouteRt, @@ -26,11 +32,78 @@ import { serviceSummaryRouteRt, type ServiceSummary, } from './get_apm_service_summary'; +import { ApmAnomalies } from './get_apm_service_summary/get_anomalies'; import { getApmTimeseries, getApmTimeseriesRt, + TimeseriesChangePoint, type ApmTimeseries, } from './get_apm_timeseries'; +import { LogCategories } from './get_log_categories'; + +const getApmAlertDetailsContextRoute = createApmServerRoute({ + endpoint: 'GET /internal/apm/assistant/get_apm_alert_details_context', + options: { + tags: ['access:apm', 'access:ai_assistant'], + }, + + params: t.type({ + query: apmAlertDetailsContextRt, + }), + handler: async ( + resources + ): Promise<{ + serviceSummary: ServiceSummary; + downstreamDependencies: APMDownstreamDependency[]; + logCategories: LogCategories; + serviceChangePoints: Array<{ + title: string; + changes: TimeseriesChangePoint[]; + }>; + exitSpanChangePoints: Array<{ + title: string; + changes: TimeseriesChangePoint[]; + }>; + anomalies: ApmAnomalies; + }> => { + const { context, request, plugins, logger, params } = resources; + const { query } = params; + + const alertStartedAt = query.alert_started_at; + + const [ + apmEventClient, + annotationsClient, + coreContext, + apmAlertsClient, + mlClient, + ] = await Promise.all([ + getApmEventClient(resources), + plugins.observability.setup.getScopedAnnotationsClient(context, request), + context.core, + getApmAlertsClient(resources), + getMlClient(resources), + getRandomSampler({ + security: resources.plugins.security, + probability: 1, + request: resources.request, + }), + ]); + const esClient = coreContext.elasticsearch.client.asCurrentUser; + + return getApmAlertDetailsContext({ + coreContext, + alertStartedAt, + annotationsClient, + apmAlertsClient, + apmEventClient, + esClient, + logger, + mlClient, + query, + }); + }, +}); const getApmTimeSeriesRoute = createApmServerRoute({ endpoint: 'POST /internal/apm/assistant/get_apm_timeseries', @@ -160,6 +233,7 @@ const getApmCorrelationValuesRoute = createApmServerRoute({ export const assistantRouteRepository = { ...getApmTimeSeriesRoute, + ...getApmAlertDetailsContextRoute, ...getApmServiceSummaryRoute, ...getApmCorrelationValuesRoute, ...getDownstreamDependenciesRoute, diff --git a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts index 1bac25d946ad2e..c29ca083b7fbd0 100644 --- a/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts +++ b/x-pack/plugins/observability_solution/dataset_quality/public/components/flyout/degraded_docs_trend/lens_attributes.ts @@ -115,7 +115,7 @@ export function getLensAttributes(color: string, dataView: DataView = defaultDat format: { id: 'percent', params: { - decimals: 0, + decimals: 3, }, }, isFormulaBroken: false, @@ -173,7 +173,7 @@ export function getLensAttributes(color: string, dataView: DataView = defaultDat yLeftExtent: { mode: 'custom', lowerBound: 0, - upperBound: 1, + upperBound: undefined, }, }, }, diff --git a/x-pack/plugins/observability_solution/infra/common/custom_dashboards.ts b/x-pack/plugins/observability_solution/infra/common/custom_dashboards.ts index ef32f2fb9cf60d..41bab533cf7d45 100644 --- a/x-pack/plugins/observability_solution/infra/common/custom_dashboards.ts +++ b/x-pack/plugins/observability_solution/infra/common/custom_dashboards.ts @@ -10,7 +10,11 @@ import { InventoryItemType } from '@kbn/metrics-data-access-plugin/common'; export type InfraCustomDashboardAssetType = InventoryItemType; export interface InfraCustomDashboard { - dashboardIdList: string[]; + dashboardSavedObjectId: string; assetType: InfraCustomDashboardAssetType; - kuery?: string; + dashboardFilterAssetIdEnabled: boolean; +} + +export interface InfraSavedCustomDashboard extends InfraCustomDashboard { + id: string; } diff --git a/x-pack/plugins/observability_solution/infra/common/http_api/custom_dashboards_api.ts b/x-pack/plugins/observability_solution/infra/common/http_api/custom_dashboards_api.ts index 9b1bafaa19da14..f89f66ca86e379 100644 --- a/x-pack/plugins/observability_solution/infra/common/http_api/custom_dashboards_api.ts +++ b/x-pack/plugins/observability_solution/infra/common/http_api/custom_dashboards_api.ts @@ -12,24 +12,22 @@ const AssetTypeRT = rt.type({ assetType: ItemTypeRT, }); -const CustomDashboardRT = rt.intersection([ - AssetTypeRT, - rt.type({ - dashboardIdList: rt.array(rt.string), - }), - rt.partial({ - kuery: rt.string, - }), -]); +const PayloadRT = rt.type({ + dashboardSavedObjectId: rt.string, + dashboardFilterAssetIdEnabled: rt.boolean, +}); + +const SavedObjectIdRT = rt.type({ + id: rt.string, +}); + +const InfraCustomDashboardRT = rt.intersection([AssetTypeRT, PayloadRT, SavedObjectIdRT]); /** GET endpoint */ -export const InfraGetCustomDashboardsRequestParamsRT = AssetTypeRT; -export const InfraGetCustomDashboardsResponseBodyRT = CustomDashboardRT; -export type InfraGetCustomDashboardsRequestParams = rt.TypeOf< - typeof InfraGetCustomDashboardsRequestParamsRT ->; +export const InfraGetCustomDashboardsRequestPathParamsRT = AssetTypeRT; +export const InfraGetCustomDashboardsResponseBodyRT = rt.array(InfraCustomDashboardRT); export type InfraGetCustomDashboardsResponseBody = rt.TypeOf< typeof InfraGetCustomDashboardsResponseBodyRT >; @@ -37,11 +35,27 @@ export type InfraGetCustomDashboardsResponseBody = rt.TypeOf< /** * POST endpoint */ -export const InfraSaveCustomDashboardsRequestPayloadRT = CustomDashboardRT; -export const InfraSaveCustomDashboardsResponseBodyRT = CustomDashboardRT; +export const InfraSaveCustomDashboardsRequestPayloadRT = PayloadRT; +export const InfraSaveCustomDashboardsResponseBodyRT = InfraCustomDashboardRT; export type InfraSaveCustomDashboardsRequestPayload = rt.TypeOf< typeof InfraSaveCustomDashboardsRequestPayloadRT >; export type InfraSaveCustomDashboardsResponseBody = rt.TypeOf< typeof InfraSaveCustomDashboardsResponseBodyRT >; + +/** + * PUT endpoint + */ +export const InfraUpdateCustomDashboardsRequestPathParamsRT = rt.intersection([ + AssetTypeRT, + SavedObjectIdRT, +]); + +/** + * DELETE endpoint + */ +export const InfraDeleteCustomDashboardsRequestParamsRT = rt.intersection([ + AssetTypeRT, + SavedObjectIdRT, +]); diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/custom_dashboards.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/custom_dashboards.ts index 6ed41cb83db714..7c4e11d26c1d4c 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/custom_dashboards.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/custom_dashboards.ts @@ -8,8 +8,12 @@ import type { KibanaFramework } from '../../lib/adapters/framework/kibana_framework_adapter'; import { initGetCustomDashboardRoute } from './get_custom_dashboard'; import { initSaveCustomDashboardRoute } from './save_custom_dashboard'; +import { initDeleteCustomDashboardRoute } from './delete_custom_dashboard'; +import { initUpdateCustomDashboardRoute } from './update_custom_dashboard'; export function initCustomDashboardsRoutes(framework: KibanaFramework) { initGetCustomDashboardRoute(framework); initSaveCustomDashboardRoute(framework); + initDeleteCustomDashboardRoute(framework); + initUpdateCustomDashboardRoute(framework); } diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/delete_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/delete_custom_dashboard.ts new file mode 100644 index 00000000000000..0742fd043a0916 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/delete_custom_dashboard.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createRouteValidationFunction } from '@kbn/io-ts-utils'; +import { InfraDeleteCustomDashboardsRequestParamsRT } from '../../../common/http_api/custom_dashboards_api'; +import { KibanaFramework } from '../../lib/adapters/framework/kibana_framework_adapter'; +import { handleRouteErrors } from '../../utils/handle_route_errors'; +import { checkCustomDashboardsEnabled } from './lib/check_custom_dashboards_enabled'; +import { deleteCustomDashboard } from './lib/delete_custom_dashboard'; + +export function initDeleteCustomDashboardRoute(framework: KibanaFramework) { + const validateParams = createRouteValidationFunction(InfraDeleteCustomDashboardsRequestParamsRT); + + framework.registerRoute( + { + method: 'delete', + path: '/api/infra/{assetType}/custom-dashboards/{id}', + validate: { + params: validateParams, + }, + options: { + access: 'internal', + }, + }, + handleRouteErrors(async (context, request, response) => { + const { savedObjectsClient, uiSettingsClient } = await context.infra; + + await checkCustomDashboardsEnabled(uiSettingsClient); + + const { id } = request.params; + + await deleteCustomDashboard({ + savedObjectsClient, + savedObjectId: id, + }); + + return response.ok({ + body: id, + }); + }) + ); +} diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/get_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/get_custom_dashboard.ts index 5b5136b104f9d3..561c1995dba13e 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/get_custom_dashboard.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/get_custom_dashboard.ts @@ -7,7 +7,7 @@ import { createRouteValidationFunction } from '@kbn/io-ts-utils'; import { - InfraGetCustomDashboardsRequestParamsRT, + InfraGetCustomDashboardsRequestPathParamsRT, InfraGetCustomDashboardsResponseBodyRT, } from '../../../common/http_api/custom_dashboards_api'; import { KibanaFramework } from '../../lib/adapters/framework/kibana_framework_adapter'; @@ -16,12 +16,12 @@ import { checkCustomDashboardsEnabled } from './lib/check_custom_dashboards_enab import { findCustomDashboard } from './lib/find_custom_dashboard'; export function initGetCustomDashboardRoute(framework: KibanaFramework) { - const validateParams = createRouteValidationFunction(InfraGetCustomDashboardsRequestParamsRT); + const validateParams = createRouteValidationFunction(InfraGetCustomDashboardsRequestPathParamsRT); framework.registerRoute( { method: 'get', - path: '/api/infra/custom-dashboards/{assetType}', + path: '/api/infra/{assetType}/custom-dashboards', validate: { params: validateParams, }, @@ -37,24 +37,8 @@ export function initGetCustomDashboardRoute(framework: KibanaFramework) { const params = request.params; const customDashboards = await findCustomDashboard(params.assetType, savedObjectsClient); - if (customDashboards.total === 0) { - return response.ok({ - body: InfraGetCustomDashboardsResponseBodyRT.encode({ - assetType: params.assetType, - dashboardIdList: [], - kuery: undefined, - }), - }); - } - - const attributes = customDashboards.saved_objects[0].attributes; - return response.ok({ - body: InfraGetCustomDashboardsResponseBodyRT.encode({ - assetType: attributes.assetType, - dashboardIdList: attributes.dashboardIdList, - kuery: attributes.kuery, - }), + body: InfraGetCustomDashboardsResponseBodyRT.encode(customDashboards), }); }) ); diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/delete_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/delete_custom_dashboard.ts new file mode 100644 index 00000000000000..6f2cbbd19cc504 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/delete_custom_dashboard.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { type SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; +import { INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE } from '../../../saved_objects'; + +interface Options { + savedObjectsClient: SavedObjectsClientContract; + savedObjectId: string; +} +export function deleteCustomDashboard({ savedObjectsClient, savedObjectId }: Options) { + return savedObjectsClient.delete(INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, savedObjectId); +} diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/find_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/find_custom_dashboard.ts index 5f5956d5c8fc63..dd575287c807af 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/find_custom_dashboard.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/lib/find_custom_dashboard.ts @@ -12,13 +12,22 @@ import type { InfraCustomDashboardAssetType, } from '../../../../common/custom_dashboards'; -export function findCustomDashboard( +export async function findCustomDashboard( assetType: InfraCustomDashboardAssetType, savedObjectsClient: SavedObjectsClientContract ) { - return savedObjectsClient.find({ + const result = await savedObjectsClient.find({ type: INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, search: assetType, searchFields: ['assetType'] as [keyof InfraCustomDashboard], + page: 1, + perPage: 1000, + sortField: 'updated_at', + sortOrder: 'desc', }); + + return result.saved_objects.map(({ id, attributes }) => ({ + id, + ...attributes, + })); } diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/save_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/save_custom_dashboard.ts index dc811b99b47de5..cab4d2de835d54 100644 --- a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/save_custom_dashboard.ts +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/save_custom_dashboard.ts @@ -9,24 +9,26 @@ import { createRouteValidationFunction } from '@kbn/io-ts-utils'; import { InfraCustomDashboard } from '../../../common/custom_dashboards'; import { InfraSaveCustomDashboardsRequestPayloadRT, - InfraSaveCustomDashboardsRequestPayload, InfraSaveCustomDashboardsResponseBodyRT, + InfraGetCustomDashboardsRequestPathParamsRT, } from '../../../common/http_api/custom_dashboards_api'; import { KibanaFramework } from '../../lib/adapters/framework/kibana_framework_adapter'; import { INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE } from '../../saved_objects'; import { checkCustomDashboardsEnabled } from './lib/check_custom_dashboards_enabled'; -import { findCustomDashboard } from './lib/find_custom_dashboard'; import { handleRouteErrors } from '../../utils/handle_route_errors'; +import { findCustomDashboard } from './lib/find_custom_dashboard'; export function initSaveCustomDashboardRoute(framework: KibanaFramework) { const validatePayload = createRouteValidationFunction(InfraSaveCustomDashboardsRequestPayloadRT); + const validateParams = createRouteValidationFunction(InfraGetCustomDashboardsRequestPathParamsRT); framework.registerRoute( { method: 'post', - path: '/api/infra/custom-dashboards', + path: '/api/infra/{assetType}/custom-dashboards', validate: { body: validatePayload, + params: validateParams, }, options: { access: 'internal', @@ -37,29 +39,33 @@ export function initSaveCustomDashboardRoute(framework: KibanaFramework) { await checkCustomDashboardsEnabled(uiSettingsClient); - const payload: InfraSaveCustomDashboardsRequestPayload = request.body; - const customDashboards = await findCustomDashboard(payload.assetType, savedObjectsClient); + const { dashboardSavedObjectId } = request.body; + + const { assetType } = request.params; - if (customDashboards.total === 0) { - const savedCustomDashboard = await savedObjectsClient.create( - INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, - payload - ); + const customDashboards = await findCustomDashboard(assetType, savedObjectsClient); + + const dashboardExist = customDashboards.find( + (customDashboard) => customDashboard.dashboardSavedObjectId === dashboardSavedObjectId + ); - return response.ok({ - body: InfraSaveCustomDashboardsResponseBodyRT.encode(savedCustomDashboard.attributes), + if (dashboardExist) { + return response.badRequest({ + body: `Dashboard with id ${dashboardSavedObjectId} has already been linked to ${assetType}`, }); } - const savedCustomDashboard = await savedObjectsClient.update( + const savedCustomDashboard = await savedObjectsClient.create( INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, - customDashboards.saved_objects[0].id, - payload + { + assetType, + ...request.body, + } ); return response.ok({ body: InfraSaveCustomDashboardsResponseBodyRT.encode({ - ...payload, + id: savedCustomDashboard.id, ...savedCustomDashboard.attributes, }), }); diff --git a/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/update_custom_dashboard.ts b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/update_custom_dashboard.ts new file mode 100644 index 00000000000000..2634604b9a76a5 --- /dev/null +++ b/x-pack/plugins/observability_solution/infra/server/routes/custom_dashboards/update_custom_dashboard.ts @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createRouteValidationFunction } from '@kbn/io-ts-utils'; +import { InfraCustomDashboard } from '../../../common/custom_dashboards'; +import { + InfraSaveCustomDashboardsRequestPayloadRT, + InfraSaveCustomDashboardsResponseBodyRT, + InfraUpdateCustomDashboardsRequestPathParamsRT, +} from '../../../common/http_api/custom_dashboards_api'; +import { KibanaFramework } from '../../lib/adapters/framework/kibana_framework_adapter'; +import { INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE } from '../../saved_objects'; +import { checkCustomDashboardsEnabled } from './lib/check_custom_dashboards_enabled'; +import { handleRouteErrors } from '../../utils/handle_route_errors'; + +export function initUpdateCustomDashboardRoute(framework: KibanaFramework) { + const validatePayload = createRouteValidationFunction(InfraSaveCustomDashboardsRequestPayloadRT); + const validateParams = createRouteValidationFunction( + InfraUpdateCustomDashboardsRequestPathParamsRT + ); + + framework.registerRoute( + { + method: 'put', + path: '/api/infra/{assetType}/custom-dashboards/{id}', + validate: { + body: validatePayload, + params: validateParams, + }, + options: { + access: 'internal', + }, + }, + handleRouteErrors(async (context, request, response) => { + const { savedObjectsClient, uiSettingsClient } = await context.infra; + + await checkCustomDashboardsEnabled(uiSettingsClient); + + const { id, assetType } = request.params; + + const savedCustomDashboard = await savedObjectsClient.update( + INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, + id, + { + assetType, + ...request.body, + } + ); + + return response.ok({ + body: InfraSaveCustomDashboardsResponseBodyRT.encode({ + id: savedCustomDashboard.id, + assetType, + ...request.body, + ...savedCustomDashboard.attributes, + }), + }); + }) + ); +} diff --git a/x-pack/plugins/observability_solution/infra/server/saved_objects/custom_dashboards/custom_dashboards_saved_object.ts b/x-pack/plugins/observability_solution/infra/server/saved_objects/custom_dashboards/custom_dashboards_saved_object.ts index 8075a51336f36e..76220a94631210 100644 --- a/x-pack/plugins/observability_solution/infra/server/saved_objects/custom_dashboards/custom_dashboards_saved_object.ts +++ b/x-pack/plugins/observability_solution/infra/server/saved_objects/custom_dashboards/custom_dashboards_saved_object.ts @@ -7,20 +7,21 @@ import { SavedObjectsFieldMapping, SavedObjectsType } from '@kbn/core/server'; import { i18n } from '@kbn/i18n'; -import { schema, Type } from '@kbn/config-schema'; +import { schema } from '@kbn/config-schema'; import { InfraCustomDashboard } from '../../../common/custom_dashboards'; export const INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE = 'infra-custom-dashboards'; const properties: Record = { - dashboardIdList: { type: 'keyword' }, - assetType: { type: 'keyword' }, - kuery: { type: 'text' }, -}; -const createSchema: Record> = { - dashboardIdList: schema.arrayOf(schema.string()), - assetType: schema.string(), - kuery: schema.maybe(schema.string()), + assetType: { + type: 'keyword', + }, + dashboardSavedObjectId: { + type: 'keyword', + }, + dashboardFilterAssetIdEnabled: { + type: 'boolean', + }, }; export const infraCustomDashboardsSavedObjectType: SavedObjectsType = { @@ -28,6 +29,7 @@ export const infraCustomDashboardsSavedObjectType: SavedObjectsType = { hidden: false, namespaceType: 'multiple', mappings: { + dynamic: false, properties, }, management: { @@ -42,7 +44,37 @@ export const infraCustomDashboardsSavedObjectType: SavedObjectsType = { '1': { changes: [], schemas: { - create: schema.object(createSchema), + create: schema.object({ + dashboardIdList: schema.arrayOf(schema.string()), + assetType: schema.string(), + kuery: schema.maybe(schema.string()), + }), + }, + }, + '2': { + changes: [ + { + type: 'mappings_addition', + addedMappings: { + dashboardSavedObjectId: { + type: 'keyword', + }, + dashboardFilterAssetIdEnabled: { + type: 'boolean', + }, + }, + }, + { + type: 'mappings_deprecation', + deprecatedMappings: ['dashboardIdList', 'kuery'], + }, + ], + schemas: { + create: schema.object({ + dashboardSavedObjectId: schema.string(), + assetType: schema.string(), + dashboardFilterAssetIdEnabled: schema.boolean(), + }), }, }, }, diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.test.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.test.ts index c6ff4f30a84204..3c533ec9f46670 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.test.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.test.ts @@ -101,5 +101,9 @@ describe('getGroup', () => { it('should return empty array if fields and values are empty', () => { expect(getGroups([], [])).toEqual([]); }); + + it('should return empty array if fields and values are undefined', () => { + expect(getGroups()).toEqual([]); + }); }); }); diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.ts index c5e6506bf9b057..6e8a9a262f62fc 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/helpers/get_group.ts @@ -34,7 +34,7 @@ export const getGroupFilters = (groups?: Group[], groupFieldName?: string): Filt return getGroupQueries(groups, groupFieldName).map((query) => ({ meta: {}, query })); }; -export const getGroups = (fields: string[], values: string[]): Group[] => { +export const getGroups = (fields: string[] = [], values: string[] = []): Group[] => { return fields.map((_, index) => ({ field: fields[index], value: values[index], diff --git a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts index 78221a307e9899..2633da58c20339 100644 --- a/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts +++ b/x-pack/plugins/observability_solution/observability/common/custom_threshold_rule/types.ts @@ -7,7 +7,7 @@ import * as rt from 'io-ts'; import { DataViewSpec, SerializedSearchSourceFields } from '@kbn/data-plugin/common'; -import { Filter } from '@kbn/es-query'; +import { Filter, Query } from '@kbn/es-query'; import { TimeUnitChar } from '../utils/formatters/duration'; export const ThresholdFormatterTypeRT = rt.keyof({ @@ -58,6 +58,9 @@ export enum AlertStates { } // Types for the executor +export interface CustomThresholdSearchSourceFields extends SerializedSearchSourceFields { + query?: Query; +} export interface ThresholdParams { criteria: MetricExpressionParams[]; @@ -65,7 +68,7 @@ export interface ThresholdParams { sourceId?: string; alertOnNoData?: boolean; alertOnGroupDisappear?: boolean; - searchConfiguration: SerializedSearchSourceFields; + searchConfiguration: CustomThresholdSearchSourceFields; groupBy?: string[]; } diff --git a/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.test.tsx b/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.test.tsx index 62fdeb1c4a29a0..b7da84869679a0 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.test.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.test.tsx @@ -135,7 +135,7 @@ describe('ObservabilityAlertSearchBar', () => { status: 'all', }); - expect(mockedOnEsQueryChange).toHaveBeenCalledWith({ + const esQueryChangeParams = { bool: { filter: [ { @@ -160,7 +160,10 @@ describe('ObservabilityAlertSearchBar', () => { must_not: [], should: [], }, - }); + }; + expect(mockedOnEsQueryChange).toHaveBeenCalledTimes(2); + expect(mockedOnEsQueryChange).toHaveBeenNthCalledWith(1, esQueryChangeParams); + expect(mockedOnEsQueryChange).toHaveBeenNthCalledWith(2, esQueryChangeParams); }); it('should include filters in es query', async () => { diff --git a/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.tsx b/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.tsx index afc8bedbe28e85..ffb8f30dc3918d 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/alert_search_bar/alert_search_bar.tsx @@ -99,7 +99,9 @@ export function ObservabilityAlertSearchBar({ from: rangeFrom, }, kuery, + queries: [...getAlertStatusQuery(status), ...defaultSearchQueries], filters, + config: getEsQueryConfig(uiSettings), }) ); } catch (error) { @@ -108,7 +110,18 @@ export function ObservabilityAlertSearchBar({ }); onKueryChange(DEFAULT_QUERY_STRING); } - }, [filters, kuery, onEsQueryChange, onKueryChange, rangeFrom, rangeTo, toasts]); + }, [ + defaultSearchQueries, + filters, + kuery, + onEsQueryChange, + onKueryChange, + rangeFrom, + rangeTo, + status, + uiSettings, + toasts, + ]); const onSearchBarParamsChange = useCallback< (query: { diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx index 98627c9ca80d59..d391a7c6347b7a 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/custom_equation/custom_equation_editor.tsx @@ -22,7 +22,7 @@ import { IErrorObject } from '@kbn/triggers-actions-ui-plugin/public'; import { FormattedMessage } from '@kbn/i18n-react'; import { DataViewBase } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; -import { adjustThresholdBasedOnFormat } from '../../helpers/adjust_threshold_based_on_format'; +import { convertToApiThreshold } from '../../helpers/threshold_unit'; import { Aggregators, CustomThresholdExpressionMetric, @@ -81,7 +81,7 @@ export function CustomEquationEditor({ ...expression, metrics: nextMetrics, equation, - threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + threshold: convertToApiThreshold(previous, nextMetrics, expression.threshold), }); return nextMetrics; }); @@ -96,7 +96,7 @@ export function CustomEquationEditor({ ...expression, metrics: finalMetrics, equation, - threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + threshold: convertToApiThreshold(previous, nextMetrics, expression.threshold), }); return finalMetrics; }); @@ -112,7 +112,7 @@ export function CustomEquationEditor({ ...expression, metrics: nextMetrics, equation, - threshold: adjustThresholdBasedOnFormat(previous, nextMetrics, expression.threshold), + threshold: convertToApiThreshold(previous, nextMetrics, expression.threshold), }); return nextMetrics; }); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/expression_row.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/expression_row.tsx index 9612b37e2d10fc..1bf7083aec58bb 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/expression_row.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/expression_row.tsx @@ -31,6 +31,7 @@ import { MetricExpression } from '../types'; import { CustomEquationEditor } from './custom_equation'; import { CUSTOM_EQUATION, LABEL_HELP_MESSAGE, LABEL_LABEL } from '../i18n_strings'; import { decimalToPct, pctToDecimal } from '../helpers/corrected_percent_convert'; +import { isPercent } from '../helpers/threshold_unit'; // Create a new object with COMPARATORS.NOT_BETWEEN removed as we use OUTSIDE_RANGE const updatedBuiltInComparators = { ...builtInComparators }; @@ -84,10 +85,7 @@ export const ExpressionRow: React.FC = (props) => { const { metrics, comparator = Comparator.GT, threshold = [] } = expression; - const isMetricPct = useMemo( - () => Boolean(metrics.length === 1 && metrics[0].field?.endsWith('.pct')), - [metrics] - ); + const isMetricPct = useMemo(() => isPercent(metrics), [metrics]); const [label, setLabel] = useState(expression?.label || undefined); const updateComparator = useCallback( diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/rule_condition_chart/rule_condition_chart.test.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/rule_condition_chart/rule_condition_chart.test.tsx index d07eb08de44742..ca06ed64894f30 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/rule_condition_chart/rule_condition_chart.test.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/components/rule_condition_chart/rule_condition_chart.test.tsx @@ -6,11 +6,14 @@ */ import React from 'react'; -import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; import { act } from 'react-dom/test-utils'; import { DataView } from '@kbn/data-views-plugin/common'; import { mountWithIntl, nextTick } from '@kbn/test-jest-helpers'; -import { Comparator, Aggregators } from '../../../../../common/custom_threshold_rule/types'; +import { + Comparator, + Aggregators, + CustomThresholdSearchSourceFields, +} from '../../../../../common/custom_threshold_rule/types'; import { useKibana } from '../../../../utils/kibana_react'; import { kibanaStartMock } from '../../../../utils/kibana_react.mock'; import { MetricExpression } from '../../types'; @@ -36,7 +39,7 @@ describe('Rule condition chart', () => { |<|=|\?|\:|&|\!|\|]+/g; @@ -24,7 +25,7 @@ export function validateCustomThreshold({ uiSettings, }: { criteria: CustomMetricExpressionParams[]; - searchConfiguration: SerializedSearchSourceFields; + searchConfiguration: CustomThresholdSearchSourceFields; uiSettings: IUiSettingsClient; }): ValidationResult { const validationResult = { errors: {} }; @@ -58,7 +59,7 @@ export function validateCustomThreshold({ try { buildEsQuery( undefined, - [{ query: (searchConfiguration.query as Query).query, language: 'kuery' }], + [{ query: searchConfiguration.query.query, language: 'kuery' }], [], getEsQueryConfig(uiSettings) ); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx index 19a1c0fcd164e8..b169f83739881e 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx @@ -43,6 +43,7 @@ import { AlertContextMeta, AlertParams, MetricExpression } from './types'; import { ExpressionRow } from './components/expression_row'; import { MetricsExplorerFields, GroupBy } from './components/group_by'; import { RuleConditionChart as PreviewChart } from './components/rule_condition_chart/rule_condition_chart'; +import { getSearchConfiguration } from './helpers/get_search_configuration'; const FILTER_TYPING_DEBOUNCE_MS = 500; @@ -83,6 +84,7 @@ export default function Expressions(props: Props) { const [dataViewTimeFieldError, setDataViewTimeFieldError] = useState(); const [searchSource, setSearchSource] = useState(); const [paramsError, setParamsError] = useState(); + const [paramsWarning, setParamsWarning] = useState(); const derivedIndexPattern = useMemo( () => ({ fields: dataView?.fields || [], @@ -112,7 +114,10 @@ export default function Expressions(props: Props) { newSearchSource.setField('index', defaultDataView); setDataView(defaultDataView); } - initialSearchConfiguration = newSearchSource.getSerializedFields(); + initialSearchConfiguration = getSearchConfiguration( + newSearchSource.getSerializedFields(), + setParamsWarning + ); } } @@ -188,7 +193,10 @@ export default function Expressions(props: Props) { ); setRuleParams('criteria', ruleCriteria); searchSource?.setParent(undefined).setField('index', newDataView); - setRuleParams('searchConfiguration', searchSource?.getSerializedFields()); + setRuleParams( + 'searchConfiguration', + searchSource && getSearchConfiguration(searchSource.getSerializedFields(), setParamsWarning) + ); setDataView(newDataView); }, [ruleParams.criteria, searchSource, setRuleParams] @@ -223,6 +231,7 @@ export default function Expressions(props: Props) { const onFilterChange = useCallback( ({ query }: { query?: Query }) => { + setParamsWarning(undefined); setRuleParams('searchConfiguration', { ...ruleParams.searchConfiguration, query }); }, [setRuleParams, ruleParams.searchConfiguration] @@ -365,6 +374,24 @@ export default function Expressions(props: Props) { ); return ( <> + {!!paramsWarning && ( + <> + + {paramsWarning} + + + + )}
{ // Since rule params will be sent to the API as is, and we only need meta and query parameters to be diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.test.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.test.ts deleted file mode 100644 index fb6bbc500a46c4..00000000000000 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.test.ts +++ /dev/null @@ -1,93 +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 { - Aggregators, - CustomThresholdExpressionMetric, -} from '../../../../common/custom_threshold_rule/types'; -import { adjustThresholdBasedOnFormat } from './adjust_threshold_based_on_format'; - -describe('adjustThresholdBasedOnFormat', () => { - test('previous: nonPercent, next: percent -> threshold / 100', () => { - const previous: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - aggType: Aggregators.COUNT, - }, - ]; - const next: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - field: 'system.cpu.system.pct', - aggType: Aggregators.AVERAGE, - }, - ]; - const threshold: number[] = [100]; - const expectedThreshold: number[] = [1]; - - expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(expectedThreshold); - }); - - test('previous: percent, next: nonPercent -> threshold * 100', () => { - const previous: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - field: 'system.cpu.system.pct', - aggType: Aggregators.AVERAGE, - }, - ]; - const next: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - aggType: Aggregators.COUNT, - }, - ]; - const threshold: number[] = [1]; - const expectedThreshold: number[] = [100]; - - expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(expectedThreshold); - }); - - test('previous: percent, next: percent -> no threshold change', () => { - const previous: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - field: 'system.cpu.system.pct', - aggType: Aggregators.AVERAGE, - }, - ]; - const next: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - field: 'system.cpu.total.norm.pct', - aggType: Aggregators.AVERAGE, - }, - ]; - const threshold: number[] = [1]; - - expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(threshold); - }); - - test('previous: nonPercent, next: nonPercent -> threshold * 100', () => { - const previous: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - field: 'host.disk.read.bytes', - aggType: Aggregators.AVERAGE, - }, - ]; - const next: CustomThresholdExpressionMetric[] = [ - { - name: 'A', - aggType: Aggregators.COUNT, - }, - ]; - const threshold: number[] = [100]; - - expect(adjustThresholdBasedOnFormat(previous, next, threshold)).toEqual(threshold); - }); -}); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts new file mode 100644 index 00000000000000..734a31c7b87446 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.test.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { defaultQuery, getSearchConfiguration } from './get_search_configuration'; + +describe('getSearchConfiguration()', () => { + const onWarning = jest.fn(); + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should return the same query if query has the correct type', () => { + const query = { + query: 'random query', + language: 'random language', + }; + + expect(getSearchConfiguration({ query }, onWarning)).toEqual({ query }); + expect(onWarning).toHaveBeenCalledTimes(0); + }); + + it('should return undefined for query if query is undefined', () => { + expect(getSearchConfiguration({}, onWarning)).toEqual({}); + expect(onWarning).toHaveBeenCalledTimes(0); + }); + + it('should return default query if type of query is not Query and calls onWarning', () => { + const query = { + esql: 'random esql', + }; + + expect(getSearchConfiguration({ query }, onWarning)).toEqual({ query: defaultQuery }); + expect(onWarning).toHaveBeenCalledTimes(1); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts new file mode 100644 index 00000000000000..9bdcd74a978040 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/get_search_configuration.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Query, SerializedSearchSourceFields } from '@kbn/data-plugin/common'; +import { isOfQueryType } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; +import { CustomThresholdSearchSourceFields } from '../../../../common/custom_threshold_rule/types'; + +export const defaultQuery: Query = { + language: 'kuery', + query: '', +}; + +const searchConfigQueryWarning = i18n.translate( + 'xpack.observability.customThreshold.rule.alertFlyout.searchConfiguration.queryWarning', + { + defaultMessage: + 'Custom threshold does not support queries other than Query type, query was changed to default query.', + } +); + +export const getSearchConfiguration = ( + fields: SerializedSearchSourceFields, + onWarning: (title: string) => void +): CustomThresholdSearchSourceFields => { + if (fields.query && !isOfQueryType(fields.query)) { + onWarning(searchConfigQueryWarning); + return { + ...fields, + query: defaultQuery, + }; + } + return { + ...fields, + query: fields.query, + }; +}; diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.test.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.test.ts new file mode 100644 index 00000000000000..fce8d467400d83 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.test.ts @@ -0,0 +1,182 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { + Aggregators, + CustomThresholdExpressionMetric, +} from '../../../../common/custom_threshold_rule/types'; +import { convertToApiThreshold } from './threshold_unit'; + +describe('convertToApiThreshold', () => { + test('previous: nonPercent, next: percent -> threshold / 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [100]; + const expectedThreshold: number[] = [1]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(expectedThreshold); + }); + + test('previous: percent, next: nonPercent -> threshold * 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const threshold: number[] = [1]; + const expectedThreshold: number[] = [100]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(expectedThreshold); + }); + + test('previous: percent, next: percent -> no threshold change', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.total.norm.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [1]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(threshold); + }); + + test('previous: nonPercent, next: nonPercent -> no threshold change', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'host.disk.read.bytes', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + ]; + const threshold: number[] = [100]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(threshold); + }); + + test('multiple metrics (previous: one percent, next: one percent) -> no threshold change', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'host.disk.read.bytes', + aggType: Aggregators.AVERAGE, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [100]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(threshold); + }); + + test('multiple metrics (previous: ALL percent, next: some percent) -> threshold * 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.user.pct', + aggType: Aggregators.AVERAGE, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [1]; + const expectedThreshold: number[] = [100]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(expectedThreshold); + }); + + test('multiple metrics (previous: some percent, next: ALL percent) -> threshold / 100', () => { + const previous: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + aggType: Aggregators.COUNT, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const next: CustomThresholdExpressionMetric[] = [ + { + name: 'A', + field: 'system.cpu.user.pct', + aggType: Aggregators.AVERAGE, + }, + { + name: 'B', + field: 'system.cpu.system.pct', + aggType: Aggregators.AVERAGE, + }, + ]; + const threshold: number[] = [100]; + const expectedThreshold: number[] = [1]; + + expect(convertToApiThreshold(previous, next, threshold)).toEqual(expectedThreshold); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.ts similarity index 67% rename from x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts rename to x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.ts index ba4976684e3868..99537ad5180f8f 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/adjust_threshold_based_on_format.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/helpers/threshold_unit.ts @@ -8,13 +8,14 @@ import { CustomThresholdExpressionMetric } from '../../../../common/custom_threshold_rule/types'; import { decimalToPct, pctToDecimal } from './corrected_percent_convert'; -export const adjustThresholdBasedOnFormat = ( +export const convertToApiThreshold = ( previous: CustomThresholdExpressionMetric[], next: CustomThresholdExpressionMetric[], threshold: number[] ) => { - const isPreviousPercent = Boolean(previous.length === 1 && previous[0].field?.endsWith('.pct')); - const isPercent = Boolean(next.length === 1 && next[0].field?.endsWith('.pct')); + const isPreviousPercent = Boolean(previous.every((metric) => metric.field?.endsWith('.pct'))); + const isPercent = Boolean(next.every((metric) => metric.field?.endsWith('.pct'))); + return isPercent === isPreviousPercent ? threshold : isPercent @@ -23,3 +24,6 @@ export const adjustThresholdBasedOnFormat = ( ? threshold.map((v: number) => decimalToPct(v)) : threshold; }; + +export const isPercent = (metrics: CustomThresholdExpressionMetric[]) => + Boolean(metrics.every((metric) => metric.field?.endsWith('.pct'))); diff --git a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts index 0c345cf0a97203..8d5b1260a809c1 100644 --- a/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts +++ b/x-pack/plugins/observability_solution/observability/public/components/custom_threshold/types.ts @@ -27,11 +27,12 @@ import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import { - CustomMetricExpressionParams, - BaseMetricExpressionParams, aggType, - ThresholdParams, + CustomThresholdSearchSourceFields, + BaseMetricExpressionParams, + CustomMetricExpressionParams, MetricExpressionParams, + ThresholdParams, } from '../../../common/custom_threshold_rule/types'; import { ObservabilityPublicStart } from '../../plugin'; @@ -56,7 +57,7 @@ export interface AlertParams { filterQuery?: string; alertOnNoData?: boolean; alertOnGroupDisappear?: boolean; - searchConfiguration: SerializedSearchSourceFields; + searchConfiguration: CustomThresholdSearchSourceFields; shouldDropPartialBuckets?: boolean; } diff --git a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.ts b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.ts index f8cb3803ec4880..d159973be700cd 100644 --- a/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.ts +++ b/x-pack/plugins/observability_solution/observability/public/hooks/use_fetch_alert_detail.ts @@ -44,12 +44,14 @@ export const useFetchAlertDetail = (id: string): [boolean, AlertData | null] => shouldExecuteApiCall, }); - const data = rawAlert - ? { - formatted: parseAlert(observabilityRuleTypeRegistry)(rawAlert), - raw: rawAlert, - } - : null; + const data = useMemo(() => { + return rawAlert + ? { + formatted: parseAlert(observabilityRuleTypeRegistry)(rawAlert), + raw: rawAlert, + } + : null; + }, [observabilityRuleTypeRegistry, rawAlert]); return [loading, data]; }; diff --git a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx index 6d116a6e13d7f4..994fceabefea6a 100644 --- a/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx +++ b/x-pack/plugins/observability_solution/observability/public/pages/alert_details/alert_details.tsx @@ -26,14 +26,13 @@ import { } from '@kbn/rule-data-utils'; import { RuleTypeModel } from '@kbn/triggers-actions-ui-plugin/public'; import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; - import dedent from 'dedent'; import { AlertFieldsTable } from '@kbn/alerts-ui-shared'; import { css } from '@emotion/react'; import { useKibana } from '../../utils/kibana_react'; import { useFetchRule } from '../../hooks/use_fetch_rule'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; +import { AlertData, useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; import { PageTitle, pageTitleContent } from './components/page_title'; import { HeaderActions } from './components/header_actions'; import { AlertSummary, AlertSummaryField } from './components/alert_summary'; @@ -88,21 +87,7 @@ export function AlertDetails() { return; } - const screenDescription = dedent(`The user is looking at an ${ - alertDetail.formatted.active ? 'active' : 'recovered' - } alert. - It started at ${new Date( - alertDetail.formatted.start - ).toISOString()}, and was last updated at ${new Date( - alertDetail.formatted.lastUpdated - ).toISOString()}. - - ${ - alertDetail.formatted.reason - ? `The reason given for the alert is ${alertDetail.formatted.reason}.` - : '' - } - `); + const screenDescription = getScreenDescription(alertDetail); return observabilityAIAssistant.service.setScreenContext({ screenDescription, @@ -122,6 +107,7 @@ export function AlertDetails() { setAlertStatus(alertDetail?.formatted?.fields[ALERT_STATUS] as AlertStatus); } }, [alertDetail, ruleTypeRegistry]); + useBreadcrumbs([ { href: http.basePath.prepend(paths.observability.alerts), @@ -258,3 +244,28 @@ export function AlertDetails() { ); } + +export function getScreenDescription(alertDetail: AlertData) { + const alertState = alertDetail.formatted.active ? 'active' : 'recovered'; + const alertStarted = new Date(alertDetail.formatted.start).toISOString(); + const alertUpdated = new Date(alertDetail.formatted.lastUpdated).toISOString(); + + return dedent(`The user is looking at an ${alertState} alert. It started at ${alertStarted}, and was last updated at ${alertUpdated}. + + ${ + alertDetail.formatted.reason + ? `The reason given for the alert is ${alertDetail.formatted.reason}.` + : '' + } + + The alert details are: + ${Object.entries(alertDetail.formatted.fields) + .map(([key, value]) => `${key}: ${value}`) + .join('\n')} + + Do not repeat this information to the user, unless it is relevant for them to know. + Please suggestion root causes if possilbe. + Suggest next steps for the user to take. + + `); +} diff --git a/x-pack/plugins/observability_solution/observability/public/rules/register_observability_rule_types.ts b/x-pack/plugins/observability_solution/observability/public/rules/register_observability_rule_types.ts index ed3812ebc571b2..b9c85bbb2bc336 100644 --- a/x-pack/plugins/observability_solution/observability/public/rules/register_observability_rule_types.ts +++ b/x-pack/plugins/observability_solution/observability/public/rules/register_observability_rule_types.ts @@ -7,7 +7,6 @@ import { lazy } from 'react'; import { i18n } from '@kbn/i18n'; -import { SerializedSearchSourceFields } from '@kbn/data-plugin/common'; import { ALERT_GROUP_FIELD, ALERT_GROUP_VALUE, @@ -22,6 +21,7 @@ import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import type { CustomMetricExpressionParams, CustomThresholdExpressionMetric, + CustomThresholdSearchSourceFields, SearchConfigurationWithExtractedReferenceType, } from '../../common/custom_threshold_rule/types'; import type { MetricExpression } from '../components/custom_threshold/types'; @@ -66,7 +66,7 @@ export const registerObservabilityRuleTypes = async ( searchConfiguration, }: { criteria: CustomMetricExpressionParams[]; - searchConfiguration: SerializedSearchSourceFields; + searchConfiguration: CustomThresholdSearchSourceFields; }) => validateCustomThreshold({ criteria, searchConfiguration, uiSettings }); observabilityRuleTypeRegistry.register({ id: OBSERVABILITY_THRESHOLD_RULE_TYPE_ID, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts index dcfd39651bf0a9..12feb88bb65822 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/functions/types.ts @@ -4,14 +4,29 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ - -import type { JSONSchema } from 'json-schema-to-ts'; +import type { JSONSchema7TypeName } from 'json-schema'; import type { Observable } from 'rxjs'; import { ChatCompletionChunkEvent, MessageAddEvent } from '../conversation_complete'; import { FunctionVisibility } from './function_visibility'; export { FunctionVisibility }; -export type CompatibleJSONSchema = Exclude; +type JSONSchemaOrPrimitive = CompatibleJSONSchema | string | number | boolean; + +// eslint-disable-next-line @typescript-eslint/consistent-type-definitions +export type CompatibleJSONSchema = { + type?: JSONSchema7TypeName; + enum?: JSONSchemaOrPrimitive[] | readonly JSONSchemaOrPrimitive[]; + const?: JSONSchemaOrPrimitive; + minLength?: number | undefined; + maxLength?: number | undefined; + items?: CompatibleJSONSchema[] | CompatibleJSONSchema; + required?: string[] | readonly string[] | undefined; + properties?: Record; + allOf?: CompatibleJSONSchema[] | readonly CompatibleJSONSchema[] | undefined; + anyOf?: CompatibleJSONSchema[] | readonly CompatibleJSONSchema[] | undefined; + oneOf?: CompatibleJSONSchema[] | readonly CompatibleJSONSchema[] | undefined; + description?: string; +}; export interface ContextDefinition { name: string; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/process_openai_stream.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/process_openai_stream.ts new file mode 100644 index 00000000000000..11fe48721812c8 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/common/utils/process_openai_stream.ts @@ -0,0 +1,72 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import OpenAI from 'openai'; +import { filter, map, Observable, tap } from 'rxjs'; +import { v4 } from 'uuid'; +import type { Logger } from '@kbn/logging'; +import { Message } from '..'; +import { + type ChatCompletionChunkEvent, + createInternalServerError, + createTokenLimitReachedError, + StreamingChatResponseEventType, +} from '../conversation_complete'; + +export type CreateChatCompletionResponseChunk = OpenAI.ChatCompletionChunk; + +export function processOpenAiStream(logger: Logger) { + return (source: Observable): Observable => { + const id = v4(); + + return source.pipe( + filter((line) => !!line && line !== '[DONE]'), + map( + (line) => + JSON.parse(line) as CreateChatCompletionResponseChunk | { error: { message: string } } + ), + tap((line) => { + if ('error' in line) { + throw createInternalServerError(line.error.message); + } + if ( + 'choices' in line && + line.choices.length && + line.choices[0].finish_reason === 'length' + ) { + throw createTokenLimitReachedError(); + } + }), + filter( + (line): line is CreateChatCompletionResponseChunk => + 'object' in line && line.object === 'chat.completion.chunk' + ), + map((chunk): ChatCompletionChunkEvent => { + const delta = chunk.choices[0].delta; + if (delta.tool_calls && delta.tool_calls.length > 1) { + logger.warn(`More tools than 1 were called: ${JSON.stringify(delta.tool_calls)}`); + } + + const functionCall: Omit | undefined = + delta.tool_calls + ? { + name: delta.tool_calls[0].function?.name, + arguments: delta.tool_calls[0].function?.arguments, + } + : delta.function_call; + + return { + id, + type: StreamingChatResponseEventType.ChatCompletionChunk, + message: { + content: delta.content ?? '', + function_call: functionCall, + }, + }; + }) + ); + }; +} diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx index 6394d037de42c2..fb06d77efee8b3 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/components/insight/insight.tsx @@ -13,10 +13,11 @@ import { EuiSpacer, EuiText, EuiTextArea, + EuiCallOut, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { cloneDeep, last } from 'lodash'; -import React, { useEffect, useRef, useState } from 'react'; +import { cloneDeep, isArray, last, once } from 'lodash'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { MessageRole, type Message } from '../../../common/types'; import { ObservabilityAIAssistantChatServiceContext } from '../../context/observability_ai_assistant_chat_service_context'; import { useAbortableAsync } from '../../hooks/use_abortable_async'; @@ -192,20 +193,75 @@ function PromptEdit({ } export interface InsightProps { - messages: Message[]; + messages: Message[] | (() => Promise); title: string; dataTestSubj?: string; } -export function Insight({ messages, title, dataTestSubj }: InsightProps) { - const [initialMessages, setInitialMessages] = useState(messages); +enum FETCH_STATUS { + LOADING = 'loading', + SUCCESS = 'success', + FAILURE = 'failure', + NOT_INITIATED = 'not_initiated', +} + +export function Insight({ + messages: initialMessagesOrCallback, + title, + dataTestSubj, +}: InsightProps) { + const [messages, setMessages] = useState<{ messages: Message[]; status: FETCH_STATUS }>({ + messages: [], + status: FETCH_STATUS.NOT_INITIATED, + }); const [isEditingPrompt, setEditingPrompt] = useState(false); const [isInsightOpen, setInsightOpen] = useState(false); const [hasOpened, setHasOpened] = useState(false); const [isPromptUpdated, setIsPromptUpdated] = useState(false); - const connectors = useGenAIConnectors(); + const updateInitialMessages = useCallback(async () => { + if (isArray(initialMessagesOrCallback)) { + setMessages({ + messages: initialMessagesOrCallback, + status: FETCH_STATUS.SUCCESS, + }); + return; + } + setMessages({ + messages: [], + status: FETCH_STATUS.LOADING, + }); + + try { + const data = await initialMessagesOrCallback(); + setMessages({ + messages: data ?? [], + status: FETCH_STATUS.SUCCESS, + }); + } catch (e) { + setMessages({ + messages: [], + status: FETCH_STATUS.FAILURE, + }); + + // eslint-disable-next-line no-console + console.log('could not load insight messages', e); + } + }, [initialMessagesOrCallback]); + + const updateInitialMessagesOnce = useMemo( + () => once(updateInitialMessages), + [updateInitialMessages] + ); + + useEffect(() => { + if (isInsightOpen) { + updateInitialMessagesOnce(); + } + }, [updateInitialMessagesOnce, isInsightOpen]); + + const connectors = useGenAIConnectors(); const service = useObservabilityAIAssistant(); const chatService = useAbortableAsync( @@ -215,14 +271,14 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { [service] ); - const handleSend = (newPrompt: string) => { - const clonedMessages = cloneDeep(messages); + const onEditPrompt = (newPrompt: string) => { + const clonedMessages = cloneDeep(messages.messages); const userMessage = getLastMessageOfType(clonedMessages, MessageRole.User); if (!userMessage) return false; userMessage.message.content = newPrompt; setIsPromptUpdated(true); - setInitialMessages(clonedMessages); + setMessages({ messages: clonedMessages, status: FETCH_STATUS.SUCCESS }); setEditingPrompt(false); return true; }; @@ -241,7 +297,8 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { if ( connectors.selectedConnector && - ((!isInsightOpen && hasOpened) || (isInsightOpen && !isEditingPrompt)) + ((!isInsightOpen && hasOpened) || + (isInsightOpen && !isEditingPrompt && messages.status === FETCH_STATUS.SUCCESS)) ) { children = ( <> @@ -262,7 +319,7 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { setIsPromptUpdated(false); setHasOpened(false); setInsightOpen(false); - setInitialMessages(messages); + updateInitialMessages(); }} > @@ -281,7 +338,7 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { @@ -290,9 +347,9 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { children = ( ); @@ -300,6 +357,20 @@ export function Insight({ messages, title, dataTestSubj }: InsightProps) { children = ( ); + } else if (messages.status === FETCH_STATUS.FAILURE) { + children = ( + + ); } return ( 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 ed6ace7b662cf4..ff9e9929f3098c 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'; + import { ObservabilityAIAssistantPlugin } from './plugin'; import type { ObservabilityAIAssistantPublicSetup, @@ -66,6 +67,9 @@ export { ObservabilityAIAssistantTelemetryEventType } from './analytics/telemetr export type { Conversation, Message, KnowledgeBaseEntry } from '../common'; export { MessageRole, KnowledgeBaseEntryRole } from '../common'; +export { createFunctionRequestMessage } from '../common/utils/create_function_request_message'; +export { createFunctionResponseMessage } from '../common/utils/create_function_response_message'; + export type { ObservabilityAIAssistantAPIClientRequestParamsOf, ObservabilityAIAssistantAPIEndpoint, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts index e0ec99719d68a2..09c12004591aa3 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/public/service/create_chat_service.ts @@ -46,7 +46,7 @@ import type { import { readableStreamReaderIntoObservable } from '../utils/readable_stream_reader_into_observable'; import { complete } from './complete'; -const MIN_DELAY = 35; +const MIN_DELAY = 10; function toObservable(response: HttpResponse) { const status = response.response?.status; 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 52580676394faa..15d34d36a4ffc2 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 @@ -41,12 +41,9 @@ export function registerContextFunction({ visibility: FunctionVisibility.AssistantOnly, parameters: { type: 'object', - additionalProperties: false, properties: { queries: { type: 'array', - additionalItems: false, - additionalProperties: false, description: 'The query for the semantic search', items: { type: 'string', @@ -54,8 +51,6 @@ export function registerContextFunction({ }, categories: { type: 'array', - additionalItems: false, - additionalProperties: false, 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: { @@ -271,7 +266,6 @@ async function scoreSuggestions({ 'Use this function to score documents based on how relevant they are to the conversation.', parameters: { type: 'object', - additionalProperties: false, properties: { scores: { description: `The document IDs and their scores, as CSV. Example: @@ -292,7 +286,7 @@ async function scoreSuggestions({ ( await chat('score_suggestions', { connectorId, - messages: [...messages.slice(0, -1), newUserMessage], + messages: [...messages.slice(0, -2), newUserMessage], functions: [scoreFunction], functionCall: 'score', signal, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info.ts index e810b669d73f4f..b9d08bae22aef5 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/get_dataset_info.ts @@ -30,7 +30,6 @@ export function registerGetDatasetInfoFunction({ 'This function allows the assistant to get information about available indices and their fields.', parameters: { type: 'object', - additionalProperties: false, properties: { index: { type: 'string', @@ -146,14 +145,11 @@ export function registerGetDatasetInfoFunction({ description: 'The fields you consider relevant to the conversation', parameters: { type: 'object', - additionalProperties: false, properties: { fields: { type: 'array', - additionalProperties: false, items: { type: 'string', - additionalProperties: false, }, }, }, diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts index e40f8229a223d9..4af123a43f8917 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/functions/kibana.ts @@ -26,7 +26,6 @@ export function registerKibanaFunction({ descriptionForUser: 'Call Kibana APIs on behalf of the user', parameters: { type: 'object', - additionalProperties: false, properties: { method: { type: 'string', @@ -40,9 +39,6 @@ export function registerKibanaFunction({ query: { type: 'object', description: 'The query parameters, as an object', - additionalProperties: { - type: 'string', - }, }, body: { type: 'object', @@ -67,7 +63,7 @@ export function registerKibanaFunction({ '/internal/observability_ai_assistant/chat/complete', pathname ), - query, + query: query ? (query as Record) : undefined, }; const copiedHeaderNames = [ 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 612e923318a81b..39b73aefa89f69 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 @@ -22,7 +22,6 @@ export function registerSummarizationFunction({ 'This function allows the Elastic Assistant to summarize things from the conversation.', parameters: { type: 'object', - additionalProperties: false, properties: { id: { type: 'string', 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 28a9d2860885f9..ea09024a137e76 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 @@ -53,8 +53,6 @@ export class ChatFunctionClient { visibility: FunctionVisibility.AssistantOnly, parameters: { type: 'object', - additionalProperties: false, - additionalItems: false, properties: { data: { type: 'array', @@ -64,8 +62,6 @@ export class ChatFunctionClient { type: 'string', enum: allData.map((data) => data.name), }, - additionalItems: false, - additionalProperties: false, }, }, required: ['data' as const], diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/openai_adapter.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/openai_adapter.ts index cbcf6a2c3c29d5..0c2e1e138192c9 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/openai_adapter.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/openai_adapter.ts @@ -6,7 +6,7 @@ */ import { encode } from 'gpt-tokenizer'; -import { compact, isEmpty, merge, omit } from 'lodash'; +import { compact, isEmpty, merge, omit, pick } from 'lodash'; import OpenAI from 'openai'; import { CompatibleJSONSchema } from '../../../../common/functions/types'; import { Message, MessageRole } from '../../../../common'; @@ -58,6 +58,7 @@ export const createOpenAiAdapter: LlmApiAdapterFactory = ({ messages, functions, functionCall, + logger, }) => { const promptTokens = getOpenAIPromptTokenCount({ messages, functions }); @@ -101,9 +102,18 @@ export const createOpenAiAdapter: LlmApiAdapterFactory = ({ const request: Omit & { model?: string } = { messages: messagesForOpenAI as OpenAI.ChatCompletionCreateParams['messages'], stream: true, - ...(!!functions?.length ? { functions: functionsForOpenAI } : {}), + ...(!!functionsForOpenAI?.length + ? { + tools: functionsForOpenAI.map((fn) => ({ + function: pick(fn, 'name', 'description', 'parameters'), + type: 'function', + })), + } + : {}), temperature: 0, - function_call: functionCall ? { name: functionCall } : undefined, + tool_choice: functionCall + ? { function: { name: functionCall }, type: 'function' } + : undefined, }; return { @@ -115,7 +125,9 @@ export const createOpenAiAdapter: LlmApiAdapterFactory = ({ }; }, streamIntoObservable: (readable) => { - return eventsourceStreamIntoObservable(readable).pipe(processOpenAiStream(promptTokens)); + return eventsourceStreamIntoObservable(readable).pipe( + processOpenAiStream({ promptTokenCount: promptTokens, logger }) + ); }, }; }; diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/process_openai_stream.ts b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/process_openai_stream.ts index ae6b55055ce2d9..908042770ea2d5 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/process_openai_stream.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant/server/service/client/adapters/process_openai_stream.ts @@ -9,11 +9,13 @@ import { first, sum } from 'lodash'; import OpenAI from 'openai'; import { filter, map, Observable, tap } from 'rxjs'; import { v4 } from 'uuid'; +import type { Logger } from '@kbn/logging'; import { TokenCountEvent } from '../../../../common/conversation_complete'; import { ChatCompletionChunkEvent, createInternalServerError, createTokenLimitReachedError, + Message, StreamingChatResponseEventType, } from '../../../../common'; @@ -25,7 +27,13 @@ export type CreateChatCompletionResponseChunk = Omit; }; -export function processOpenAiStream(promptTokenCount: number) { +export function processOpenAiStream({ + promptTokenCount, + logger, +}: { + promptTokenCount: number; + logger: Logger; +}) { return (source: Observable): Observable => { return new Observable((subscriber) => { const id = v4(); @@ -76,12 +84,25 @@ export function processOpenAiStream(promptTokenCount: number) { 'object' in line && line.object === 'chat.completion.chunk' ), map((chunk): ChatCompletionChunkEvent => { + const delta = chunk.choices[0].delta; + if (delta.tool_calls && delta.tool_calls.length > 1) { + logger.warn(`More tools than 1 were called: ${JSON.stringify(delta.tool_calls)}`); + } + + const functionCall: Omit | undefined = + delta.tool_calls + ? { + name: delta.tool_calls[0].function?.name, + arguments: delta.tool_calls[0].function?.arguments, + } + : delta.function_call; + return { id, type: StreamingChatResponseEventType.ChatCompletionChunk, message: { - content: chunk.choices[0].delta.content || '', - function_call: chunk.choices[0].delta.function_call, + content: delta.content ?? '', + function_call: functionCall, }, }; }) 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 694849476586e3..edc69bd3c28110 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 @@ -707,7 +707,6 @@ describe('Observability AI Assistant client', () => { descriptionForUser: '', parameters: { type: 'object', - additionalProperties: false, properties: { foo: { type: 'string', @@ -916,9 +915,9 @@ describe('Observability AI Assistant client', () => { last_updated: expect.any(String), title: 'My predefined title', token_count: { - completion: 24, - prompt: 458, - total: 482, + completion: expect.any(Number), + prompt: expect.any(Number), + total: expect.any(Number), }, }, }); @@ -1273,7 +1272,6 @@ describe('Observability AI Assistant client', () => { name: 'get_top_alerts', contexts: ['core'], description: '', - parameters: {}, }, respond: async () => { return { content: 'Call this function again' }; @@ -1308,9 +1306,9 @@ describe('Observability AI Assistant client', () => { let nextLlmCallPromise: Promise; - if (body.functions?.length) { + if (body.tools?.length) { nextLlmCallPromise = waitForNextLlmCall(); - await llmSimulator.next({ function_call: { name: 'get_top_alerts' } }); + await llmSimulator.next({ function_call: { name: 'get_top_alerts', arguments: '{}' } }); } else { nextLlmCallPromise = Promise.resolve(); await llmSimulator.next({ content: 'Looks like we are done here' }); @@ -1350,9 +1348,9 @@ describe('Observability AI Assistant client', () => { (actionsClientMock.execute.mock.lastCall![0].params as any).subActionParams.body ); - expect(firstBody.functions.length).toBe(1); + expect(firstBody.tools.length).toBe(1); - expect(body.functions).toBeUndefined(); + expect(body.tools).toBeUndefined(); }); }); diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts index eec95db1845feb..b87db85c5645a8 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/common/functions/lens.ts @@ -32,13 +32,11 @@ export const lensFunctionDefinition = { 'Use this function to create custom visualizations, using Lens, that can be saved to dashboards.', parameters: { type: 'object', - additionalProperties: false, properties: { layers: { type: 'array', items: { type: 'object', - additionalProperties: false, properties: { label: { type: 'string', @@ -54,7 +52,6 @@ export const lensFunctionDefinition = { }, format: { type: 'object', - additionalProperties: false, properties: { id: { type: 'string', @@ -84,7 +81,6 @@ export const lensFunctionDefinition = { }, breakdown: { type: 'object', - additionalProperties: false, properties: { field: { type: 'string', 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 49a3e49f5e73c0..28e63384f88340 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 @@ -15,7 +15,6 @@ export const visualizeESQLFunction = { descriptionForUser: 'Use this function to visualize charts for ES|QL queries.', parameters: { type: 'object', - additionalProperties: true, properties: { query: { type: 'string', diff --git a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts index 750e735c8560a9..314d950cac7ded 100644 --- a/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts +++ b/x-pack/plugins/observability_solution/observability_ai_assistant_app/server/functions/alerts.ts @@ -53,11 +53,9 @@ export function registerAlertsFunction({ descriptionForUser: 'Get alerts for Observability', parameters: { type: 'object', - additionalProperties: false, properties: { featureIds: { type: 'array', - additionalItems: false, items: { type: 'string', enum: DEFAULT_FEATURE_IDS, 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 43cfbf912b598e..6c6df6f5e90d95 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 @@ -79,7 +79,6 @@ export function registerQueryFunction({ description: 'Display the results of an ES|QL query', parameters: { type: 'object', - additionalProperties: false, properties: { query: { type: 'string', @@ -110,7 +109,6 @@ export function registerQueryFunction({ visibility: FunctionVisibility.AssistantOnly, parameters: { type: 'object', - additionalProperties: false, properties: { switch: { type: 'boolean', diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/alerts_popover.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/alerts_popover.tsx index 6766bdf70ab399..5eaad19e8491e2 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/alerts_popover.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/alerts_popover.tsx @@ -17,6 +17,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { OBSERVABILITY_THRESHOLD_RULE_TYPE_ID } from '@kbn/rule-data-utils'; import { useActor } from '@xstate/react'; import { hydrateDataSourceSelection } from '@kbn/logs-explorer-plugin/common'; +import { Query, AggregateQuery, isOfQueryType } from '@kbn/es-query'; import { getDiscoverFiltersFromState } from '@kbn/logs-explorer-plugin/public'; import type { AlertParams } from '@kbn/observability-plugin/public/components/custom_threshold/types'; import { useLinkProps } from '@kbn/observability-shared-plugin/public'; @@ -76,6 +77,18 @@ function alertsPopoverReducer(state: AlertsPopoverState, action: AlertsPopoverAc } } +const defaultQuery: Query = { + language: 'kuery', + query: '', +}; + +function getQuery(query?: Query | AggregateQuery): Query { + if (query && isOfQueryType(query)) { + return query; + } + return defaultQuery; +} + export const AlertsPopover = () => { const { services: { triggersActionsUi, slo, application, http }, @@ -116,7 +129,7 @@ export const AlertsPopover = () => { params: { searchConfiguration: { index, - query: logsExplorerState.query, + query: getQuery(logsExplorerState.query), filter: getDiscoverFiltersFromState( index.id, logsExplorerState.filters, diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/logs_explorer_top_nav_menu.tsx b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/logs_explorer_top_nav_menu.tsx index ff66bb0034c538..ed3598bad4671a 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/logs_explorer_top_nav_menu.tsx +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/public/components/logs_explorer_top_nav_menu.tsx @@ -40,7 +40,10 @@ const ServerlessTopNav = () => { const { services } = useKibanaContextForPlugin(); return ( - + diff --git a/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json b/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json index 6d1f864890e571..20dc69e059b51c 100644 --- a/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json +++ b/x-pack/plugins/observability_solution/observability_logs_explorer/tsconfig.json @@ -47,6 +47,7 @@ "@kbn/lens-plugin", "@kbn/shared-ux-prompt-not-found", "@kbn/slo-plugin", + "@kbn/es-query", ], "exclude": [ "target/**/*" diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts new file mode 100644 index 00000000000000..e9c3b23537455e --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_flyout_locator.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { SerializableRecord } from '@kbn/utility-types'; +import rison from '@kbn/rison'; +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/common'; + +export type AssetDetailsFlyoutLocator = LocatorPublic; + +export interface AssetDetailsFlyoutLocatorParams extends SerializableRecord { + tableProperties: { + detailsItemId: string; + pagination?: { + pageIndex: number; + pageSize: number; + }; + sorting?: { + direction?: string; + field: string; + }; + }; + assetDetails: { + tabId?: string; + dashboardId?: string; + dateRange?: { + from: string; + to: string; + }; + }; +} + +const ASSET_DETAILS_FLYOUT_LOCATOR_ID = 'ASSET_DETAILS_FLYOUT_LOCATOR'; + +export class AssetDetailsFlyoutLocatorDefinition + implements LocatorDefinition +{ + public readonly id = ASSET_DETAILS_FLYOUT_LOCATOR_ID; + + public readonly getLocation = async (params: AssetDetailsFlyoutLocatorParams) => { + const tableProperties = rison.encodeUnknown(params.tableProperties); + const assetDetails = rison.encodeUnknown(params.assetDetails); + return { + app: 'metrics', + path: `/hosts?tableProperties=${tableProperties}&assetDetails=${assetDetails}`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.ts new file mode 100644 index 00000000000000..7a0d727b8d4ee3 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/asset_details_locator.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 { SerializableRecord } from '@kbn/utility-types'; +import rison from '@kbn/rison'; +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/common'; + +export type AssetDetailsLocator = LocatorPublic; + +export interface AssetDetailsLocatorParams extends SerializableRecord { + assetType: string; + assetId: string; + _a?: { + time?: { + from: string; + to: string; + }; + interval?: string; + }; + assetDetails?: { + tabId?: string; + dashboardId?: string; + dateRange?: { + from: string; + to: string; + }; + }; +} + +const ASSET_DETAILS_LOCATOR_ID = 'ASSET_DETAILS_LOCATOR'; + +export class AssetDetailsLocatorDefinition implements LocatorDefinition { + public readonly id = ASSET_DETAILS_LOCATOR_ID; + + public readonly getLocation = async (params: AssetDetailsLocatorParams) => { + const searchPath = rison.encodeUnknown(params._a); + const assetDetails = rison.encodeUnknown(params.assetDetails); + return { + app: 'metrics', + path: `/detail/${params.assetType}/${params.assetId}?assetDetails=${assetDetails}&_a=${searchPath}`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/hosts_locator.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/hosts_locator.ts new file mode 100644 index 00000000000000..012d4df07bf3c5 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/hosts_locator.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { SerializableRecord } from '@kbn/utility-types'; +import rison from '@kbn/rison'; +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/common'; +import type { Filter } from '@kbn/es-query'; + +export type HostsLocator = LocatorPublic; + +export interface HostsLocatorParams extends SerializableRecord { + query?: { + language: string; + query: string; + }; + dateRange?: { + from: string; + to: string; + }; + filters?: Filter[]; + panelFilters?: Filter[]; + limit?: number; + tableProperties?: { + detailsItemId?: string; + pagination: { + pageIndex: number; + pageSize: number; + }; + sorting: { + direction?: string; + field: string; + }; + }; +} + +const HOSTS_LOCATOR_ID = 'HOSTS_LOCATOR'; +const DEFAULT_HOST_LIMIT = 100; + +export class HostsLocatorDefinition implements LocatorDefinition { + public readonly id = HOSTS_LOCATOR_ID; + + public readonly getLocation = async (params: HostsLocatorParams) => { + const paramsWithDefaults = { + query: params.query ?? { language: 'kuery', query: '' }, + dateRange: params.dateRange ?? { from: 'now-15m', to: 'now' }, + filters: params.filters ?? [], + panelFilters: params.panelFilters ?? [], + limit: params.limit ?? DEFAULT_HOST_LIMIT, + }; + const searchString = rison.encodeUnknown(paramsWithDefaults); + const tableProperties = rison.encodeUnknown(params.tableProperties); + return { + app: 'metrics', + path: `/hosts?_a=${searchString}&tableProperties=${tableProperties}`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/locators.test.ts b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/locators.test.ts new file mode 100644 index 00000000000000..ff02eff6dc76f6 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/public/locators/infra/locators.test.ts @@ -0,0 +1,165 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 rison from '@kbn/rison'; +import { AssetDetailsLocatorDefinition } from './asset_details_locator'; +import { AssetDetailsFlyoutLocatorDefinition } from './asset_details_flyout_locator'; +import { HostsLocatorDefinition } from './hosts_locator'; + +const setupAssetDetailsLocator = async () => { + const assetDetailsLocator = new AssetDetailsLocatorDefinition(); + const assetDetailsFlyoutLocator = new AssetDetailsFlyoutLocatorDefinition(); + + return { + assetDetailsLocator, + assetDetailsFlyoutLocator, + }; +}; + +const setupHostsLocator = async () => { + const hostsLocator = new HostsLocatorDefinition(); + + return { + hostsLocator, + }; +}; + +describe('Infra Locators', () => { + describe('Asset Details Locator', () => { + const params = { + assetType: 'host', + assetId: '1234', + assetDetails: { + tabId: 'testTab', + dashboardId: 'testDashboard', + dateRange: { + from: '2021-01-01T00:00:00.000Z', + to: '2021-01-02T00:00:00.000Z', + }, + }, + }; + const assetDetails = rison.encodeUnknown(params.assetDetails); + + it('should create a link to Asset Details with no state', async () => { + const { assetDetailsLocator } = await setupAssetDetailsLocator(); + const { app, path, state } = await assetDetailsLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe( + `/detail/${params.assetType}/${params.assetId}?assetDetails=${assetDetails}&_a=undefined` + ); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + + it('should return correct structured url', async () => { + const { assetDetailsLocator } = await setupAssetDetailsLocator(); + const { app, path, state } = await assetDetailsLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe( + `/detail/${params.assetType}/${params.assetId}?assetDetails=${assetDetails}&_a=undefined` + ); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + }); + + describe('Asset Details Flyout Locator', () => { + const params = { + tableProperties: { + detailsItemId: '1234', + pagination: { + pageIndex: 0, + pageSize: 10, + }, + sorting: { + field: 'alertsCount', + }, + }, + assetDetails: { + tabId: 'testTab', + dashboardId: 'testDashboard', + dateRange: { + from: '2021-01-01T00:00:00.000Z', + to: '2021-01-02T00:00:00.000Z', + }, + }, + }; + const tableProperties = rison.encodeUnknown(params.tableProperties); + const assetDetails = rison.encodeUnknown(params.assetDetails); + + it('should create a link to Asset Details Flyout with no state', async () => { + const { assetDetailsFlyoutLocator } = await setupAssetDetailsLocator(); + const { app, path, state } = await assetDetailsFlyoutLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe(`/hosts?tableProperties=${tableProperties}&assetDetails=${assetDetails}`); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + + it('should return correct structured url', async () => { + const { assetDetailsFlyoutLocator } = await setupAssetDetailsLocator(); + const { app, path, state } = await assetDetailsFlyoutLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe(`/hosts?tableProperties=${tableProperties}&assetDetails=${assetDetails}`); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + }); + + describe('Hosts Locator', () => { + const params = { + query: { + language: 'kuery', + query: 'host.name: "foo"', + }, + dateRange: { + from: '2021-01-01T00:00:00.000Z', + to: '2021-01-02T00:00:00.000Z', + }, + filters: [], + panelFilters: [], + limit: 10, + tableProperties: { + detailsItemId: '1234', + pagination: { + pageIndex: 0, + pageSize: 10, + }, + sorting: { + field: 'alertsCount', + }, + }, + }; + const { query, dateRange, filters, panelFilters, limit, tableProperties } = params; + const searchString = rison.encodeUnknown({ query, dateRange, filters, panelFilters, limit }); + const tablePropertiesString = rison.encodeUnknown(tableProperties); + + it('should create a link to Hosts with no state', async () => { + const { hostsLocator } = await setupHostsLocator(); + const { app, path, state } = await hostsLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe(`/hosts?_a=${searchString}&tableProperties=${tablePropertiesString}`); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + + it('should return correct structured url', async () => { + const { hostsLocator } = await setupHostsLocator(); + const { app, path, state } = await hostsLocator.getLocation(params); + + expect(app).toBe('metrics'); + expect(path).toBe(`/hosts?_a=${searchString}&tableProperties=${tablePropertiesString}`); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts index c23611b367a1b9..204e9d3fbc99d4 100644 --- a/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts +++ b/x-pack/plugins/observability_solution/observability_shared/public/plugin.ts @@ -18,6 +18,15 @@ import { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import { BehaviorSubject } from 'rxjs'; import { createLazyObservabilityPageTemplate } from './components/page_template'; import { createNavigationRegistry } from './components/page_template/helpers/navigation_registry'; +import { + type AssetDetailsFlyoutLocator, + AssetDetailsFlyoutLocatorDefinition, +} from './locators/infra/asset_details_flyout_locator'; +import { + type AssetDetailsLocator, + AssetDetailsLocatorDefinition, +} from './locators/infra/asset_details_locator'; +import { type HostsLocator, HostsLocatorDefinition } from './locators/infra/hosts_locator'; import { type FlamegraphLocator, FlamegraphLocatorDefinition, @@ -48,6 +57,11 @@ export type ObservabilitySharedPluginStart = ReturnType/x-pack/plugins/search_notebooks'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/search_notebooks', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/search_notebooks/{common,public,server}/**/*.{ts,tsx}', + ], +}; diff --git a/x-pack/plugins/search_notebooks/kibana.jsonc b/x-pack/plugins/search_notebooks/kibana.jsonc new file mode 100644 index 00000000000000..d3f671c90e3223 --- /dev/null +++ b/x-pack/plugins/search_notebooks/kibana.jsonc @@ -0,0 +1,19 @@ +{ + "type": "plugin", + "id": "@kbn/search-notebooks", + "owner": "@elastic/enterprise-search-frontend", + "description": "Plugin to provide access to and rendering of python notebooks for use in the persistent developer console.", + "plugin": { + "id": "searchNotebooks", + "server": true, + "browser": false, + "configPath": [ + "xpack", + "search", + "notebooks" + ], + "requiredPlugins": [], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/search_notebooks/package.json b/x-pack/plugins/search_notebooks/package.json new file mode 100644 index 00000000000000..a81945be3c7ad4 --- /dev/null +++ b/x-pack/plugins/search_notebooks/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/search-notebooks", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../scripts/plugin_helpers", + "kbn": "node ../../../scripts/kbn" + } +} diff --git a/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh b/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh new file mode 100755 index 00000000000000..11bf594695fc39 --- /dev/null +++ b/x-pack/plugins/search_notebooks/scripts/download_notebooks.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +SCRIPT_DIR="$(dirname -- "$0")" +URL_FILE="$SCRIPT_DIR/notebooks.txt" +DATA_DIR="$SCRIPT_DIR/../server/data" + +echo "Saving notebooks to $DATA_DIR" + +# Check if the DATA_DIR exists, if not, create it +if [ ! -d "$DATA_DIR" ]; then + echo "Creating directory $DATA_DIR" + mkdir -p "$DATA_DIR" +fi + +# Check if the URL file exists +if [ ! -f "$URL_FILE" ]; then + echo "URL file does not exist: $URL_FILE" + exit 1 +fi + +# Read each line from the URL file +while IFS= read -r url; do + if [ -z "$url" ]; then + # Skip empty lines + continue + fi + + echo "Downloading: $url" + # Extract the filename from the URL + full_filename=$(basename "$url") + filename="${full_filename%.*}" + # Convert filename to snake case + # This replaces non-alphanumeric characters with underscores and lowercases the result + snake_case_filename=$(echo "$filename" | sed -r 's/[^a-zA-Z0-9]+/_/g' | tr '[:upper:]' '[:lower:]') + + # Use curl to download the file. -L follows redirects, and -o specifies the output file path. + curl -L "$url" -o "$DATA_DIR/$snake_case_filename.json" +done < "$URL_FILE" + +echo "Download completed." diff --git a/x-pack/plugins/search_notebooks/scripts/notebooks.txt b/x-pack/plugins/search_notebooks/scripts/notebooks.txt new file mode 100644 index 00000000000000..889e18263dd3e9 --- /dev/null +++ b/x-pack/plugins/search_notebooks/scripts/notebooks.txt @@ -0,0 +1,5 @@ +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/00-quick-start.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/01-keyword-querying-filtering.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/02-hybrid-search.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/03-ELSER.ipynb +https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/04-multilingual.ipynb diff --git a/x-pack/plugins/search_notebooks/server/config.ts b/x-pack/plugins/search_notebooks/server/config.ts new file mode 100644 index 00000000000000..9e2651a1d76aef --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/config.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core/server'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type SearchNotebooksSchema = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type SearchNotebooksConfig = TypeOf; diff --git a/x-pack/plugins/search_notebooks/server/data/00_quick_start.json b/x-pack/plugins/search_notebooks/server/data/00_quick_start.json new file mode 100644 index 00000000000000..3462ab9ff5f108 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/00_quick_start.json @@ -0,0 +1,599 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "87773ce7", + "metadata": { + "id": "87773ce7" + }, + "source": [ + "# Semantic search quick start\n", + "\n", + "\"Open\n", + "\n", + "This interactive notebook will introduce you to some basic operations with Elasticsearch, using the official [Elasticsearch Python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html).\n", + "You'll perform semantic search using [Sentence Transformers](https://www.sbert.net) for text embedding. Learn how to integrate traditional text-based search with semantic search, for a hybrid search system." + ] + }, + { + "cell_type": "markdown", + "id": "a32202e2", + "metadata": { + "id": "a32202e2" + }, + "source": [ + "## Create Elastic Cloud deployment\n", + "\n", + "If you don't have an Elastic Cloud deployment, sign up [here](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook) for a free trial.\n", + "\n", + "Once logged in to your Elastic Cloud account, go to the [Create deployment](https://cloud.elastic.co/deployments/create) page and select **Create deployment**. Leave all settings with their default values." + ] + }, + { + "cell_type": "markdown", + "id": "52a6a607", + "metadata": { + "id": "52a6a607" + }, + "source": [ + "## Install packages and import modules\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to install the `elasticsearch` Python client." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffc5fa6f", + "metadata": { + "id": "ffc5fa6f" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence-transformers" + ] + }, + { + "cell_type": "markdown", + "id": "28AH8LhI-0UD", + "metadata": { + "id": "28AH8LhI-0UD" + }, + "source": [ + "# Setup the Embedding Model\n", + "\n", + "For this example, we're using `all-MiniLM-L6-v2`, part of the `sentence_transformers` library. You can read more about this model on [Huggingface](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2)." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "WHC3hHGW-wbI", + "metadata": { + "id": "WHC3hHGW-wbI" + }, + "outputs": [], + "source": [ + "from sentence_transformers import SentenceTransformer\n", + "\n", + "model = SentenceTransformer(\"all-MiniLM-L6-v2\")" + ] + }, + { + "cell_type": "markdown", + "id": "0241694c", + "metadata": { + "id": "0241694c" + }, + "source": [ + "## Initialize the Elasticsearch client\n", + "\n", + "Now we can instantiate the [Elasticsearch python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/index.html), providing the cloud id and password in your deployment." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f38e0397", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "f38e0397", + "outputId": "ad6df489-d242-4229-a42a-39c5ca19d124" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from getpass import getpass\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "fcd165fa", + "metadata": { + "id": "fcd165fa" + }, + "source": [ + "If you're running Elasticsearch locally or self-managed, you can pass in the Elasticsearch host instead. [Read more](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#_verifying_https_with_certificate_fingerprints_python_3_10_or_later) on how to connect to Elasticsearch locally." + ] + }, + { + "cell_type": "markdown", + "id": "1462ebd8", + "metadata": { + "id": "1462ebd8" + }, + "source": [ + "Confirm that the client has connected with this test." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "25c618eb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "25c618eb", + "outputId": "30a6ba5b-5109-4457-ddfe-5633a077ca9b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.9.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '8aa461beb06aa0417a231c345a1b8c38fb498a0d', 'build_date': '2023-07-19T14:43:58.555259655Z', 'build_snapshot': False, 'lucene_version': '9.7.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "cell_type": "markdown", + "id": "61e1e6d8", + "metadata": { + "id": "61e1e6d8" + }, + "source": [ + "## Index some test data\n", + "\n", + "Our client is set up and connected to our Elastic deployment.\n", + "Now we need some data to test out the basics of Elasticsearch queries.\n", + "We'll use a small index of books with the following fields:\n", + "\n", + "- `title`\n", + "- `authors`\n", + "- `publish_date`\n", + "- `num_reviews`\n", + "- `publisher`\n", + "\n", + "### Create an index\n", + "\n", + "First ensure that you do not have a previously created index with the name `book_index`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "_OAahfg-tqrf", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "_OAahfg-tqrf", + "outputId": "d8f81ba4-cdc9-4e30-edf7-6d5bb16920eb" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True})" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.indices.delete(index=\"book_index\", ignore_unavailable=True)" + ] + }, + { + "cell_type": "markdown", + "id": "064b761a-565d-42f4-9b4a-4df4f190fd3b", + "metadata": {}, + "source": [ + "🔐 NOTE: at any time you can come back to this section and run the `delete` function above to remove your index and start from scratch.\n", + "\n", + "Let's create an Elasticsearch index with the correct mappings for our test data. " + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6bc95238", + "metadata": { + "id": "6bc95238" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True, 'shards_acknowledged': True, 'index': 'book_index'})" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Define the mapping\n", + "mappings = {\n", + " \"properties\": {\n", + " \"title_vector\": {\n", + " \"type\": \"dense_vector\",\n", + " \"dims\": 384,\n", + " \"index\": \"true\",\n", + " \"similarity\": \"cosine\",\n", + " }\n", + " }\n", + "}\n", + "\n", + "# Create the index\n", + "client.indices.create(index=\"book_index\", mappings=mappings)" + ] + }, + { + "cell_type": "markdown", + "id": "075f5eb6", + "metadata": { + "id": "075f5eb6" + }, + "source": [ + "### Index test data\n", + "\n", + "Run the following command to upload some test data, containing information about 10 popular programming books from this [dataset](https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/data.json).\n", + "`model.encode` will encode the text into a vector on the fly, using the model we initialized earlier." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "008d723e", + "metadata": { + "id": "008d723e" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'took': 49, 'errors': False, 'items': [{'index': {'_index': 'book_index', '_id': 'HwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 0, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 1, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IQOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 2, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IgOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 3, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'IwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 4, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 5, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JQOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 6, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JgOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 7, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'JwOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 8, '_primary_term': 1, 'status': 201}}, {'index': {'_index': 'book_index', '_id': 'KAOa7osBiUNHLMdf3q2r', '_version': 1, 'result': 'created', 'forced_refresh': True, '_shards': {'total': 2, 'successful': 1, 'failed': 0}, '_seq_no': 9, '_primary_term': 1, 'status': 201}}]})" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import json\n", + "from urllib.request import urlopen\n", + "\n", + "url = \"https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/data.json\"\n", + "response = urlopen(url)\n", + "books = json.loads(response.read())\n", + "\n", + "operations = []\n", + "for book in books:\n", + " operations.append({\"index\": {\"_index\": \"book_index\"}})\n", + " # Transforming the title into an embedding using the model\n", + " book[\"title_vector\"] = model.encode(book[\"title\"]).tolist()\n", + " operations.append(book)\n", + "client.bulk(index=\"book_index\", operations=operations, refresh=True)" + ] + }, + { + "cell_type": "markdown", + "id": "cd8b03e0", + "metadata": { + "id": "cd8b03e0" + }, + "source": [ + "## Aside: Pretty printing Elasticsearch responses\n", + "\n", + "Your API calls will return hard-to-read nested JSON.\n", + "We'll create a little function called `pretty_response` to return nice, human-readable outputs from our examples." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "f12ce2c9", + "metadata": { + "id": "f12ce2c9" + }, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " publisher = hit[\"_source\"][\"publisher\"]\n", + " num_reviews = hit[\"_source\"][\"num_reviews\"]\n", + " authors = hit[\"_source\"][\"authors\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nPublisher: {publisher}\\nReviews: {num_reviews}\\nAuthors: {authors}\\nScore: {score}\"\n", + " print(pretty_output)" + ] + }, + { + "cell_type": "markdown", + "id": "39bdefe0", + "metadata": { + "id": "39bdefe0" + }, + "source": [ + "## Making queries\n", + "\n", + "Now that we have indexed the books, we want to perform a semantic search for books that are similar to a given query.\n", + "We embed the query and perform a search." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "Df7hwcIjYwMT", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Df7hwcIjYwMT", + "outputId": "e63884d7-d4a5-4f5d-ea43-fc2f0793f040" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 0.80428284\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 0.6989136\n", + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 0.6796988\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.62065494\n", + "\n", + "ID: KAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2012-06-27\n", + "Title: Introduction to the Theory of Computation\n", + "Summary: Introduction to the theory of computation and complexity theory\n", + "Publisher: cengage learning\n", + "Reviews: 33\n", + "Authors: ['michael sipser']\n", + "Score: 0.6008769\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.571234\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.56499225\n", + "\n", + "ID: IQOa7osBiUNHLMdf3q2r\n", + "Publication date: 2020-04-06\n", + "Title: Artificial Intelligence: A Modern Approach\n", + "Summary: Comprehensive introduction to the theory and practice of artificial intelligence\n", + "Publisher: pearson\n", + "Reviews: 39\n", + "Authors: ['stuart russell', 'peter norvig']\n", + "Score: 0.56054837\n", + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.54226947\n", + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Publisher: no starch press\n", + "Reviews: 42\n", + "Authors: ['eric matthes']\n", + "Score: 0.5254088\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\"javascript books\"),\n", + " \"k\": 10,\n", + " \"num_candidates\": 100,\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "id": "LdJCpbQMeml5", + "metadata": { + "id": "LdJCpbQMeml5" + }, + "source": [ + "## Filtering\n", + "\n", + "Filter context is mostly used for filtering structured data. For example, use filter context to answer questions like:\n", + "\n", + "- _Does this timestamp fall into the range 2015 to 2016?_\n", + "- _Is the status field set to \"published\"?_\n", + "\n", + "Filter context is in effect whenever a query clause is passed to a filter parameter, such as the `filter` or `must_not` parameters in a `bool` query.\n", + "\n", + "[Learn more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-filter-context.html#filter-context) about filter context in the Elasticsearch docs." + ] + }, + { + "cell_type": "markdown", + "id": "dRSrPMyFf7w7", + "metadata": { + "id": "dRSrPMyFf7w7" + }, + "source": [ + "### Example: Keyword Filtering\n", + "\n", + "This is an example of adding a keyword filter to the query.\n", + "\n", + "The example retrieves the top books that are similar to \"javascript books\" based on their title vectors, and also Addison-Wesley as publisher." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "WoE0yTchfj3A", + "metadata": { + "id": "WoE0yTchfj3A" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.62065494\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.56499225\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\"javascript books\"),\n", + " \"k\": 10,\n", + " \"num_candidates\": 100,\n", + " \"filter\": {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json b/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json new file mode 100644 index 00000000000000..84f1830ecebf06 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/01_keyword_querying_filtering.json @@ -0,0 +1,912 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "83LdOUCwwHzs" + }, + "source": [ + "# Keyword querying and filtering\n", + "\n", + "\"Open\n", + "\n", + "This interactive notebook will introduce you to the basic Elasticsearch queries, using the official Elasticsearch Python client. Before getting started on this section you should work through our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb), as you will be using the same dataset." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Install and import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch pandas" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from getpass import getpass" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Create the client instance\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Pretty printing Elasticsearch responses\n", + "\n", + "Let's add a helper function to print Elasticsearch responses in a readable format. This function is similar to the one that was used in the [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " publisher = hit[\"_source\"][\"publisher\"]\n", + " num_reviews = hit[\"_source\"][\"num_reviews\"]\n", + " authors = hit[\"_source\"][\"authors\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nPublisher: {publisher}\\nReviews: {num_reviews}\\nAuthors: {authors}\\nScore: {score}\"\n", + " print(pretty_output)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "22onltbgxxGm" + }, + "source": [ + "## Querying\n", + "🔐 NOTE: to run the queries that follow you need the `book_index` dataset from our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb). If you haven't worked through the quick start, please follow the steps described there to create an Elasticsearch deployment with the dataset in it, and then come back to run the queries here.\n", + "\n", + "In the query context, a query clause answers the question _“How well does this document match this query clause?”_. In addition to deciding whether or not the document matches, the query clause also calculates a relevance score in the `_score `metadata field.\n", + "\n", + "### Full text queries\n", + "\n", + "Full text queries enable you to search analyzed text fields such as the body of an email. The query string is processed using the same analyzer that was applied to the field during indexing.\n", + "\n", + "* **match**.\n", + " The standard query for performing full text queries, including fuzzy matching and phrase or proximity queries.\n", + "* **multi-match**.\n", + " The multi-field version of the match query." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "clXQwoFQ6x61" + }, + "source": [ + "#### Match query\n", + "Returns documents that `match` a provided text, number, date or boolean value. The provided text is analyzed before matching.\n", + "\n", + "The `match` query is the standard query for performing a full-text search, including options for fuzzy matching.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html#match-query-ex-request).\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "q_OE0XVx6_qX", + "outputId": "6a1d7760-5fb9-4809-e060-e35a398ed3c4" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 0.7042277\n", + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Publisher: no starch press\n", + "Reviews: 42\n", + "Authors: ['eric matthes']\n", + "Score: 0.7042277\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.6771651\n", + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.62883455\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 0.62883455\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"match\": {\"summary\": {\"query\": \"guide\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "H-n6hoVsfAqc" + }, + "source": [ + "#### Multi-match query\n", + "\n", + "The `multi_match` query builds on the match query to allow multi-field queries.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-multi-match-query.html)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 154 + }, + "id": "TRmGYM94gCtb", + "outputId": "dc58b19f-e585-4d0a-d065-ac3fc18ae123" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 2.0307527\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.7064086\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 1.6360576\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"multi_match\": {\"query\": \"javascript\", \"fields\": [\"summary\", \"title\"]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FnBeBIVKiPnS" + }, + "source": [ + "Individual fields can be boosted with the caret (^) notation. Note in the following query how the score of the results that have \"JavaScript\" in their title is multiplied." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 154 + }, + "id": "_aI7hnH0ixkG", + "outputId": "2af27f3d-f9fd-4c7a-cab5-7cb06132582c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 6.0922585\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 5.1192265\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Publisher: oreilly\n", + "Reviews: 36\n", + "Authors: ['kyle simpson']\n", + "Score: 1.6360576\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"multi_match\": {\"query\": \"javascript\", \"fields\": [\"summary\", \"title^3\"]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "yXipv0xSk-nK" + }, + "source": [ + "### Term-level Queries\n", + "\n", + "You can use term-level queries to find documents based on precise values in structured data. Examples of structured data include date ranges, IP addresses, prices, or product IDs." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Term search\n", + "\n", + "Returns document that contain exactly the search term." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 1.4816045\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.4816045\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"term\": {\"publisher.keyword\": \"addison-wesley\"}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Range search\n", + "\n", + "Returns documents that contain terms within a provided range.\n", + "\n", + "The following example returns books that have at least 45 reviews." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 1.0\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"range\": {\"num_reviews\": {\"gte\": 45}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Prefix search\n", + "\n", + "Returns documents that contain a specific prefix in a provided field.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-prefix-query.html)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "dCr1pwlqlOE7", + "outputId": "ae55cd66-0ded-4868-dac5-5815ea317c44" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 1.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"prefix\": {\"title\": {\"value\": \"java\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "a606YcCmmLHW" + }, + "source": [ + "#### Fuzzy search\n", + "\n", + "Returns documents that contain terms similar to the search term, as measured by a Levenshtein edit distance.\n", + "\n", + "An edit distance is the number of one-character changes needed to turn one term into another. These changes can include:\n", + "\n", + "* Changing a character (box → fox)\n", + "* Removing a character (black → lack)\n", + "* Inserting a character (sic → sick)\n", + "* Transposing two adjacent characters (act → cat)\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-fuzzy-query.html)\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 133 + }, + "id": "dTMc-IxPmbtC", + "outputId": "9acf74fd-bc16-45df-80f3-49504860b10a" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Publisher: no starch press\n", + "Reviews: 38\n", + "Authors: ['marijn haverbeke']\n", + "Score: 1.6246022\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.3651271\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\", query={\"fuzzy\": {\"title\": {\"value\": \"pyvascript\"}}}\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Combining Query Conditions\n", + "\n", + "Compound queries wrap other compound or leaf queries, either to combine their results and scores, or to change their behaviour. They also allow you to switch from query to filter context, but that will be covered later in the Filtering section." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "7do0lmxA_v25" + }, + "source": [ + "#### bool.must (AND)\n", + "The clauses must appear in matching documents and will contribute to the score. This effectively performs an \"AND\" logical operation on the given sub-queries." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 111 + }, + "id": "8_C-JHRQFDl7", + "outputId": "be59d18b-5e20-4db0-8697-2e7746251742" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 3.788629\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"must\": [\n", + " {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " {\"term\": {\"authors.keyword\": \"richard helm\"}},\n", + " ]\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "eNlncytRIl9h" + }, + "source": [ + "#### bool.should (OR)\n", + "\n", + "The clause should appear in the matching document. This performs an \"OR\" logical operation on the given sub-queries." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 219 + }, + "id": "GRm9T1vfIsmF", + "outputId": "d9fb6936-3ffb-4fff-9467-1f7ac7b41490" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 2.3070245\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Publisher: addison-wesley\n", + "Reviews: 30\n", + "Authors: ['andrew hunt', 'david thomas']\n", + "Score: 1.4816045\n", + "\n", + "ID: JQOa7osBiUNHLMdf3q2r\n", + "Publication date: 1994-10-31\n", + "Title: Design Patterns: Elements of Reusable Object-Oriented Software\n", + "Summary: Guide to design patterns that can be used in any object-oriented language\n", + "Publisher: addison-wesley\n", + "Reviews: 45\n", + "Authors: ['erich gamma', 'richard helm', 'ralph johnson', 'john vlissides']\n", + "Score: 1.4816045\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"should\": [\n", + " {\"term\": {\"publisher.keyword\": \"addison-wesley\"}},\n", + " {\"term\": {\"authors.keyword\": \"douglas crockford\"}},\n", + " ]\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PG9TYqL-8H29" + }, + "source": [ + "## Filtering\n", + "\n", + "In a filter context, a query clause answers the question *“Does this document match this query clause?”* The answer is a simple Yes or No — no scores are calculated. Filter context is mostly used for filtering structured data, for example:\n", + "* Does this `timestamp` fall into the range 2015 to 2016?\n", + "* Is the `status` field set to `\"published\"`?\n", + "\n", + "Filter context is in effect whenever a query clause is passed to a `filter` parameter, such as the `filter` or `must_not` parameters in the `bool` query.\n", + "\n", + "[Read more](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "PGTFXUIkJG4t" + }, + "source": [ + "### bool.filter\n", + "\n", + "The clause (query) must appear for the document to be included in the results. Unlike query context searches such as `term`, `bool.must` or `bool.should`, a matching `score` isn't calculated because filter clauses are executed in filter context." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 197 + }, + "id": "6RH0OALLJPHv", + "outputId": "338419b0-3e60-4ac9-ddeb-67cac6202ca2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n", + "\n", + "ID: JgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2011-05-13\n", + "Title: The Clean Coder: A Code of Conduct for Professional Programmers\n", + "Summary: A guide to professional conduct in the field of software engineering\n", + "Publisher: prentice hall\n", + "Reviews: 20\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"bool\": {\"filter\": [{\"term\": {\"publisher.keyword\": \"prentice hall\"}}]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### bool.must_not\n", + "The clause (query) must not appear in the matching documents. Because this query also runs in filter context, no scores are calculated; the filter just determines if a document is included in the results or not." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IgOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-08-11\n", + "Title: Clean Code: A Handbook of Agile Software Craftsmanship\n", + "Summary: A guide to writing code that is easy to read, understand and maintain\n", + "Publisher: prentice hall\n", + "Reviews: 55\n", + "Authors: ['robert c. martin']\n", + "Score: 0.0\n", + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 0.0\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\"bool\": {\"must_not\": [{\"range\": {\"num_reviews\": {\"lte\": 45}}}]}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Using Filters with Queries\n", + "Filters are often added to search queries with the intention of limiting the search to a subset of the documents. A filter can cleanly eliminate documents from a search, without altering the relevance scores of the results.\n", + "\n", + "The next example returns books that have the word \"javascript\" in their title, only among the books that have more than 45 reviews." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: JwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2008-05-15\n", + "Title: JavaScript: The Good Parts\n", + "Summary: A deep dive into the parts of JavaScript that are essential to writing maintainable code\n", + "Publisher: oreilly\n", + "Reviews: 51\n", + "Authors: ['douglas crockford']\n", + "Score: 1.7064086\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " query={\n", + " \"bool\": {\n", + " \"must\": [{\"match\": {\"title\": {\"query\": \"javascript\"}}}],\n", + " \"must_not\": [{\"range\": {\"num_reviews\": {\"lte\": 45}}}],\n", + " }\n", + " },\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json b/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json new file mode 100644 index 00000000000000..c5e9fd22caad68 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/02_hybrid_search.json @@ -0,0 +1,306 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Hybrid Search using RRF\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/02-hybrid-search.ipynb)\n", + "\n", + "In this example we'll use the reciprocal rank fusion algorithm to combine the results of BM25 and kNN semantic search.\n", + "We'll use the same dataset we used in our [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide.\n", + "\n", + "You can use RRF for hybrid search out of the box, without any additional configuration. This example demonstrates how RRF ranking works at a basic level." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install packages and initialize the Elasticsearch Python client\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the packages we need for this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence_transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next we need to import the `elasticsearch` module and the `getpass` module.\n", + "`getpass` is part of the Python standard library and is used to securely prompt for credentials." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch\n", + "from sentence_transformers import SentenceTransformer\n", + "from getpass import getpass\n", + "\n", + "model = SentenceTransformer(\"all-MiniLM-L6-v2\")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "AMSePFiZCRqX" + }, + "source": [ + "Now we can instantiate the Python Elasticsearch client.\n", + "First we prompt the user for their password and Cloud ID.\n", + "\n", + "🔐 NOTE: `getpass` enables us to securely prompt the user for credentials without echoing them to the terminal, or storing it in memory.\n", + "\n", + "Then we create a `client` object that instantiates an instance of the `Elasticsearch` class." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h0MdAZ53CdKL", + "outputId": "96ea6f81-f935-4d51-c4a7-af5a896180f1" + }, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "bRHbecNeEDL3" + }, + "source": [ + "Confirm that the client has connected with this test" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rdiUKqZbEKfF", + "outputId": "43b6f1cd-a43e-4dbe-caa5-7fd170464881" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.9.0', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '8aa461beb06aa0417a231c345a1b8c38fb498a0d', 'build_date': '2023-07-19T14:43:58.555259655Z', 'build_snapshot': False, 'lucene_version': '9.7.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "enHQuT57DhD1" + }, + "source": [ + "Refer to https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect to a self-managed deployment.\n", + "\n", + "Read https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect using API keys.\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "WgWDMgf9NkHL" + }, + "source": [ + "## Pretty printing Elasticsearch responses\n", + "\n", + "Let's add a helper function to print Elasticsearch responses in a readable format. This function is similar to the one that was used in the [quickstart](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb) guide." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "def pretty_response(response):\n", + " if len(response[\"hits\"][\"hits\"]) == 0:\n", + " print(\"Your search returned no results.\")\n", + " else:\n", + " for hit in response[\"hits\"][\"hits\"]:\n", + " id = hit[\"_id\"]\n", + " publication_date = hit[\"_source\"][\"publish_date\"]\n", + " rank = hit[\"_rank\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " summary = hit[\"_source\"][\"summary\"]\n", + " pretty_output = f\"\\nID: {id}\\nPublication date: {publication_date}\\nTitle: {title}\\nSummary: {summary}\\nRank: {rank}\"\n", + " print(pretty_output)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "MrBCHdH1u8Wd" + }, + "source": [ + "# Querying Documents with Hybrid Search\n", + "\n", + "🔐 NOTE: Before you can run the query in this section, you need the `book_index` dataset from our [quick start](https://github.com/elastic/elasticsearch-labs/blob/main/notebooks/search/00-quick-start.ipynb). If you haven't worked through the quick start, please follow the steps described there to create an Elasticsearch deployment with the dataset in it, and then come back to run the query here.\n", + "\n", + "Now we need to perform a query using two different search strategies:\n", + "- Semantic search using the \"all-MiniLM-L6-v2\" embedding model\n", + "- Keyword search using the \"title\" field\n", + "\n", + "We then use [Reciprocal Rank Fusion (RRF)](https://www.elastic.co/guide/en/elasticsearch/reference/current/rrf.html) to balance the scores to provide a final list of documents, ranked in order of relevance. RRF is a ranking algorithm for combining results from different information retrieval strategies.\n", + "\n", + "Note that _score is null, and we instead use _rank to show our top-ranked documents." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: IAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-05-03\n", + "Title: Python Crash Course\n", + "Summary: A fast-paced, no-nonsense guide to programming in Python\n", + "Rank: 1\n", + "\n", + "ID: HwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2019-10-29\n", + "Title: The Pragmatic Programmer: Your Journey to Mastery\n", + "Summary: A guide to pragmatic programming for software engineers and developers\n", + "Rank: 2\n", + "\n", + "ID: JAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2018-12-04\n", + "Title: Eloquent JavaScript\n", + "Summary: A modern introduction to programming\n", + "Rank: 3\n", + "\n", + "ID: IwOa7osBiUNHLMdf3q2r\n", + "Publication date: 2015-03-27\n", + "Title: You Don't Know JS: Up & Going\n", + "Summary: Introduction to JavaScript and programming as a whole\n", + "Rank: 4\n", + "\n", + "ID: KAOa7osBiUNHLMdf3q2r\n", + "Publication date: 2012-06-27\n", + "Title: Introduction to the Theory of Computation\n", + "Summary: Introduction to the theory of computation and complexity theory\n", + "Rank: 5\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"book_index\",\n", + " size=5,\n", + " query={\"match\": {\"summary\": \"python programming\"}},\n", + " knn={\n", + " \"field\": \"title_vector\",\n", + " \"query_vector\": model.encode(\n", + " \"python programming\"\n", + " ).tolist(), # generate embedding for query so it can be compared to `title_vector`\n", + " \"k\": 5,\n", + " \"num_candidates\": 10,\n", + " },\n", + " rank={\"rrf\": {}},\n", + ")\n", + "\n", + "pretty_response(response)" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/03_elser.json b/x-pack/plugins/search_notebooks/server/data/03_elser.json new file mode 100644 index 00000000000000..c6c5e6afcbc3fc --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/03_elser.json @@ -0,0 +1,552 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Semantic Search using ELSER v2 text expansion\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/03-ELSER.ipynb)\n", + "\n", + "\n", + "Learn how to use the [ELSER](https://www.elastic.co/guide/en/machine-learning/current/ml-nlp-elser.html) for text expansion-powered semantic search.\n", + "\n", + "**`Note:`** This notebook demonstrates how to use ELSER model `.elser_model_2` model which offers an improved retrieval accuracy. \n", + "\n", + "If you have set up an index with ELSER model `.elser_model_1`, and would like to upgrade to ELSER v2 model - `.elser_model_2`, Please follow instructions from the notebook on [how to upgrade an index to use elser model](../model-upgrades/upgrading-index-to-use-elser.ipynb)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install and Connect\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the following packages:\n", + "\n", + "- `elasticsearch`\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next, we need to import the modules we need.\n", + "🔐 NOTE: `getpass` enables us to securely prompt the user for credentials without echoing them to the terminal, or storing it in memory." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [], + "source": [ + "from elasticsearch import Elasticsearch, helpers, exceptions\n", + "from urllib.request import urlopen\n", + "from getpass import getpass\n", + "import json\n", + "import time" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "AMSePFiZCRqX" + }, + "source": [ + "Now we can instantiate the Python Elasticsearch client.\n", + "\n", + "First we prompt the user for their password and Cloud ID.\n", + "Then we create a `client` object that instantiates an instance of the `Elasticsearch` class." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h0MdAZ53CdKL", + "outputId": "96ea6f81-f935-4d51-c4a7-af5a896180f1" + }, + "outputs": [], + "source": [ + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#finding-your-cloud-id\n", + "ELASTIC_CLOUD_ID = getpass(\"Elastic Cloud ID: \")\n", + "\n", + "# https://www.elastic.co/search-labs/tutorials/install-elasticsearch/elastic-cloud#creating-an-api-key\n", + "ELASTIC_API_KEY = getpass(\"Elastic Api Key: \")\n", + "\n", + "# Create the client instance\n", + "client = Elasticsearch(\n", + " # For local development\n", + " # hosts=[\"http://localhost:9200\"]\n", + " cloud_id=ELASTIC_CLOUD_ID,\n", + " api_key=ELASTIC_API_KEY,\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "bRHbecNeEDL3" + }, + "source": [ + "Confirm that the client has connected with this test" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rdiUKqZbEKfF", + "outputId": "43b6f1cd-a43e-4dbe-caa5-7fd170464881" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'name': 'instance-0000000011', 'cluster_name': 'd1bd36862ce54c7b903e2aacd4cd7f0a', 'cluster_uuid': 'tIkh0X_UQKmMFQKSfUw-VQ', 'version': {'number': '8.11.1', 'build_flavor': 'default', 'build_type': 'docker', 'build_hash': '6f9ff581fbcde658e6f69d6ce03050f060d1fd0c', 'build_date': '2023-11-11T10:05:59.421038163Z', 'build_snapshot': False, 'lucene_version': '9.8.0', 'minimum_wire_compatibility_version': '7.17.0', 'minimum_index_compatibility_version': '7.0.0'}, 'tagline': 'You Know, for Search'}\n" + ] + } + ], + "source": [ + "print(client.info())" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "enHQuT57DhD1" + }, + "source": [ + "Refer to https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect to a self-managed deployment.\n", + "\n", + "Read https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/connecting.html#connect-self-managed-new to learn how to connect using API keys.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Download and Deploy ELSER Model\n", + "\n", + "In this example, we are going to download and deploy the ELSER model in our ML node. Make sure you have an ML node in order to run the ELSER model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# delete model if already downloaded and deployed\n", + "try:\n", + " client.ml.delete_trained_model(model_id=\".elser_model_2\", force=True)\n", + " print(\"Model deleted successfully, We will proceed with creating one\")\n", + "except exceptions.NotFoundError:\n", + " print(\"Model doesn't exist, but We will proceed with creating one\")\n", + "\n", + "# Creates the ELSER model configuration. Automatically downloads the model if it doesn't exist.\n", + "client.ml.put_trained_model(\n", + " model_id=\".elser_model_2\", input={\"field_names\": [\"text_field\"]}\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The above command will download the ELSER model. This will take a few minutes to complete. Use the following command to check the status of the model download." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "while True:\n", + " status = client.ml.get_trained_models(\n", + " model_id=\".elser_model_2\", include=\"definition_status\"\n", + " )\n", + "\n", + " if status[\"trained_model_configs\"][0][\"fully_defined\"]:\n", + " print(\"ELSER Model is downloaded and ready to be deployed.\")\n", + " break\n", + " else:\n", + " print(\"ELSER Model is downloaded but not ready to be deployed.\")\n", + " time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Once the model is downloaded, we can deploy the model in our ML node. Use the following command to deploy the model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Start trained model deployment if not already deployed\n", + "client.ml.start_trained_model_deployment(\n", + " model_id=\".elser_model_2\", number_of_allocations=1, wait_for=\"starting\"\n", + ")\n", + "\n", + "while True:\n", + " status = client.ml.get_trained_models_stats(\n", + " model_id=\".elser_model_2\",\n", + " )\n", + " if status[\"trained_model_stats\"][0][\"deployment_stats\"][\"state\"] == \"started\":\n", + " print(\"ELSER Model has been successfully deployed.\")\n", + " break\n", + " else:\n", + " print(\"ELSER Model is currently being deployed.\")\n", + " time.sleep(5)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This also will take a few minutes to complete." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "EmELvr_JK_22" + }, + "source": [ + "# Indexing Documents with ELSER\n", + "\n", + "In order to use ELSER on our Elastic Cloud deployment we'll need to create an ingest pipeline that contains an inference processor that runs the ELSER model.\n", + "Let's add that pipeline using the [`put_pipeline`](https://www.elastic.co/guide/en/elasticsearch/reference/master/put-pipeline-api.html) method." + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "XhRng99KLQsd", + "outputId": "00ea73b5-45a4-472b-f4bc-2c2c790ab94d" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True})" + ] + }, + "execution_count": 42, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.ingest.put_pipeline(\n", + " id=\"elser-ingest-pipeline\",\n", + " description=\"Ingest pipeline for ELSER\",\n", + " processors=[\n", + " {\n", + " \"inference\": {\n", + " \"model_id\": \".elser_model_2\",\n", + " \"input_output\": [\n", + " {\"input_field\": \"plot\", \"output_field\": \"plot_embedding\"}\n", + " ],\n", + " }\n", + " }\n", + " ],\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "0wCH7YHLNW3i" + }, + "source": [ + "Let's note a few important parameters from that API call:\n", + "\n", + "- `inference`: A processor that performs inference using a machine learning model.\n", + "- `model_id`: Specifies the ID of the machine learning model to be used. In this example, the model ID is set to `.elser_model_2`.\n", + "- `input_output`: Specifies input and output fields\n", + "- `input_field`: Field name from which the `sparse_vector` representation are created.\n", + "- `output_field`: Field name which contains inference results. " + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "TF_wxIAhD07a" + }, + "source": [ + "## Create index\n", + "\n", + "To use the ELSER model at index time, we'll need to create an index mapping that supports a [`text_expansion`](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-text-expansion-query.html) query.\n", + "The mapping includes a field of type [`sparse_vector`](https://www.elastic.co/guide/en/elasticsearch/reference/master/sparse-vector.html) to work with our feature vectors of interest.\n", + "This field contains the token-weight pairs the ELSER model created based on the input text.\n", + "\n", + "Let's create an index named `elser-example-movies` with the mappings we need.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cvYECABJJs_2", + "outputId": "18fb51e4-c4f6-4d1b-cb2d-bc6f8ec1aa84" + }, + "outputs": [ + { + "data": { + "text/plain": [ + "ObjectApiResponse({'acknowledged': True, 'shards_acknowledged': True, 'index': 'elser-example-movies'})" + ] + }, + "execution_count": 46, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "client.indices.delete(index=\"elser-example-movies\", ignore_unavailable=True)\n", + "client.indices.create(\n", + " index=\"elser-example-movies\",\n", + " settings={\"index\": {\"default_pipeline\": \"elser-ingest-pipeline\"}},\n", + " mappings={\n", + " \"properties\": {\n", + " \"plot\": {\n", + " \"type\": \"text\",\n", + " \"fields\": {\"keyword\": {\"type\": \"keyword\", \"ignore_above\": 256}},\n", + " },\n", + " \"plot_embedding\": {\"type\": \"sparse_vector\"},\n", + " }\n", + " },\n", + ")" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "lFHgRUYVpNKP" + }, + "source": [ + "## Insert Documents\n", + "Let's insert our example dataset of 12 movies.\n", + "\n", + "If you get an error, check the model has been deployed and is available in the ML node. In newer versions of Elastic Cloud, ML node is autoscaled and the ML node may not be ready yet. Wait for a few minutes and try again." + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IBfqgdAcuKRG", + "outputId": "3b86daa1-ade1-4ff3-da81-4207fa814d30" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Done indexing documents into `elser-example-movies` index!\n" + ] + } + ], + "source": [ + "url = \"https://raw.githubusercontent.com/elastic/elasticsearch-labs/main/notebooks/search/movies.json\"\n", + "response = urlopen(url)\n", + "\n", + "# Load the response data into a JSON object\n", + "data_json = json.loads(response.read())\n", + "\n", + "# Prepare the documents to be indexed\n", + "documents = []\n", + "for doc in data_json:\n", + " documents.append(\n", + " {\n", + " \"_index\": \"elser-example-movies\",\n", + " \"_source\": doc,\n", + " }\n", + " )\n", + "\n", + "# Use helpers.bulk to index\n", + "helpers.bulk(client, documents)\n", + "\n", + "print(\"Done indexing documents into `elser-example-movies` index!\")\n", + "time.sleep(3)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "oCj3jHHML4Tn" + }, + "source": [ + "Inspect a new document to confirm that it now has an `plot_embedding` field that contains a list of new, additional terms.\n", + "These terms are the **text expansion** of the field(s) you targeted for ELSER inference in `input_field` while creating the pipeline. \n", + "ELSER essentially creates a tree of expanded terms to improve the semantic searchability of your documents.\n", + "We'll be able to search these documents using a `text_expansion` query.\n", + "\n", + "But first let's start with a simple keyword search, to see how ELSER delivers semantically relevant results out of the box." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Zy5GT2xb38oz" + }, + "source": [ + "# Searching Documents\n", + "\n", + "Let's test out semantic search using ELSER." + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "bAZRxja-5Q6X", + "outputId": "37a26a2c-4284-4e51-c34e-9a55edf77cb8" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Score: 12.763346\n", + "Title: Fight Club\n", + "Plot: An insomniac office worker and a devil-may-care soapmaker form an underground fight club that evolves into something much, much more.\n", + "\n", + "Score: 9.930427\n", + "Title: Pulp Fiction\n", + "Plot: The lives of two mob hitmen, a boxer, a gangster and his wife, and a pair of diner bandits intertwine in four tales of violence and redemption.\n", + "\n", + "Score: 9.4883375\n", + "Title: The Matrix\n", + "Plot: A computer hacker learns from mysterious rebels about the true nature of his reality and his role in the war against its controllers.\n", + "\n" + ] + } + ], + "source": [ + "response = client.search(\n", + " index=\"elser-example-movies\",\n", + " size=3,\n", + " query={\n", + " \"text_expansion\": {\n", + " \"plot_embedding\": {\n", + " \"model_id\": \".elser_model_2\",\n", + " \"model_text\": \"fighting movie\",\n", + " }\n", + " }\n", + " },\n", + ")\n", + "\n", + "for hit in response[\"hits\"][\"hits\"]:\n", + " doc_id = hit[\"_id\"]\n", + " score = hit[\"_score\"]\n", + " title = hit[\"_source\"][\"title\"]\n", + " plot = hit[\"_source\"][\"plot\"]\n", + " print(f\"Score: {score}\\nTitle: {title}\\nPlot: {plot}\\n\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Next Steps\n", + "Now that we have a working example of semantic search using ELSER, you can try it out on your own data. Don't forget to scale down the ML node when you are done. " + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.6" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/data/04_multilingual.json b/x-pack/plugins/search_notebooks/server/data/04_multilingual.json new file mode 100644 index 00000000000000..9b41984a69035e --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/data/04_multilingual.json @@ -0,0 +1,666 @@ +{ + "cells": [ + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "s49gpkvZ7q53" + }, + "source": [ + "# Multilingual semantic search\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/elastic/elasticsearch-labs/blob/main/notebooks/search/04-multilingual.ipynb)\n", + "\n", + "In this example we'll use a multilingual embedding model\n", + "[multilingual-e5-base](https://huggingface.co/intfloat/multilingual-e5-base) to perform search on a dataset of mixed\n", + "language documents. Using this model, we can search in two ways:\n", + " * Across languages, for example using a query in German to find documents in English\n", + " * Within a non-English language, for example using a query in German to find documents in German\n", + "\n", + " While this example is using dense retrieval only, it's possible to also combine dense and traditional lexical retrieval\n", + " with hybrid search. For more information on lexical multilingual search, please see the blog post\n", + " [Multilingual search using language identification in Elasticsearch](https://www.elastic.co/search-labs/multilingual-vector-search-e5-embedding-model).\n", + "\n", + " The dataset used contains snippets of Wikipedia passages from the [MIRACL](https://project-miracl.github.io/) dataset." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "Y01AXpELkygt" + }, + "source": [ + "# 🧰 Requirements\n", + "\n", + "For this example, you will need:\n", + "\n", + "- Python 3.6 or later\n", + "- An Elastic deployment with a machine learning node\n", + " - We'll be using [Elastic Cloud](https://www.elastic.co/guide/en/cloud/current/ec-getting-started.html) for this example (available with a [free trial](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook))\n", + "- The [Elastic Python client](https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/installation.html)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "N4pI1-eIvWrI" + }, + "source": [ + "## Create Elastic Cloud deployment\n", + "\n", + "If you don't have an Elastic Cloud deployment, sign up [here](https://cloud.elastic.co/registration?utm_source=github&utm_content=elasticsearch-labs-notebook) for a free trial.\n", + "\n", + "Once logged in to your Elastic Cloud account, go to the [Create deployment](https://cloud.elastic.co/deployments/create) page and select **Create deployment**. Leave all settings with their default values." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gaTFHLJC-Mgi" + }, + "source": [ + "# Install packages and initialize the Elasticsearch Python client\n", + "\n", + "To get started, we'll need to connect to our Elastic deployment using the Python client.\n", + "Because we're using an Elastic Cloud deployment, we'll use the **Cloud ID** to identify our deployment.\n", + "\n", + "First we need to `pip` install the packages we need for this example." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "K9Q1p2C9-wce", + "outputId": "204d5aee-571e-4363-be6e-f87d058f2d29" + }, + "outputs": [], + "source": [ + "!pip install -qU elasticsearch sentence_transformers" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": { + "id": "gEzq2Z1wBs3M" + }, + "source": [ + "Next we need to import the `elasticsearch` module and the `getpass` module.\n", + "`getpass` is part of the Python standard library and is used to securely prompt for credentials." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "id": "uP_GTVRi-d96" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "7ea79a149aaf42cd8e178597038deb3c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading pytorch_model.bin: 0%| | 0.00/1.11G [00:00 \"Gesundheit\"\n", + " * \"wall\" -> \"Mauer\"\n", + "\n", + "The first example searches for a word in English." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 9002#0\n", + "Language: de\n", + "Title: Gesundheits- und Krankenpflege\n", + "Passage: Die Gesundheits- und Krankenpflege als Berufsfeld umfasst die Versorgung und Betreuung von Menschen aller Altersgruppen,\n", + "insbesondere kranke, behinderte und sterbende Erwachsene. Die Gesundheits- und Kinderkrankenpflege hat ihren Schwerpunkt\n", + "in der Versorgung von Kindern und Jugendlichen. In beiden Fachrichtungen gehört die Verhütung von Krankheiten und\n", + "Gesunderhaltung zum Aufgabengebiet der professionellen Pflege.\n", + "Score: 0.8986236\n", + "\n", + "ID: 8881#0\n", + "Language: en\n", + "Title: Doctor (title)\n", + "Passage: Doctor is an academic title that originates from the Latin word of the same spelling and meaning. The word is originally\n", + "an agentive noun of the Latin verb \"docēre\" [dɔˈkeːrɛ] 'to teach'. It has been used as an academic title in Europe since\n", + "the 13th century, when the first Doctorates were awarded at the University of Bologna and the University of Paris.\n", + "Having become established in European universities, this usage spread around the world. Contracted \"Dr\" or \"Dr.\", it is\n", + "used as a designation for a person who has obtained a Doctorate (e.g. PhD). In many parts of the world it is also used\n", + "by medical practitioners, regardless of whether or not they hold a doctoral-level degree.\n", + "Score: 0.8904184\n" + ] + } + ], + "source": [ + "pretty_response(query(\"health\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that in the results above, we see that the document about healthcare,\n", + "even though it's in German, matches better to the query \"health\",\n", + "versus the English document which doesn't talk about health specifically but about doctors more generally.\n", + "This is the power of a multilingual embedding which embeds meaning across languages.\n", + "\n", + "The next example also searches for a word in English, but only retrieves results in German." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 2270104#0\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: London Wall ist die strategische Stadtmauer, die die Römer um Londinium gebaut haben, um die Stadt zu schützen, die über\n", + "den wichtigen Hafen an der Themse verfügte. Bis ins späte Mittelalter hinein bildete diese Stadtmauer die Grenzen von\n", + "London. Heute ist \"London Wall\" auch der Name einer Straße, die an einem noch bestehenden Abschnitt der Stadtmauer\n", + "verläuft.\n", + "Score: 0.8941858\n", + "\n", + "ID: 2270104#1\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: Die Mauer wurde Ende des zweiten oder Anfang des dritten Jahrhunderts erbaut, wahrscheinlich zwischen 190 und 225,\n", + "vermutlich zwischen 200 und 220. Sie entstand somit etwa achtzig Jahre nach dem im Jahr 120 erfolgten Bau der Festung,\n", + "deren nördliche und westliche Mauern verstärkt und in der Höhe verdoppelt wurden, um einen Teil der neuen Stadtmauer zu\n", + "bilden. Die Anlage wurde zumindest bis zum Ende des vierten Jahrhunderts weiter ausgebaut. Sie zählt zu den letzten\n", + "großen Bauprojekten der Römer vor deren Rückzug aus Britannien im Jahr 410.\n", + "Score: 0.870095\n" + ] + } + ], + "source": [ + "pretty_response(query(\"wall\", language=\"de\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the final example, the query is given in German, and only German results are requested." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "ID: 2270104#1\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: Die Mauer wurde Ende des zweiten oder Anfang des dritten Jahrhunderts erbaut, wahrscheinlich zwischen 190 und 225,\n", + "vermutlich zwischen 200 und 220. Sie entstand somit etwa achtzig Jahre nach dem im Jahr 120 erfolgten Bau der Festung,\n", + "deren nördliche und westliche Mauern verstärkt und in der Höhe verdoppelt wurden, um einen Teil der neuen Stadtmauer zu\n", + "bilden. Die Anlage wurde zumindest bis zum Ende des vierten Jahrhunderts weiter ausgebaut. Sie zählt zu den letzten\n", + "großen Bauprojekten der Römer vor deren Rückzug aus Britannien im Jahr 410.\n", + "Score: 0.88160384\n", + "\n", + "ID: 2270104#0\n", + "Language: de\n", + "Title: London Wall\n", + "Passage: London Wall ist die strategische Stadtmauer, die die Römer um Londinium gebaut haben, um die Stadt zu schützen, die über\n", + "den wichtigen Hafen an der Themse verfügte. Bis ins späte Mittelalter hinein bildete diese Stadtmauer die Grenzen von\n", + "London. Heute ist \"London Wall\" auch der Name einer Straße, die an einem noch bestehenden Abschnitt der Stadtmauer\n", + "verläuft.\n", + "Score: 0.876139\n" + ] + } + ], + "source": [ + "pretty_response(query(\"Mauer\", language=\"de\"))" + ] + } + ], + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.3" + }, + "vscode": { + "interpreter": { + "hash": "b0fa6594d8f4cbf19f97940f81e996739fb7646882a419484c72d19e05852a7e" + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/x-pack/plugins/search_notebooks/server/index.ts b/x-pack/plugins/search_notebooks/server/index.ts new file mode 100644 index 00000000000000..fa0b8596ee7f98 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/index.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from '@kbn/core/server'; + +export { config } from './config'; + +export async function plugin(context: PluginInitializerContext) { + const { SearchNotebooksPlugin } = await import('./plugin'); + return new SearchNotebooksPlugin(context); +} + +/** @public */ +export type { SearchNotebooksPluginSetup, SearchNotebooksPluginStart } from './types'; diff --git a/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.ts new file mode 100644 index 00000000000000..13e79c4ed34221 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.test.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 fs from 'fs/promises'; +import type { Logger } from '@kbn/logging'; + +// Mocking dependencies +jest.mock('fs/promises'); + +const mockLogger: Logger = { + warn: jest.fn(), + error: jest.fn(), +} as Partial as Logger; + +import { getNotebook, DEFAULT_NOTEBOOKS } from './notebook_catalog'; + +describe('getNotebook', () => { + const options = { logger: mockLogger }; + beforeEach(() => { + // Reset mocks and cache before each test + jest.clearAllMocks(); + }); + + it('throws an error if given an unknown notebook id', () => { + expect(getNotebook('some-fake-id', options)).rejects.toThrow('Unknown Notebook ID'); + expect(mockLogger.warn).toHaveBeenCalledTimes(1); + }); + + it('throws an error if the file is not found', () => { + const notebookId = DEFAULT_NOTEBOOKS.notebooks[0].id; + jest.mocked(fs.access).mockReset().mockRejectedValue(new Error('Boom')); + + expect(getNotebook(notebookId, options)).rejects.toThrow('Failed to fetch notebook.'); + }); + + it('Reads notebook', () => { + const notebookId = DEFAULT_NOTEBOOKS.notebooks[0].id; + + jest.mocked(fs.access).mockReset().mockResolvedValue(undefined); + + expect(getNotebook(notebookId, options)).resolves.toMatchObject({ + cells: expect.anything(), + metadata: expect.anything(), + }); + expect(mockLogger.warn).not.toHaveBeenCalled(); + expect(mockLogger.error).not.toHaveBeenCalled(); + expect(fs.access).toHaveBeenCalledWith(expect.stringContaining(`${notebookId}.json`), 0); + }); +}); diff --git a/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts new file mode 100644 index 00000000000000..9056404ee9760a --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/lib/notebook_catalog.ts @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 fs from 'fs/promises'; +import path from 'path'; +import { i18n } from '@kbn/i18n'; +import type { Logger } from '@kbn/logging'; + +import { NotebookCatalog, NotebookInformation, NotebookDefinition } from '../types'; + +const NOTEBOOKS_DATA_DIR = '../data'; + +export const DEFAULT_NOTEBOOKS: NotebookCatalog = { + notebooks: [ + { + id: '00_quick_start', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.quickStart.title', { + defaultMessage: 'Semantic search quick start', + }), + description: i18n.translate('xpack.searchNotebooks.notebooksCatalog.quickStart.description', { + defaultMessage: + "This interactive notebook will introduce you to some basic operations with Elasticsearch, using the official Elasticsearch Python client. You'll perform semantic search using Sentence Transformers for text embedding. Learn how to integrate traditional text-based search with semantic search, for a hybrid search system.", + }), + }, + { + id: '01_keyword_querying_filtering', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.keywordQueryFiltering.title', { + defaultMessage: 'Keyword querying and filtering', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.keywordQueryFiltering.description', + { + defaultMessage: + 'This interactive notebook will introduce you to the basic Elasticsearch queries, using the official Elasticsearch Python client. Before getting started on this section you should work through our quick start, as you will be using the same dataset.', + } + ), + }, + { + id: '02_hybrid_search', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.hybridSearch.title', { + defaultMessage: 'Hybrid Search using RRF', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.hybridSearch.description', + { + defaultMessage: + 'This interactive notebook will use the reciprocal rank fusion algorithm to combine the results of BM25 and kNN semantic search.', + } + ), + }, + { + id: '03_elser', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.elser.title', { + defaultMessage: 'Semantic Search using ELSER v2 text expansion', + }), + description: i18n.translate('xpack.searchNotebooks.notebooksCatalog.elser.description', { + defaultMessage: 'Learn how to use ELSER for text expansion-powered semantic search.', + }), + }, + { + id: '04_multilingual', + title: i18n.translate('xpack.searchNotebooks.notebooksCatalog.multilingual.title', { + defaultMessage: 'Multilingual semantic search', + }), + description: i18n.translate( + 'xpack.searchNotebooks.notebooksCatalog.multilingual.description', + { + defaultMessage: + "In this example we'll use a multilingual embedding model 'multilingual-e5-base' to perform search on a dataset of mixed language documents.", + } + ), + }, + ], +}; +export const NOTEBOOKS_MAP: Record = + DEFAULT_NOTEBOOKS.notebooks.reduce((nbMap, nb) => { + nbMap[nb.id] = nb; + return nbMap; + }, {} as Record); + +const NOTEBOOK_IDS = DEFAULT_NOTEBOOKS.notebooks.map(({ id }) => id); + +export const getNotebook = async ( + notebookId: string, + { logger }: { logger: Logger } +): Promise => { + // Only server pre-defined notebooks, since we're reading files from disk only allow IDs + // for the known notebooks so that we aren't attempting to read any file from disk given user input + if (!NOTEBOOK_IDS.includes(notebookId)) { + logger.warn(`Unknown search notebook requested ${notebookId}`); + throw new Error( + i18n.translate('xpack.searchNotebooks.notebooksCatalog.errors.unknownId', { + defaultMessage: 'Unknown Notebook ID', + }) + ); + } + + const notebookPath = path.join(__dirname, NOTEBOOKS_DATA_DIR, `${notebookId}.json`); + try { + await fs.access(notebookPath, fs.constants.F_OK); + const notebook = (await import(notebookPath)).default; + return notebook; + } catch (err) { + logger.error(`Error reading search notebook ${notebookId}`, err); + throw new Error( + i18n.translate('xpack.searchNotebooks.notebooksCatalog.errors.notebookImportFailure', { + defaultMessage: 'Failed to fetch notebook.', + }) + ); + } +}; diff --git a/x-pack/plugins/search_notebooks/server/plugin.ts b/x-pack/plugins/search_notebooks/server/plugin.ts new file mode 100644 index 00000000000000..247c62d5ec7c61 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/plugin.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { + PluginInitializerContext, + CoreSetup, + CoreStart, + Plugin, + Logger, +} from '@kbn/core/server'; + +import { SearchNotebooksPluginSetup, SearchNotebooksPluginStart } from './types'; +import { defineRoutes } from './routes'; +import { SearchNotebooksConfig } from './config'; + +export class SearchNotebooksPlugin + implements Plugin +{ + private readonly config: SearchNotebooksConfig; + private readonly logger: Logger; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + this.logger = initializerContext.logger.get(); + } + + public setup(core: CoreSetup) { + if (!this.config.enabled) return {}; + + this.logger.debug('searchNotebooks: Setup'); + const router = core.http.createRouter(); + + // Register server side APIs + defineRoutes(router, this.logger); + + return {}; + } + + public start(core: CoreStart) { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/search_notebooks/server/routes/index.ts b/x-pack/plugins/search_notebooks/server/routes/index.ts new file mode 100644 index 00000000000000..2509290c0e0618 --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/routes/index.ts @@ -0,0 +1,62 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; +import type { IRouter } from '@kbn/core/server'; +import type { Logger } from '@kbn/logging'; + +import { DEFAULT_NOTEBOOKS, NOTEBOOKS_MAP, getNotebook } from '../lib/notebook_catalog'; +import { NotebookDefinition } from '../types'; + +export function defineRoutes(router: IRouter, logger: Logger) { + router.get( + { + path: '/internal/search_notebooks/notebooks', + validate: {}, + }, + async (_context, _request, response) => { + return response.ok({ + body: DEFAULT_NOTEBOOKS, + headers: { 'content-type': 'application/json' }, + }); + } + ); + + router.get( + { + path: '/internal/search_notebooks/notebooks/{notebookId}', + validate: { + params: schema.object({ + notebookId: schema.string(), + }), + }, + }, + async (context, request, response) => { + const notebookId = request.params.notebookId; + + if (!NOTEBOOKS_MAP.hasOwnProperty(notebookId)) { + logger.warn(`Unknown search notebook requested ${notebookId}`); + return response.notFound(); + } + + const notebookMetadata = NOTEBOOKS_MAP[notebookId]; + let notebook: NotebookDefinition; + try { + notebook = await getNotebook(notebookId, { logger }); + } catch (e) { + return response.customError(e.message); + } + return response.ok({ + body: { + ...notebookMetadata, + notebook, + }, + headers: { 'content-type': 'application/json' }, + }); + } + ); +} diff --git a/x-pack/plugins/search_notebooks/server/types.ts b/x-pack/plugins/search_notebooks/server/types.ts new file mode 100644 index 00000000000000..506eb9126f940a --- /dev/null +++ b/x-pack/plugins/search_notebooks/server/types.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. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchNotebooksPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface SearchNotebooksPluginStart {} + +export interface NotebookInformation { + id: string; + title: string; + description: string; +} +export interface NotebookCatalog { + notebooks: NotebookInformation[]; +} + +export interface Notebook extends NotebookInformation { + link?: { + title: string; + url: string; + }; + notebook: NotebookDefinition; +} + +export interface NotebookDefinition { + cells: NotebookCellType[]; + metadata?: NotebookMetadataType; + nbformat?: number; + nbformat_minor?: number; +} + +export interface NotebookMetadataType { + kernelspec?: { + display_name?: string; + language?: string; + name?: string; + }; + language_info?: { + mimetype?: string; + name?: string; + version?: string; + }; +} + +export interface NotebookCellType { + auto_number?: number; + cell_type?: string; + execution_count?: number | null; + id?: string; + inputs?: string[]; + metadata?: { + id?: string; + }; + outputs?: NotebookOutputType[]; + prompt_number?: number; + source?: string[]; +} + +export interface NotebookOutputType { + name?: string; + ename?: string; + evalue?: string; + traceback?: string[]; + data?: { + 'text/plain'?: string[]; + 'text/html'?: string[]; + 'text/latex'?: string[]; + 'image/png'?: string; + 'image/jpeg'?: string; + 'image/gif'?: string; + 'image/svg+xml'?: string; + 'application/javascript'?: string[]; + }; + output_type?: string; + png?: string; + jpeg?: string; + gif?: string; + svg?: string; + text?: string[]; + execution_count?: number; + metadata?: { + scrolled?: boolean; + }; +} diff --git a/x-pack/plugins/search_notebooks/tsconfig.json b/x-pack/plugins/search_notebooks/tsconfig.json new file mode 100644 index 00000000000000..17fad2e1a53989 --- /dev/null +++ b/x-pack/plugins/search_notebooks/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/config-schema", + "@kbn/core", + "@kbn/i18n", + "@kbn/logging", + ] +} diff --git a/x-pack/plugins/search_playground/server/utils/prompt.ts b/x-pack/plugins/search_playground/common/prompt.ts similarity index 100% rename from x-pack/plugins/search_playground/server/utils/prompt.ts rename to x-pack/plugins/search_playground/common/prompt.ts diff --git a/x-pack/plugins/search_playground/common/routes.ts b/x-pack/plugins/search_playground/common/routes.ts new file mode 100644 index 00000000000000..68e1dffeec4f0b --- /dev/null +++ b/x-pack/plugins/search_playground/common/routes.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 MANAGEMENT_API_KEYS = '/app/management/security/api_keys'; diff --git a/x-pack/plugins/search_playground/kibana.jsonc b/x-pack/plugins/search_playground/kibana.jsonc index 61f4cd97c1507e..3f4837613fc9b2 100644 --- a/x-pack/plugins/search_playground/kibana.jsonc +++ b/x-pack/plugins/search_playground/kibana.jsonc @@ -14,6 +14,9 @@ "navigation", "security" ], + "optionalPlugins": [ + "cloud" + ], "requiredBundles": [ "kibanaReact" ] diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_lang_client.test.tsx.snap b/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_lang_client.test.tsx.snap new file mode 100644 index 00000000000000..25d1f6cce4b610 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_lang_client.test.tsx.snap @@ -0,0 +1,88 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PY_LANG_CLIENT function renders with correct content 1`] = ` +"## Install the required packages +## pip install -qU elasticsearch openai + +import os +from elasticsearch import Elasticsearch +from openai import OpenAI + + +es_client = Elasticsearch( + http://my-local-cloud-instance, + api_key=os.environ[\\"ES_API_KEY\\"] +) + + +openai_client = OpenAI( + api_key=os.environ[\\"OPENAI_API_KEY\\"], +) + +def get_elasticsearch_results(query): + es_query = {} + + result = es.search(index=\\"index1,index2\\", query=es_query, size=10) + return result[\\"hits\\"][\\"hits\\"] + +def create_openai_prompt(question, results): + + context = \\"\\" + index_source_fields = { + \\"index1\\": [ + \\"field1\\" + ], + \\"index2\\": [ + \\"field2\\" + ] +} + for hit in results: + source_field = index_source_fields.get(hit[\\"_index\\"])[0] + hit_context = hit[\\"_source\\"][source_field] + context += f\\"{hit_context} +\\" + + prompt = f\\"\\"\\" + Instructions: + + - Your prompt + - Answer questions truthfully and factually using only the information presented. + - If you don't know the answer, just say that you don't know, don't make up an answer! + - You must always cite the document where the answer was extracted using inline academic citation style [], using the position. + - Use markdown format for code examples. + - You are correct, factual, precise, and reliable. + + + Context: + {context} + + Question: {question} + Answer: + \\"\\"\\" + + return prompt + +def generate_openai_completion(user_prompt): + response = openai_client.chat.completions.create( + model=\\"Your-new-model\\", + messages=[ + {\\"role\\": \\"system\\", \\"content\\": \\"You are an assistant for question-answering tasks.\\"}, + {\\"role\\": \\"user\\", \\"content\\": user_prompt}, + ] + ) + + return response.choices[0].message.content + +if __name__ == \\"__main__\\": + question = \\"my question\\" + + elasticsearch_results = get_elasticsearch_results(question) + + context_prompt = create_openai_prompt(question, elasticsearch_results) + + openai_completion = generate_openai_completion(context_prompt) + + print(openai_completion) + +" +`; diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_langchain_python.test.tsx.snap b/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_langchain_python.test.tsx.snap new file mode 100644 index 00000000000000..7474cbe8b64d4d --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/__snapshots__/py_langchain_python.test.tsx.snap @@ -0,0 +1,75 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`PY_LANGCHAIN function renders with correct content 1`] = ` +"## Install the required packages +## pip install -qU elasticsearch langchain langchain-elasticsearch langchain-openai + +from langchain_elasticsearch import ElasticsearchRetriever +from langchain_openai import ChatOpenAI +from langchain_core.runnables import RunnablePassthrough +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import format_document +from langchain.prompts.prompt import PromptTemplate +import os + + +es_client = Elasticsearch( + http://my-local-cloud-instance, + api_key=os.environ[\\"ES_API_KEY\\"] +) + + +def build_query(query): + return { + \\"query\\": {} +} + +retriever = ElasticsearchRetriever( + index_name=\\"{formValues.indices.join(',')}\\", + body_func=build_query, + content_field=\\"text\\", + es_client=es_client +) + +model = ChatOpenAI(openai_api_key=os.environ[\\"OPENAI_API_KEY\\"], model_name=\\"Your-new-model\\") + + +ANSWER_PROMPT = ChatPromptTemplate.from_template( + f\\"\\"\\" + Instructions: + + - Your prompt + - Answer questions truthfully and factually using only the information presented. + - If you don't know the answer, just say that you don't know, don't make up an answer! + - You must always cite the document where the answer was extracted using inline academic citation style [], using the position. + - Use markdown format for code examples. + - You are correct, factual, precise, and reliable. + + + Context: + {context} + + Question: {question} + Answer: + \\"\\"\\" +) + +DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template=\\"{page_content}\\") + +def _combine_documents( + docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator=\\"\\\\n\\\\n\\" +): + doc_strings = [format_document(doc, document_prompt) for doc in docs] + return document_separator.join(doc_strings) + +_context = { + \\"context\\": retriever | _combine_documents, + \\"question\\": RunnablePassthrough(), +} + +chain = _context | ANSWER_PROMPT | model | StrOutputParser() +ans = chain.invoke(\\"what is the nasa sales team?\\") +print(\\"---- Answer ----\\") +print(ans)" +`; diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.test.tsx b/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.test.tsx new file mode 100644 index 00000000000000..13f666a78f14dc --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.test.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 { render } from '@testing-library/react'; +import { PY_LANG_CLIENT } from './py_lang_client'; // Adjust the import path according to your project structure +import { ES_CLIENT_DETAILS } from '../view_code_flyout'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; +import { ChatForm } from '../../../types'; + +describe('PY_LANG_CLIENT function', () => { + test('renders with correct content', () => { + // Mocking necessary values for your function + const formValues = { + elasticsearch_query: { query: {} }, + indices: ['index1', 'index2'], + docSize: 10, + source_fields: { index1: ['field1'], index2: ['field2'] }, + prompt: 'Your prompt', + citations: true, + summarization_model: 'Your-new-model', + } as unknown as ChatForm; + + const clientDetails = ES_CLIENT_DETAILS({ + elasticsearchUrl: 'http://my-local-cloud-instance', + } as unknown as CloudSetup); + + const { container } = render(PY_LANG_CLIENT(formValues, clientDetails)); + + expect(container.firstChild?.textContent).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.tsx b/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.tsx new file mode 100644 index 00000000000000..bb4543b7b8f0c5 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/py_lang_client.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCodeBlock } from '@elastic/eui'; +import React from 'react'; +import { ChatForm } from '../../../types'; +import { Prompt } from '../../../../common/prompt'; + +const getESQuery = (query: any) => { + try { + return JSON.stringify(query, null, 2).replace('"${query}"', 'f"${query}"'); + } catch (e) { + // eslint-disable-next-line no-console + console.error('Error parsing ES query', e); + return '{}'; + } +}; + +export const PY_LANG_CLIENT = (formValues: ChatForm, clientDetails: string) => ( + + {`## Install the required packages +## pip install -qU elasticsearch openai + +import os +from elasticsearch import Elasticsearch +from openai import OpenAI + +${clientDetails} + +openai_client = OpenAI( + api_key=os.environ["OPENAI_API_KEY"], +) + +def get_elasticsearch_results(query): + es_query = ${getESQuery(formValues.elasticsearch_query.query)} + + result = es.search(index="${formValues.indices.join(',')}", query=es_query, size=${ + formValues.docSize + }) + return result["hits"]["hits"] + +def create_openai_prompt(question, results): + + context = "" + index_source_fields = ${JSON.stringify(formValues.source_fields, null, 2)} + for hit in results: + source_field = index_source_fields.get(hit["_index"])[0] + hit_context = hit["_source"][source_field] + context += f"{hit_context}\n" + + prompt = f"""${Prompt(formValues.prompt, { + context: true, + citations: formValues.citations, + type: 'openai', + })}""" + + return prompt + +def generate_openai_completion(user_prompt): + response = openai_client.chat.completions.create( + model="${formValues.summarization_model}", + messages=[ + {"role": "system", "content": "You are an assistant for question-answering tasks."}, + {"role": "user", "content": user_prompt}, + ] + ) + + return response.choices[0].message.content + +if __name__ == "__main__": + question = "my question" + + elasticsearch_results = get_elasticsearch_results(question) + + context_prompt = create_openai_prompt(question, elasticsearch_results) + + openai_completion = generate_openai_completion(context_prompt) + + print(openai_completion) + +`} + +); diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.test.tsx b/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.test.tsx new file mode 100644 index 00000000000000..b9ab32eddb7208 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.test.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 { render } from '@testing-library/react'; +import { ES_CLIENT_DETAILS } from '../view_code_flyout'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; +import { ChatForm } from '../../../types'; +import { LANGCHAIN_PYTHON } from './py_langchain_python'; + +describe('PY_LANGCHAIN function', () => { + test('renders with correct content', () => { + // Mocking necessary values for your function + const formValues = { + elasticsearch_query: { query: {} }, + indices: ['index1', 'index2'], + docSize: 10, + source_fields: { index1: ['field1'], index2: ['field2'] }, + prompt: 'Your prompt', + citations: true, + summarization_model: 'Your-new-model', + } as unknown as ChatForm; + + const clientDetails = ES_CLIENT_DETAILS({ + elasticsearchUrl: 'http://my-local-cloud-instance', + } as unknown as CloudSetup); + + const { container } = render(LANGCHAIN_PYTHON(formValues, clientDetails)); + + expect(container.firstChild?.textContent).toMatchSnapshot(); + }); +}); diff --git a/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.tsx b/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.tsx new file mode 100644 index 00000000000000..cd02395c9c1658 --- /dev/null +++ b/x-pack/plugins/search_playground/public/components/view_code/examples/py_langchain_python.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiCodeBlock } from '@elastic/eui'; +import React from 'react'; +import { ChatForm } from '../../../types'; +import { Prompt } from '../../../../common/prompt'; + +const getESQuery = (query: any) => { + try { + return JSON.stringify(query, null, 2).replace('"${query}"', 'f"${query}"'); + } catch (e) { + // eslint-disable-next-line no-console + console.error('Error parsing ES query', e); + return '{}'; + } +}; + +export const LANGCHAIN_PYTHON = (formValues: ChatForm, clientDetails: string) => ( + + {`## Install the required packages +## pip install -qU elasticsearch langchain langchain-elasticsearch langchain-openai + +from langchain_elasticsearch import ElasticsearchRetriever +from langchain_openai import ChatOpenAI +from langchain_core.runnables import RunnablePassthrough +from langchain_core.prompts import ChatPromptTemplate +from langchain_core.output_parsers import StrOutputParser +from langchain_core.prompts import format_document +from langchain.prompts.prompt import PromptTemplate +import os + +${clientDetails} + +def build_query(query): + return ${getESQuery(formValues.elasticsearch_query)} + +retriever = ElasticsearchRetriever( + index_name="{formValues.indices.join(',')}", + body_func=build_query, + content_field="text", + es_client=es_client +) + +model = ChatOpenAI(openai_api_key=os.environ["OPENAI_API_KEY"], model_name="${ + formValues.summarization_model + }") + + +ANSWER_PROMPT = ChatPromptTemplate.from_template( + f"""${Prompt(formValues.prompt, { + context: true, + citations: formValues.citations, + type: 'openai', + })}""" +) + +DEFAULT_DOCUMENT_PROMPT = PromptTemplate.from_template(template="{page_content}") + +def _combine_documents( + docs, document_prompt=DEFAULT_DOCUMENT_PROMPT, document_separator="\\n\\n" +): + doc_strings = [format_document(doc, document_prompt) for doc in docs] + return document_separator.join(doc_strings) + +_context = { + "context": retriever | _combine_documents, + "question": RunnablePassthrough(), +} + +chain = _context | ANSWER_PROMPT | model | StrOutputParser() +ans = chain.invoke("what is the nasa sales team?") +print("---- Answer ----") +print(ans)`} + +); diff --git a/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx b/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx index d11e89ee6fc9fe..a914da997d2766 100644 --- a/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx +++ b/x-pack/plugins/search_playground/public/components/view_code/view_code_flyout.tsx @@ -6,69 +6,62 @@ */ import { - EuiFormLabel, - EuiCodeBlock, EuiFlyout, EuiFlyoutBody, EuiFlyoutHeader, EuiSpacer, - EuiSteps, - EuiText, EuiTitle, + EuiFlexGroup, + EuiFlexItem, + EuiSelect, + EuiText, + EuiButtonEmpty, } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import React, { useMemo } from 'react'; -import { CreateApiKeyForm } from './create_api_key_form'; +import React, { useState } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; +import { ChatForm } from '../../types'; +import { useKibana } from '../../hooks/use_kibana'; +import { MANAGEMENT_API_KEYS } from '../../../common/routes'; +import { LANGCHAIN_PYTHON } from './examples/py_langchain_python'; +import { PY_LANG_CLIENT } from './examples/py_lang_client'; interface ViewCodeFlyoutProps { onClose: () => void; } +export const ES_CLIENT_DETAILS = (cloud: CloudSetup | undefined) => { + if (cloud) { + return ` +es_client = Elasticsearch( + ${cloud.elasticsearchUrl}, + api_key=os.environ["ES_API_KEY"] +) + `; + } + + return ` +es_client = Elasticsearch( + "" +) + `; +}; + export const ViewCodeFlyout: React.FC = ({ onClose }) => { - const steps = useMemo( - () => [ - { - title: i18n.translate('xpack.searchPlayground.viewCode.flyout.step.apiKeyTitle', { - defaultMessage: 'Generate and copy an API key', - }), - children: ( - <> - -

- -

-
- - - - ), - }, - { - title: i18n.translate('xpack.searchPlayground.viewCode.flyout.step.createApplication', { - defaultMessage: 'Create application', - }), - children: ( - <> - - - - - - npm install - - - ), - }, - ], - [] - ); + const [selectedLanguage, setSelectedLanguage] = useState('py-es-client'); + const { getValues } = useFormContext(); + const formValues = getValues(); + const { + services: { cloud, http }, + } = useKibana(); + + const CLIENT_STEP = ES_CLIENT_DETAILS(cloud); + + const steps: Record = { + 'lc-py': LANGCHAIN_PYTHON(formValues, CLIENT_STEP), + 'py-es-client': PY_LANG_CLIENT(formValues, CLIENT_STEP), + }; return ( @@ -77,7 +70,7 @@ export const ViewCodeFlyout: React.FC = ({ onClose }) => {

@@ -86,13 +79,42 @@ export const ViewCodeFlyout: React.FC = ({ onClose }) => {

- + + + + + setSelectedLanguage(e.target.value)} + value={selectedLanguage} + /> + + + + + + + + + {steps[selectedLanguage]} + ); diff --git a/x-pack/plugins/search_playground/public/types.ts b/x-pack/plugins/search_playground/public/types.ts index 8536b9a19a9562..86c6c78ebaa643 100644 --- a/x-pack/plugins/search_playground/public/types.ts +++ b/x-pack/plugins/search_playground/public/types.ts @@ -17,6 +17,7 @@ import { SecurityPluginStart } from '@kbn/security-plugin/public'; import { HttpStart } from '@kbn/core-http-browser'; import React from 'react'; import { SharePluginStart } from '@kbn/share-plugin/public'; +import { CloudSetup } from '@kbn/cloud-plugin/public'; import type { App } from './components/app'; import type { PlaygroundProvider as PlaygroundProviderComponent } from './providers/playground_provider'; import type { Toolbar } from './components/toolbar'; @@ -39,6 +40,7 @@ export interface AppServicesContext { http: HttpStart; security: SecurityPluginStart; share: SharePluginStart; + cloud?: CloudSetup; } export enum ChatFormFields { @@ -60,7 +62,7 @@ export interface ChatForm { [ChatFormFields.openAIKey]: string; [ChatFormFields.indices]: string[]; [ChatFormFields.summarizationModel]: string; - [ChatFormFields.elasticsearchQuery]: QueryDslQueryContainer; + [ChatFormFields.elasticsearchQuery]: { query: QueryDslQueryContainer }; [ChatFormFields.sourceFields]: string[]; [ChatFormFields.docSize]: number; } diff --git a/x-pack/plugins/search_playground/server/routes.ts b/x-pack/plugins/search_playground/server/routes.ts index 15f514b4fd0e74..fe2631065c281c 100644 --- a/x-pack/plugins/search_playground/server/routes.ts +++ b/x-pack/plugins/search_playground/server/routes.ts @@ -13,7 +13,7 @@ import { IRouter } from '@kbn/core/server'; import { fetchFields } from './utils/fetch_query_source_fields'; import { AssistClientOptionsWithClient, createAssist as Assist } from './utils/assist'; import { ConversationalChain } from './utils/conversational_chain'; -import { Prompt } from './utils/prompt'; +import { Prompt } from '../common/prompt'; import { errorHandler } from './utils/error_handler'; import { APIRoutes } from './types'; diff --git a/x-pack/plugins/search_playground/tsconfig.json b/x-pack/plugins/search_playground/tsconfig.json index 4373613fc2d7b8..63f366614ffb59 100644 --- a/x-pack/plugins/search_playground/tsconfig.json +++ b/x-pack/plugins/search_playground/tsconfig.json @@ -26,7 +26,8 @@ "@kbn/shared-ux-page-kibana-template", "@kbn/navigation-plugin", "@kbn/core-http-server", - "@kbn/share-plugin" + "@kbn/share-plugin", + "@kbn/cloud-plugin" ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/security/common/model/authenticated_user.mock.ts b/x-pack/plugins/security/common/model/authenticated_user.mock.ts index 6f691579b073b8..dbf5d136d1935a 100644 --- a/x-pack/plugins/security/common/model/authenticated_user.mock.ts +++ b/x-pack/plugins/security/common/model/authenticated_user.mock.ts @@ -5,27 +5,7 @@ * 2.0. */ -import type { AuthenticatedUser } from '@kbn/security-plugin-types-common'; - -// We omit `roles` here since the original interface defines this field as `readonly string[]` that makes it hard to use -// in various mocks that expect mutable string array. -export type MockAuthenticatedUserProps = Partial< - Omit & { roles: string[] } ->; -export function mockAuthenticatedUser(user: MockAuthenticatedUserProps = {}) { - return { - username: 'user', - email: 'email', - full_name: 'full name', - roles: ['user-role'], - enabled: true, - authentication_realm: { name: 'native1', type: 'native' }, - lookup_realm: { name: 'native1', type: 'native' }, - authentication_provider: { type: 'basic', name: 'basic1' }, - authentication_type: 'realm', - elastic_cloud_user: false, - profile_uid: 'uid', - metadata: { _reserved: false }, - ...user, - }; -} +export { + mockAuthenticatedUser, + type MockAuthenticatedUserProps, +} from '@kbn/core-security-common/mocks'; diff --git a/x-pack/plugins/security/public/account_management/account_management_app.tsx b/x-pack/plugins/security/public/account_management/account_management_app.tsx index d7bb63e5a8ce7a..e7a41e49f3cb5a 100644 --- a/x-pack/plugins/security/public/account_management/account_management_app.tsx +++ b/x-pack/plugins/security/public/account_management/account_management_app.tsx @@ -9,22 +9,18 @@ import type { History } from 'history'; import type { FunctionComponent } from 'react'; import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; -import type { Observable } from 'rxjs'; import type { ApplicationSetup, AppMountParameters, CoreStart, - CoreTheme, StartServicesAccessor, } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { I18nProvider } from '@kbn/i18n-react'; -import { - KibanaContextProvider, - KibanaThemeProvider, - toMountPoint, -} from '@kbn/kibana-react-plugin/public'; +import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; +import { toMountPoint } from '@kbn/react-kibana-mount'; import type { AuthenticationServiceSetup } from '@kbn/security-plugin-types-public'; import { Router } from '@kbn/shared-ux-router'; import { UserProfilesKibanaProvider } from '@kbn/user-profile-components'; @@ -51,7 +47,7 @@ export const accountManagementApp = Object.freeze({ }), visibleIn: [], appRoute: '/security/account', - async mount({ element, theme$, history }: AppMountParameters) { + async mount({ element, history }: AppMountParameters) { const [[coreStart], { AccountManagementPage }] = await Promise.all([ getStartServices(), import('./account_management_page'), @@ -60,7 +56,6 @@ export const accountManagementApp = Object.freeze({ render( ; history: History; authc: AuthenticationServiceSetup; securityApiClients: SecurityApiClients; @@ -87,7 +81,6 @@ export interface ProvidersProps { export const Providers: FunctionComponent = ({ services, - theme$, history, authc, securityApiClients, @@ -98,7 +91,7 @@ export const Providers: FunctionComponent = ({ - + ', () => { }, }, }; - const theme$ = themeServiceMock.createTheme$(); let history = scopedHistoryMock.create(); const authc = securityMock.createSetup().authc; @@ -55,7 +54,6 @@ describe('', () => { const { findByRole } = render( ( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( { const testWrapper = mount( + this.getAuthentication().getCurrentUser(request); + this.auditSetup = this.auditService.setup({ license, config: config.audit, @@ -268,7 +271,7 @@ export class SecurityPlugin http: core.http, getSpaceId: (request) => spaces?.spacesService.getSpaceId(request), getSID: (request) => this.getSession().getSID(request), - getCurrentUser: (request) => this.getAuthentication().getCurrentUser(request), + getCurrentUser, recordAuditLoggingUsage: () => this.getFeatureUsageService().recordAuditLoggingUsage(), }); @@ -285,7 +288,7 @@ export class SecurityPlugin packageVersion: this.initializerContext.env.packageInfo.version, getSpacesService: () => spaces?.spacesService, features, - getCurrentUser: (request) => this.getAuthentication().getCurrentUser(request), + getCurrentUser, customBranding: core.customBranding, }); @@ -295,12 +298,14 @@ export class SecurityPlugin spaces, audit: this.auditSetup, authz: this.authorizationSetup, + getCurrentUser, }); setupSavedObjects({ audit: this.auditSetup, authz: this.authorizationSetup, savedObjects: core.savedObjects, + getCurrentUser, }); this.registerDeprecations(core, license); diff --git a/x-pack/plugins/security/server/saved_objects/index.ts b/x-pack/plugins/security/server/saved_objects/index.ts index 3fa610485a2889..d3ba37b8a439b3 100644 --- a/x-pack/plugins/security/server/saved_objects/index.ts +++ b/x-pack/plugins/security/server/saved_objects/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CoreSetup } from '@kbn/core/server'; +import type { AuthenticatedUser, CoreSetup, KibanaRequest } from '@kbn/core/server'; import { SavedObjectsClient } from '@kbn/core/server'; import type { AuditServiceSetup } from '@kbn/security-plugin-types-server'; @@ -19,9 +19,15 @@ interface SetupSavedObjectsParams { 'mode' | 'actions' | 'checkSavedObjectsPrivilegesWithRequest' >; savedObjects: CoreSetup['savedObjects']; + getCurrentUser: (request: KibanaRequest) => AuthenticatedUser | null; } -export function setupSavedObjects({ audit, authz, savedObjects }: SetupSavedObjectsParams) { +export function setupSavedObjects({ + audit, + authz, + savedObjects, + getCurrentUser, +}: SetupSavedObjectsParams) { savedObjects.setClientFactoryProvider( // This is not used by Kibana itself, but it can be leveraged for Kibana to use a third-party authentication header if there is a custom // authentication layer sitting between Kibana and Elasticsearch, and if Elasticsearch security is disabled. It's unclear if it's even @@ -43,6 +49,7 @@ export function setupSavedObjects({ audit, authz, savedObjects }: SetupSavedObje auditLogger: audit.asScoped(request), checkPrivileges: authz.checkSavedObjectsPrivilegesWithRequest(request), errors: SavedObjectsClient.errors, + getCurrentUser: () => getCurrentUser(request), }) : undefined; }); diff --git a/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.test.ts b/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.test.ts index 42fd2f8eb0d92a..886a34913290bd 100644 --- a/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.test.ts +++ b/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.test.ts @@ -50,6 +50,7 @@ const addAuditEventSpy = jest.spyOn( SavedObjectsSecurityExtension.prototype as any, 'addAuditEvent' ); +const getCurrentUser = jest.fn(); const obj1 = { type: 'a', @@ -113,6 +114,7 @@ function setup() { auditLogger, errors, checkPrivileges, + getCurrentUser, }); return { actions, auditLogger, errors, checkPrivileges, securityExtension }; } diff --git a/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.ts b/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.ts index e258a4c20aa2b8..99f8aab86b7859 100644 --- a/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.ts +++ b/x-pack/plugins/security/server/saved_objects/saved_objects_security_extension.ts @@ -43,6 +43,7 @@ import type { } from '@kbn/core-saved-objects-server'; import type { AuthorizeObject } from '@kbn/core-saved-objects-server/src/extensions/security'; import { ALL_NAMESPACES_STRING, SavedObjectsUtils } from '@kbn/core-saved-objects-utils-server'; +import type { AuthenticatedUser } from '@kbn/security-plugin-types-common'; import type { Actions, AuditLogger, @@ -59,6 +60,7 @@ interface Params { auditLogger: AuditLogger; errors: SavedObjectsClient['errors']; checkPrivileges: CheckSavedObjectsPrivileges; + getCurrentUser: () => AuthenticatedUser | null; } /** @@ -293,16 +295,18 @@ export class SavedObjectsSecurityExtension implements ISavedObjectsSecurityExten private readonly auditLogger: AuditLogger; private readonly errors: SavedObjectsClient['errors']; private readonly checkPrivilegesFunc: CheckSavedObjectsPrivileges; + private readonly getCurrentUserFunc: () => AuthenticatedUser | null; private readonly actionMap: Map< SecurityAction, { authzAction?: string; auditAction?: AuditAction } >; - constructor({ actions, auditLogger, errors, checkPrivileges }: Params) { + constructor({ actions, auditLogger, errors, checkPrivileges, getCurrentUser }: Params) { this.actions = actions; this.auditLogger = auditLogger; this.errors = errors; this.checkPrivilegesFunc = checkPrivileges; + this.getCurrentUserFunc = getCurrentUser; // This comment block is a quick reference for the action map, which maps authorization actions // and audit actions to a "security action" as used by the authorization methods. @@ -1379,6 +1383,10 @@ export class SavedObjectsSecurityExtension implements ISavedObjectsSecurityExten }); }); } + + getCurrentUser() { + return this.getCurrentUserFunc(); + } } /** diff --git a/x-pack/plugins/security/server/spaces/setup_spaces_client.test.ts b/x-pack/plugins/security/server/spaces/setup_spaces_client.test.ts index ba3779af2dde07..cb74f587153b85 100644 --- a/x-pack/plugins/security/server/spaces/setup_spaces_client.test.ts +++ b/x-pack/plugins/security/server/spaces/setup_spaces_client.test.ts @@ -12,12 +12,14 @@ import { setupSpacesClient } from './setup_spaces_client'; import { auditServiceMock } from '../audit/mocks'; import { authorizationMock } from '../authorization/index.mock'; +const getCurrentUser = jest.fn(); + describe('setupSpacesClient', () => { it('does not setup the spaces client when spaces is disabled', () => { const authz = authorizationMock.create(); const audit = auditServiceMock.create(); - setupSpacesClient({ authz, audit }); + setupSpacesClient({ authz, audit, getCurrentUser }); }); it('configures the repository factory, wrapper, and audit logger', () => { @@ -25,7 +27,7 @@ describe('setupSpacesClient', () => { const audit = auditServiceMock.create(); const spaces = spacesMock.createSetup(); - setupSpacesClient({ authz, audit, spaces }); + setupSpacesClient({ authz, audit, spaces, getCurrentUser }); expect(spaces.spacesClient.registerClientWrapper).toHaveBeenCalledTimes(1); expect(spaces.spacesClient.setClientRepositoryFactory).toHaveBeenCalledTimes(1); @@ -38,7 +40,7 @@ describe('setupSpacesClient', () => { const { savedObjects } = coreMock.createStart(); - setupSpacesClient({ authz, audit, spaces }); + setupSpacesClient({ authz, audit, spaces, getCurrentUser }); expect(spaces.spacesClient.setClientRepositoryFactory).toHaveBeenCalledTimes(1); const [repositoryFactory] = spaces.spacesClient.setClientRepositoryFactory.mock.calls[0]; @@ -60,7 +62,7 @@ describe('setupSpacesClient', () => { const { savedObjects } = coreMock.createStart(); - setupSpacesClient({ authz, audit, spaces }); + setupSpacesClient({ authz, audit, spaces, getCurrentUser }); expect(spaces.spacesClient.setClientRepositoryFactory).toHaveBeenCalledTimes(1); const [repositoryFactory] = spaces.spacesClient.setClientRepositoryFactory.mock.calls[0]; @@ -80,7 +82,7 @@ describe('setupSpacesClient', () => { const audit = auditServiceMock.create(); const spaces = spacesMock.createSetup(); - setupSpacesClient({ authz, audit, spaces }); + setupSpacesClient({ authz, audit, spaces, getCurrentUser }); expect(spaces.spacesClient.registerClientWrapper).toHaveBeenCalledTimes(1); const [wrapper] = spaces.spacesClient.registerClientWrapper.mock.calls[0]; diff --git a/x-pack/plugins/security/server/spaces/setup_spaces_client.ts b/x-pack/plugins/security/server/spaces/setup_spaces_client.ts index 6ca68a395fbc7d..0f4c8be3a39729 100644 --- a/x-pack/plugins/security/server/spaces/setup_spaces_client.ts +++ b/x-pack/plugins/security/server/spaces/setup_spaces_client.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { SavedObjectsClient } from '@kbn/core/server'; +import { type AuthenticatedUser, type KibanaRequest, SavedObjectsClient } from '@kbn/core/server'; import type { AuditServiceSetup, AuthorizationServiceSetup, @@ -19,9 +19,10 @@ interface Deps { audit: AuditServiceSetup; authz: AuthorizationServiceSetup; spaces?: SpacesPluginSetup; + getCurrentUser: (request: KibanaRequest) => AuthenticatedUser | null; } -export const setupSpacesClient = ({ audit, authz, spaces }: Deps) => { +export const setupSpacesClient = ({ audit, authz, spaces, getCurrentUser }: Deps) => { if (!spaces) { return; } @@ -41,6 +42,7 @@ export const setupSpacesClient = ({ audit, authz, spaces }: Deps) => { auditLogger: audit.asScoped(request), checkPrivileges: authz.checkSavedObjectsPrivilegesWithRequest(request), errors: SavedObjectsClient.errors, + getCurrentUser: () => getCurrentUser(request), }) : undefined; return new SecureSpacesClientWrapper( diff --git a/x-pack/plugins/security/tsconfig.json b/x-pack/plugins/security/tsconfig.json index 46f4e3f51d9739..c73ecb5bd3146d 100644 --- a/x-pack/plugins/security/tsconfig.json +++ b/x-pack/plugins/security/tsconfig.json @@ -76,6 +76,9 @@ "@kbn/core-security-browser", "@kbn/core-security-server", "@kbn/core-http-router-server-internal", + "@kbn/react-kibana-mount", + "@kbn/react-kibana-context-theme", + "@kbn/core-security-common", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md new file mode 100644 index 00000000000000..97f7be2b8cd69a --- /dev/null +++ b/x-pack/plugins/security_solution/docs/rfcs/detection_response/prebuilt_rules_customization.md @@ -0,0 +1,2799 @@ +# RFC: Prebuilt Rules Customization + +_Status_: Completed, feedback addressed. Awaiting further feedback, or closing off. + +Covers: + +- rule schema changes +- mappings +- migration strategy and technical implementation +- exporting and importing rules +- schema-related changes needed in endpoints +- calculation of `isCustomized` field on endpoints that update/patch rules. +- additional changes needed to `/upgrade/_review` and `/upgrade/_perform` endpoints +- UI Changes + +## Table of Contents + +The following TOC was created using the [Pandoc](https://pandoc.org/installing.html) tool. + +You can create it by navigating to the directory of the markdown file and running the command below and pasting the generated table from the output document into the current one: + +``` +pandoc prebuilt_rules_customization_rfc.md --toc --toc-depth=6 --wrap=none -s -o output.md +``` + +- [Table of Contents](#table-of-contents) +- [Note about scope of RFC](#note-about-scope-of-rfc) +- [Necessary rule schema changes](#necessary-rule-schema-changes) + - [`rule_source` field](#rule_source-field) + - [`immutable` field](#immutable-field) + - [Changes needed in rule schema](#changes-needed-in-rule-schema) + - [API request and response rule schema](#api-request-and-response-rule-schema) + - [Rule Import request schema](#rule-import-request-schema) + - [Internal rule schema](#internal-rule-schema) + - [Prebuilt Rule asset schema](#prebuilt-rule-asset-schema) + - [Deprecating the `immutable` field](#deprecating-the-immutable-field) +- [Mapping changes](#mapping-changes) +- [Plan for carrying out migrations of rule SOs](#plan-for-carrying-out-migrations-of-rule-sos) + - [Context](#context) + - [Problem with tightly coupled logic in our endpoints](#problem-with-tightly-coupled-logic-in-our-endpoints) + - [Migration strategy](#migration-strategy) + - [Normalization on read](#normalization-on-read) + - [Migration on write](#migration-on-write) + - [Technical implementation of migration-on-write](#technical-implementation-of-migration-on-write) + - [Updating and upgrading rules](#updating-and-upgrading-rules) + - [Bulk editing rules](#bulk-editing-rules) +- [Endpoints and utilities that will need to be adapted to the new schema](#endpoints-and-utilities-that-will-need-to-be-adapted-to-the-new-schema) + - [Utilities](#utilities) + - [KQL filters and the `convertRulesFilterToKQL` method](#kql-filters-and-the-convertrulesfiltertokql-method) + - [Rule Management endpoints](#rule-management-endpoints) + - [Prebuilt Rules endpoints](#prebuilt-rules-endpoints) + - [Rule monitoring endpoints](#rule-monitoring-endpoints) + - [Rule Execution Logs](#rule-execution-logs) +- [Exporting and importing rules](#exporting-and-importing-rules) + - [Exporting rules](#exporting-rules) + - [Importing rules](#importing-rules) + - [Handling the `version` parameter](#handling-the-version-parameter) +- [Customizing Prebuilt Rules](#customizing-prebuilt-rules) + - [Endpoints](#endpoints) + - [Changes needed to endpoints](#changes-needed-to-endpoints) + - [Updating the `is_customized` field](#updating-the-is_customized-field) + - [In the UI](#in-the-ui) + - [Via the Rule Edit Page](#via-the-rule-edit-page) + - [Via Rules Table page](#via-rules-table-page) + - [Via Bulk Actions](#via-bulk-actions) + - [Via the Rules Details Page](#via-the-rules-details-page) + - [Via the Shared Exception Lists page](#via-the-shared-exception-lists-page) + - [Via the Stack Management \> Rules UI](#via-the-stack-management-rules-ui) +- [Design Discussion link](#design-discussion-link) +- [Upgrading Prebuilt Rules](#upgrading-prebuilt-rules) + - [Changes to `/upgrade/_perform` endpoint](#changes-to-upgrade_perform-endpoint) + - [Changes to `/upgrade/_review` endpoint](#changes-to-upgrade_review-endpoint) + - [Concrete field diff algorithms by type](#concrete-field-diff-algorithms-by-type) + - [Single-line string fields](#single-line-string-fields) + - [Multi-line string fields](#multi-line-string-fields) + - [Number fields](#number-fields) + - [Array of scalar value (strings/numbers) fields](#array-of-scalar-value-stringsnumbers-fields) + - [Array of objects fields](#array-of-objects-fields) + - [Changes to Rule Upgrade UX/UI flow](#changes-to-rule-upgrade-uxui-flow) + - [Bulk accepting upgrades with no conflicts](#bulk-accepting-upgrades-with-no-conflicts) + - [Upgrading rules with conflicts](#upgrading-rules-with-conflicts) + +## Note about scope of RFC + +This RFC was initially planned to have a scope strictly limited to the Customization of Prebuilt Rules epic. However, another epic is, in parallel, in the discussion phase: the [Detections-as-Code (DaC) epic](https://docs.google.com/document/d/1MfPFa3Io82S91rRfdQde8Xi_9AGEbE44Z2MkIYWD10U/edit). + +Both epics have many areas of contact, and features/decisions in one need to take account features in the other. + +This RFC includes some decisions that will be taken in order to future-proof our archtecture for the upcoming DaC epic, but the vast majority will refer specifically to the Prebuilt Rules Customization epic. Elastic prebuilt rules will become a specific case of externally sourced rules: in the future, rules can be installed as Elastic prebuilt rules from our `detection-rules` repo, but also from any other repository handled by the user. + +During this RFC, we will explicitly refer to case of Elastic prebuilt rules, but take into account that this will be only a specific case of all the possible external sources for rules. + +## Necessary rule schema changes + +In order to support the customization of Elastic Prebuilt Rules, we need to modify our rule schema. This involves introducing the new top level field: the nested `rule_source` field, as well deprecating the `immutable` field. + +```ts +// PSEUDOCODE - see complete schema in detail below +{ + rule_source: { + type: 'external' + is_customized: boolean; + source_updated_at?: Date; + } | { + type: 'internal' + }, +} +``` + + +### `rule_source` field + +The `rule_source` field will be a top-level object field in our rule schema that will be a discriminated union of two types: `'internal'` and `'external'`. + +Rules with `rule_source` of type `internal` are rules generated internally in the Kibana application and which don't have an external origin outside of it. + +Rules with `rule_source` of type `external` are rules who have an external origin or source. Elastic prebuilt rules are a case of `external` rule, with the `detection-rules` repository handled by the TRaDE team being their external source origin. + +This also means that a rule with this type of `rule_source` will determine that the rule is an Elastic Prebuilt Rule that can receive upstream updates via Fleet. This field is intended to partly replace the currently existing `immutable` field, which is used today for the same purpose, but -as its name indicates- also currently determines if a rule's fields can be modified/customized. + +Prebuilt rules will have: + +```ts +{ + rule_source: { + /** + * The discriminant of the discriminated union type of the `rule_source` field. + */ + type: 'external'; + + /** + * Determines whether the rule (which is prebuilt/external) has been customized by the user, + * i.e. if any of its fields have been modified and diverged from the base version of the rule, + * which is the version that is installed from the `security_detection_engine` Fleet package. + * The value will be initially set to `false` when a brand new prebuilt rule is installed, + * but will be rewritten to `true` if a rule's field is edited and diverges from the value + * from the base version of the rule. + * See section "Updating the `isCustomized` flag" + */ + is_customized: boolean; + + /** + * A date in ISO 8601 format which describes the last time that this prebuilt rule was created + * and subsequently updated by the TRaDE team, the team responsible for creating prebuilt rules. + * Its usage is detailed in https://github.com/elastic/detection-rules/issues/2826. + * This field will be optional in both the API schema and the internal rule schema, since + * this value will not exist for prebuilt rules until a new version of each rule which includes + * this field in the prebuilt rule asset is published by the TRaDE team, and the user installs + * it or updates to it. + * NOTE: the field will not be included in first iteration of the implementation. There is a + * dependency with the TRaDE team that has blocked the inclusion of this field in the `security-rule` SO, + * and the change has therefore been postponed. + * See ticket https://github.com/elastic/detection-rules/issues/2826 for details. + */ + source_updated_at?: Date; + }; +} +``` + +Custom rules will have: +```ts +{ + rule_source: { + /** + * The discriminant of the discriminated union type of the `rule_source` field. + */ + type: 'internal'; + }; +} +``` +### `immutable` field + +In the current application's state, rules with `immutable: false` are rules which are not Elastic Prebuilt Rules, i.e. custom rules, and can be modified. Meanwhile, `immutable: true` rules are Elastic Prebuilt Rules, created by the TRaDE team, distributed via the `security_detection_engine` Fleet package, and cannot be modified once installed. + +When successfully implemented, the `rule_source` field should replace the `immutable` field as a mechanism to mark Elastic prebuilt rules, but with one difference: the `rule_source` field will determine if the rule is an Elastic Prebuilt Rule or not, but now all rules will be customizable by the user in Kibana, i.e. independently of the `type` of `rule_source`. + +Because of this difference between the `rule_source` and `immutable` fields, the `immutable` field will lose its original meaning as soon as we allow users to customize prebuilt rules, which might become confusing for those API consumers who interact directly with this field. That's why we want to first deprecate it and later after a large enough deprecation period we could consider removing it completely from the API. + +### Changes needed in rule schema + +As detailed further down in the [Plan for carrying out migrations of rule SOs](#plan-for-carrying-out-migrations-of-rule-sos) section, we will be performing incremental migration-on-write on our saved objects to get to our new schemas (see details in linked section). + +This means that we need to differentiate between changes to the internal rule schema and the API schema. + +#### API request and response rule schema + +Notice, as well, that `immutable` and `rule_source` will continue to be part **only of the API response schema**, and never form part of the **request parameters**. + +The OpenAPI schema will need to be modified so: + +_Source: [x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/common_attributes.schema.yaml)_ + +```yaml +# [... file continues above...] + +# Add deprecation warning to `immutable` field +IsRuleImmutable: + type: boolean + description: '[DEPRECATION WARNING! This field is deprecated and... ] - Determines whether the rule is a prebuilt Elastic rule.' + +IsExternalRuleCustomized: + type: boolean + description: Determines whether an external/prebuilt rule has been customized by the user (i.e. any of its fields have been modified and diverged from the base value). + +ExternalSourceUpdatedAt: + type: string + format: date-time + description: The date and time that the external/prebuilt rule was last updated in its source repository. + +InternalRuleSource: + description: Type of rule source for internally sourced rules, i.e. created within the Kibana apps. + type: object + properties: + type: + type: string + enum: + - internal + required: + - type + +ExternalRuleSource: + description: Type of rule source for externally sourced rules, i.e. rules that have an external source, such as the Elastic Prebuilt rules repo. + type: object + properties: + type: + type: string + enum: + - external + is_customized: + $ref: '#/components/schemas/IsExternalRuleCustomized' + source_updated_at: + $ref: '#/components/schemas/ExternalSourceUpdatedAt' + required: + - type + - is_customized + +RuleSource: + description: Discriminated union that determines whether the rule is internally sourced (created within the Kibana app) or has an external source, such as the Elastic Prebuilt rules repo. + oneOf: + - $ref: '#/components/schemas/ExternalRuleSource' + - $ref: '#/components/schemas/InternalRuleSource' +# [... file continues below ...] +``` + +_Source: [x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/api/detection_engine/model/rule_schema/rule_schemas.schema.yaml)_ + +```yaml +# [... file continues above...] + +ResponseFields: + type: object + properties: + id: + $ref: './common_attributes.schema.yaml#/components/schemas/RuleObjectId' + rule_id: + $ref: './common_attributes.schema.yaml#/components/schemas/RuleSignatureId' + immutable: + $ref: './common_attributes.schema.yaml#/components/schemas/IsRuleImmutable' + rule_source: + $ref: './common_attributes.schema.yaml#/components/schemas/RuleSource' + # [... more response fields ...] + required: + - id + - rule_id + - immutable + - updated_at + - updated_by + - created_at + - created_by + - revision + - rule_source +# [... file continues below...] +``` + +#### Rule Import request schema + +We also need to modify the `RuleToImport` schema, since now we will be allowing the importing of both custom rules and prebuilt rules. + +Currently, `RuleToImport` optionally accepts the `immutable` param, but rejects validation if its value is set to anything else than `false` - since we don't currently support importing prebuilt rules. + +We will be changing the mechanism for importing rules so that onlt the `rule_id` is required parameter. This parameters will be used to determine if the rule is prebuilt or not, and dynamically calculate `rule_source` during import. + +The rule import endpoint should: + +- for custom rules being imported, if `version` is not specified, set it to `1`. +- for prebuilt rules being imported, if `version` is not specified, throw an error. + +See the detailed explanation for this mechanism in the [Exporting and importing rules](#exporting-and-importing-rules) sections. + +The `immutable` and `rule_source` fields will be ignored if passed in the request payload. + +_Source: [x-pack/plugins/security_solution/common/api/detection_engine/rule_management/import_rules/rule_to_import.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/api/detection_engine/rule_management/import_rules/rule_to_import.ts)_ + +```ts +// [... file continues above...] +import { + // [...] + RuleSignatureId, + IsRuleImmutable, + ExternalSourceAttributes, + RuleVersion, +} from '../../model/rule_schema'; + +export type RuleToImport = z.infer; +export type RuleToImportInput = z.input; +export const RuleToImport = BaseCreateProps.and(TypeSpecificCreateProps).and( + ResponseFields.partial().extend({ + rule_id: RuleSignatureId, + }) +); +``` + +#### Internal rule schema + +**The internal rule schema** needs to represent that the `immutable` and the new `ruleSource` field may not always exist, so they must be optional. + +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema/model/rule_schemas.ts)_ + +```ts +export type BaseRuleParams = z.infer; +export const BaseRuleParams = z.object({ + // [...] + + immutable: IsRuleImmutable.optional(), + ruleSource: RuleSource.transform(camelize).optional(), + // [...] +}); +``` + +> Notice that in the internal schema we cannot simply reuse the `RuleSource` attribute defined for the API schema, since it should have CamelCase and the API schema uses snake_case. We need to apply a transformation to our Zod type. See this [issue](https://github.com/colinhacks/zod/issues/486#issuecomment-1567296747). + +In the internal rule schema, there are two additional important reasons why we need to make sure that these two fields optional: + +- When rules are executed, a call to the method `validateRuleTypeParams` is done, which is a method that validates the passed rule's parameters using the validators defined in `x-pack/plugins/security_solution/server/lib/detection_engine/rule_types`, within each of the rule query types files (for [EQL rules](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types/eql/create_eql_alert_type.ts#L27), for example). The validation is done based on the internal rule schema `BaseRulesParams` displayed above. Having `ruleSource` as required field would cause custom rules or prebuilt rules that haven't had their schema migrated to fail during runtime. +- The Rule Client `update` method also calls the `validateRuleTypeParams` to validate the rule's params. Since the Rule Client's `update` method is used in our endpoint handlers, such as and `/rules/patch` and `/_bulk_actions`, these would fail when executed against a payload of custom rule. + +#### Prebuilt Rule asset schema + +The `PrebuiltRuleAsset` type needs to be updated to include the new `source_updated_at` date that will be progressively shipped with new versions of rules in the Elastic Prebuilt Rules package. + +Notice that this field will be a **top-level field in the Prebuilt Rule asset** schema, but will be part of the `rule_source` field in the API rule schema and internal rule schema. + +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/model/rule_assets/prebuilt_rule_asset.ts)_ + +```ts +export const PrebuiltRuleAsset = BaseCreateProps.and(TypeSpecificCreateProps).and( + z.object({ + rule_id: RuleSignatureId, + version: RuleVersion, + related_integrations: RelatedIntegrationArray.optional(), + required_fields: RequiredFieldArray.optional(), + setup: SetupGuide.optional(), + source_updated_at: SourceUpdatedAt.optional(), // new optional field + }) +); +``` + +### Deprecating the `immutable` field + +To ensure backward compatibility and avoid breaking changes, we will deprecate the `immutable` field but keep it within the rule schema, asking our users to stop relying on this field in Detection API responses. During the migration period, we want to keep the value of the `immutable` field in sync with the `rule_source` fields: this means that for all rules that have a `immutable` value of `true`, the `rule_source` field will always be of type `'external'`. Viceversa, rules with `immutable: false` will have a `rule_source` field of type `'internal'`. + +This means, however, that there will be a change in behaviour of the `immutable` field: with the release of the feature, rules with the `immutable: true` value will now be customizable by the user, which is not the current behaviour. + +In order to mark the `immutable` field as deprecated, and making sure that our application and API users are aware that the field has been deprecated and replaced by the `rule_source` field, we will communicate this change in three ways: + +1. via updates to the documentation of all endpoints that return `RuleResponse` types +2. via a deprecation warning in the OpenAPI schema, as detailed above +3. by adding a custom response header in said endpoints. + +The `immutable` field will afterwards be actually removed from our API endpoint responses and our application after a deprecation period that should give our users enough time to adapt to this change. The length of this deprecation period can vary depending on adoption or other factors, but should be at least 24 months. + +Both the docs and the custom response header should communicate that the `immutable` field: + +- has been replaced by the `rule_source` field and users should rely on that new field onwards +- is maintained for backwards compatibility reasons only +- will be removed after a specific date/release + +The endpoints should be updated to include a custom response header, using the [format we already use for our bulk CRUD endpoints.](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/deprecation.ts#L34-L43) + +## Mapping changes + +**Alert (rule objects) mapping** + +No changes will be needed for the [mapping of rule saved objects](https://github.com/elastic/kibana/blob/main/x-pack/plugins/alerting/common/saved_objects/rules/mappings.ts) (of type `alert`), since the new fields introduced will be part of the `params` field, which is a `flattened` field. + +**Security Rules (prebuilt rule assets) mapping** + +No changes will be needed either for the `security-rule` [mapping](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_assets/prebuilt_rule_assets_type.ts), our prebuilt rule assets. We currently have mappings for the `rule_id` and `version` fields, since we perform aggregations and filtering on those in the rule install and upgrade endpoints. No additional fields needs to be mapped in this phase. + +## Plan for carrying out migrations of rule SOs + +### Context + +Historically, migrations to Elasticsearch saved objects were carried out by a procedure in which the changes in the SO were described in a migration operation that would be carried out **during an upgrade to a specific Kibana version**. See `x-pack/plugins/alerting/server/saved_objects/migrations/index.ts` for a list of migrations of SO that take place when a user updates Kibana to a specific version. + +However, this mechanism is no longer supported by the Alerting Framework team - which maintained it -, and the new migration mechanism introduced to replace that, the [Model Version API](https://github.com/elastic/kibana/blob/main/packages/core/saved-objects/core-saved-objects-server/docs/model_versions.md), which is Serverless-compatible, doesn't support migrating encrypted saved objects. + +Since our alerting rules are encrypted saved objects, we have to find an alternative strategy to migrate them. Therefore, we will perform the migration of the saved objects directly in the Detection API's endpoints that interact with them. This means that, instead of all of a user's saved object being migrated in a single operation during a Kibana update, the SO will be migrated when the pertinent endpoints are called. In the next section, we describe which those endpoints are. + +Since the migration of rules will be performed as the user calls the pertinent endpoints, the migration of the saved objects will be carried out progressively and incrementally: the SO will be migrated only when a endpoint that handles it is called by the user. We therefore have to assume that, at any given point in time, a user may have a mix of migrated and non-migrated rule saved objects. Consequently, we must continue supporting both versions of SOs. + +### Problem with tightly coupled logic in our endpoints + +All endpoints belonging to Detection Rules Management that create and update -including upgrade of prebuilt rules to new version- use three CRUD methods under the hood: + +- [`createRules`](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/create_rules.ts) +- [`patchRules`](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/patch_rules.ts) +- [`updateRules`](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/update_rules.ts) + +This "overuse" of these 3 methods for a variety of user actions makes their logic tightly coupled and creates a considerable amount of complexity to CRUD functions that should remain logically simple. + +For example: the `createRules` method is used in 3 use cases: +1. when creating custom rules with our Rule Creation endpoints +2. when importing rules, when the imported `rule_id` does not already exist in Kibana +3. when upgrading rules, if a rule undergoes a `type` change, the existing rule is deleted a new one is created. + +The same happens with `patchRules`. It is used: +1. when patching rules via our Rule Patch endpoints +3. when upgrading rules, if a rule maintains its `type`. + +This causes these 3 CRUD functions to have an unnecessary complex interfaces and logic in order to handle all these different use cases. + +As part of the epic, we should move away from this practice and create new CRUD methods that handle the different cases mentioned above specifically. This will help simplify our existing methods, keep logic in all of our CRUD methods simple and logically uncoupled from one another. + + +### Migration strategy + +Our migration strategy will consist of two distinct types of migration: a **migration on write** that will update the SO on Elasticsearch, and a **normalization on read**, which will transform legacy rules to the new schema **in memory** on read operations, before returning it as a response from an API endpoint. + + + +| API endpoint | Normalization-on-read | Migration-on-write | Comments | +|-|-|-|-| +| **Find Rules** - `GET /rules/_find` |
|
| | +| **Read Rule** - `GET /rules` |
|
| | +| **Delete Rules** - `DELETE /rules` |
|
| | +| **Export Rules** - `POST /rules/_export` |
|
| - Endpoints is unused in UI, still used via public API
- See section [Exporting rules](#exporting-rules) | +| **Import Rules** - `POST /rules/_import` |
|
| - See section [Importing rules](#importing-rules) | +| **Update Rule** - `PUT /rules`|
|
| - Used in the UI when updating/modifying a single rule via the Rule Editing page | +| **Patch Rule** - `PATCH /rules`|
|
| - Used in the UI for attaching shared exceptions list to rules | +| **Bulk Update Rules** - `PUT /rules/_bulk_update`|
|
| - Deprecated and unused by the UI. Might still be used by API users | +| **Bulk Patch Rules** - `PATCH /rules/_bulk_update`|
|
| - Deprecated and unused by the UI. Might still be used by API users | +| **Perform Rule Upgrade** - `POST /prebuilt_rules/upgrade/_perform` (Internal) |
|
| - Current way of upgrading a prebuilt rule | +| **(LEGACY) Install Prebuilt Rules And Timelines** - `PUT /rules/prepackaged` |
|
| - Legacy endpoint for installing prebuilt rules and updating rules. | +|**Bulk Actions** - `POST /rules/_bulk_action`: | | | This endpoint includes a `dry_run` mode that is executed to evaluate preconditions and warn the user before executing the actual request. No migration logic should take place for dry run requests, i.e when `dry_run=true`, since we never write to ES when this parameter is set to `true`.| +|
  • _**Enable and disable action**_
  • |
    |
    | - Migration-on-write is technically possible but we have decided to avoid implementing the additional logic in the AF side. Also, logic should be [migrated](https://github.com/elastic/kibana/issues/177634) soon. | +|
  • _**Delete action**_
  • |
    |
    | - Deletes ES object but returns deleted rules data, so so normalization-on-read is enough. | +|
  • _**Export action**_
  • |
    |
    | - See section [Exporting rules](#exporting-rules) | +|
  • _**Duplicate rule action**_
  • |
    |
    | - Per definition, all duplicated rules will be `custom` rules. That means that all duplicated rules (the duplicates) are newly created and should get a `rule_source` of type `internal`, and no migration-on-write is neccessary. | +|
  • _**Edit rule action**_
  • |
    |
    | - We can take advantage of the `ruleParamsModifier` to carry out the migration-on-write, regardless of the type of edit that is being performed.
    - See implementation details in the [Bulk editing rules](#bulk-editing-rules) section. +| **Review Rule Installation** - `POST /prebuilt_rules/installation/_review`|
    |
    | | +| **Perform Rule Installation** - `POST /prebuilt_rules/installation/_install`|
    |
    | - Newly installed rules will be installed with new schema; but no migration-on-write should happen in this endpoint. | +| **Review Rule Upgrade** - `POST /prebuilt_rules/upgrade/_review` |
    |
    | | +| **Perform Rule Upgrade** - `POST /prebuilt_rules/upgrade/_perform`|
    |
    | | + + +#### Normalization on read + +All endpoints that respond with a rule Saved Object, typed as `RuleResponse`, will perform **normalization on read**, which will transform legacy rules to the new schema **in memory** on read operation, before returning it as a response from an API endpoint. + +This means that the endpoints will always respond with the rules with the new schema, while the actual rule saved object might still be stored with the legacy schema in Elasticsearch, if it still has not been migrated-on-write. + +The **normalization on read** will be carried out by a new `normalizeRuleSourceSchemaOnRuleRead` normalization function. The `internalRuleToAPIResponse` method, which is used in our endpoints to convert a rule saved object as is stored in Elasticsearch to the `RuleResponse` type which is returned to the client, calls the `commonParamsCamelToSnake` methods to convert rule parameters that are common to all rule types to what's expected in `RuleResponse`. + +Inside this method, we will use `normalizeRuleSourceSchemaOnRuleRead` to calculate the normalized values of `rule_source` and `immutable`. + +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts)_ + +```ts +export const internalRuleToAPIResponse = (rule) => { + return { + ...commonParamsCamelToSnake(rule.params), // <--- rule params are converted here + ...typeSpecificCamelToSnake(rule.params), + // [... more object properties ...] + }; +}; + +export const commonParamsCamelToSnake = (params: BaseRuleParams) => { + const { immutable, rule_source } = normalizeRuleSourceSchemaOnRuleRead(params); + + return { + immutable, + rule_source, + // [... more object properties ...] + }; +}; +``` + +And the `normalizeRuleSourceSchemaOnRuleRead` can be defined so: + +_Source: x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/prebuilt_rule_schema_migrations.ts_ (New file) + +```ts +interface OnReadNormalizationResult { + immutable: IsRuleImmutable; + rule_source: RuleSource +} + +const getRuleSourceValueForRuleRead = (ruleParams: BaseRuleParams): RuleSource | undefined => { + if (ruleParams.rule_source) { + return ruleParams.rule_source; + } + + if (ruleParams.immutable) { + return { + type: 'external' + isCustomized: false, + }; + } + + return { + type: 'internal' + }; +}; + +export const normalizePrebuiltSchemaOnRuleRead = ( + ruleParams: BaseRuleParams +): OnReadNormalizationResult => { + +/** + * To calculate `immutable`: + * - Checks if the `rule_source` field exists in the rule's parameters. + * - If `rule_source` exists and its type is external, sets `immutable` to `true`. (Use case of Rules that have already been migrated-on-write) + * - If `rule_source` does not exist, return the value of the params' `immutable` field. (Use case of Rules that have not yet been migrated on write.) + */ + const isRuleSourceExternal = ruleParams.rule_source && ruleParams.rule_source.type === 'external'; + const immutable = Boolean(isRuleSourceExternal) || Boolean(ruleParams.immutable); + const rule_source = getRuleSourceValueForRuleRead(ruleParams); + + return { + immutable, + rule_source, + }; +}; +``` + + +#### Migration on write + +This type of migration will be in charge of updating saved object fields in Elasticsearch from the legacy form to the new form, and will be performed on all write operations of the rules (see list below). This means that we need to perform this type of migration of rules whenever any endpoint operation that writes/updates a rule saved object is called. + +This migration strategy means that rules will be migrated incrementally, and that both non-migrated and migrated rules will coexist for an indeterminate amount of time. Therefore we have to maintain backwards compatibility with non-migrated rules. + +The migration logic should take place within the handler logic of all endpoints that carry out write/update endpoint operations, and the endpoint should return the already-migrated rule(s). + +Endpoints that perform migration-on-write either fetch the rule before updating it, or send the rule's params as part of the body in the request. Therefore, we can apply migraton logic to them -as described below- before saving the rules to Elasticsearch. + +### Technical implementation of migration-on-write + +The migration-on-write process implements two changes: + +- creates the `ruleSource` field in the SO in Elasticsearch. +- deletes the `immutable` field in the SO in Elasticsearch (although this field is maintained in the API and calculated via normalization-on-read) + +The logic for the migration of the rule saved objects might differ depending on the action being performed by the user. + +Let's see all possible use cases that will require migration-on-write, the endpoints that they apply to, and the expected resulting migrated field, based on the action and their input. + +#### Updating and upgrading rules + +Updating rules can currently be performed via five endpoints: + +- **Update Rule** - `PUT /rules` +- **Patch Rule** - `PATCH /rules` +- **Bulk Update Rules** - `PUT /rules/_bulk_update` +- **Bulk Patch Rules** - `PATCH /rules/_bulk_update` +- **Bulk Actions** - `POST /rules/_bulk_action`: with **bulk edit** action + +Upgrading prebuilt rules to their newer version is done by two endpoints: + +- **(LEGACY) Install Prebuilt Rules And Timelines** - `PUT /rules/prepackaged` +- **Perform Rule Upgrade** - `POST /prebuilt_rules/upgrade/_perform` (Internal) + +The legacy endpoint does not allow for customization of fields during the upgrade, but the new rule upgrade customization endpoint does. + +Additionally: + +- **Bulk Actions** - `POST /rules/_bulk_action`: with **duplicate** action + +will perform migration but does not allow for customization during the duplication process. + +So we can analyze the expected outputs of the migration of all these 8 endpoints together. + +The resulting values for `immutable` and `rule_source` when calling these endpoints, and the migration being performed in the background, should be as follows: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Migration use caseCurrent value of rule_source and immutableAny field diverges
    from base version after update?
    Results
    Custom rule (not migrated yet) +
    +{
    +  immutable: false,
    +}
    +        
    +
    N/A - Doesn't apply for custom rules +
    +{
    +  ruleSource: {
    +    type: 'internal'
    +  }
    +}
    +        
    +
    Custom rule (already migrated) +
    +{
    +  ruleSource: {
    +    type: 'internal'
    +  }
    +}
    +        
    +
    N/A - Doesn't apply for custom rules +
    +{
    +  ruleSource: {
    +    type: 'internal'
    +  }
    +}
    +        
    +
    Prebuilt rule (not yet migrated, no customizations) +
    +{
    +  immutable: true,
    +}
    +        
    +
    No +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  }
    +}
    +        
    +
    Prebuilt rule (not yet migrated, with customizations) +
    +{
    +  immutable: true,
    +}
    +        
    +
    Yes +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: true,
    +    ...
    +  }
    +}
    +        
    +
    Prebuilt rule (already migrated, no customizations) +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  }
    +}
    +        
    +
    No +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  }
    +}
    +        
    +
    Prebuilt rule (already migrated, with customizations) +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  }
    +}
    +        
    +
    Yes +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: true,
    +    ...
    +  }
    +}
    +        
    +
    Customized Prebuilt rule (already migrated, no customizations after update) +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: true,
    +    ...
    +  }
    +}
    +        
    +
    No +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  }
    +}
    +        
    +
    Invalid case: Migrating a migrated non-customized prebuilt rule, with customizations.

    `immutable` should never be false if `ruleSource.type' is 'external'. Migration should correct this inconsistency.
    +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: false,
    +    ...
    +  },
    +  immutable: false,
    +}
    +        
    +
    Yes +
    +{
    +  ruleSource: {
    +    type: 'external',
    +    isCustomized: true,
    +    ...
    +  },
    +  immutable: true,
    +}
    +        
    +
    + +As explained before, all these endpoints suffer from the tightly-coupled logic problem described in the section [`Problem with tightly coupled logic in our endpoints`](#problem-with-tightly-coupled-logic-in-our-endpoints). + +We should therefore create new CRUD methods as needed to uncouple them logically and cleanly apply migrations to them. + +---- + +#### Bulk editing rules + +The endpoint **Bulk Actions** - `POST /rules/_bulk_action` has the same outputs from the migration logic as the endpoints listed in the above section, so it was included in the scenarios in the table above. + +However, this endpoint has some specific details that should be mentioned. + +Firstly, when bulk editing rules, the migration should be carried out for the following use cases: + - Bulk adding or deleting index patterns + - Bulk adding or deleting tags + - Updating rule schedules + - Adding rules actions + +Out of the actions mentioned above, the only use cases that should possibly result in the migration having a result of `rule_source.isCustomized = true` are the first three: + - Bulk adding or deleting index patterns + - Bulk adding or deleting tags + - Updating rule schedules + +That means that updating a rule's actions should not be considered a customization of a prebuilt rule. + +Secondly, in order to migrate the `is_customized` value for rule edits, we can follow two approaches: + +1. Calculate it in the `paramsModifier` callback that is passed to the `rulesClient.bulkEdit` method. This will need to modify the parameters of the callback to take as parameter the whole rule and the operations on the attributes, in order to have access to the values of the rule's field before and after of the edit. +2. Calculate it as part of the `validateMutatedRuleTypeParams` method in `x-pack/plugins/alerting/server/lib/validate_mutated_rule_type_params.ts` where we have access to the original params and the modified params. + +---- + +## Endpoints and utilities that will need to be adapted to the new schema + +### Utilities + +#### KQL filters and the `convertRulesFilterToKQL` method + +Across our application, both in the frontend and serverside, we use KQL filters to retrieve rules based on whether they are prebuilt rules or not - this means that the current behaviour of these values relies on the `immutable` field being set to either `true` or `false`. + +As mentioned before, we need to assume that at any point in time, there will be a mixture of rules whose saved object has already been migrated on Elasticsearch and others will not. This means that the retrieval of rules will need to maintain backwards compatibility: in order to determine if a rule is prebuilt, preferentially search for the existence of the `rule_source` field and check its `type` subfield; if that doesn't exist, we should fall back to the legacy logic of checking a rule's `immutable` value. + +This means that we will need to update the constants and KQL filters that we have hardcoded in our application to reflect the new schema: + +_See source of rule params keys: [x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_fields.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_fields.ts)_ + +Will need to update the `x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_filtering.ts` file, where the `convertRulesFilterToKQL` method is defined. This method is used both in the frontend and in the serverside, and translates rule filter options to KQL filters that Elasticsearch can understand. + +Here, we need to update the KQL filters and the logic for fetching Elastic prebuilt and custom rules, relying on `rule_source` but with fallback to `immutable`: + +_Source for `convertRulesFilterToKQL`: [x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_filtering.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_filtering.ts)_ + +In order to retrieve Elastic prebuilt rules, we can filter for rules in which `alert.attributes.params.rule_source.type` is `external`, with a fallback to rules in which `alert.attributes.params.immutable` is `true`, for rules which have not had their schema migrated and `rule_source` does not still exists for them. + +> In the future, we can further distinguish between `type: external` rules by their source origin. If we introduce a new field within `rule_source` that defines their origin (such as `repo_name`, `repo_id`, or similar), we can further filter by Elastic prebuilt rules, or rules that are externally sourced from a repository handled by the user, etc. + +### Rule Management endpoints + +- **Create Rules** - `POST /rules` and **Bulk Create Rules** - `POST /rules/_bulk_create`: + +Currently, we don't support the `immutable` field in any of the endpoints' request parameters (except for the Import endpoint). We shouldn't support the `rule_source` field either, because this value should be controlled by the app on the server side, and not by users. + +This is so because we will never want users to be able to create their own prebuilt rules, only install them, import them, and customize them. Also, a prebuilt rule should always be able to be compared to a `security-rule` asset distributed by Fleet, and receive updates from it, which would not be possible if a user creates its own prebuilt rules. + +Again, as mentioned in the [`Problem with tightly coupled logic in our endpoints`](#problem-with-tightly-coupled-logic-in-our-endpoints) section, the `createRules` CRUD method used in these two endpoints is re-used in other unrelated use cases, like upgrading rules and importing rules. + +Creating new methods for those unrelated actions should help clean the `createRules` method's interface and logic, and make sure it is only used in these two endpoints. + +- **Rule Management Filters** - `GET /rules/_rule_management_filters` (Internal): + +This endpoint currently depends on rules `alert.attributes.params.immutable` to fetch number of custom rules and number of prebuilt rules. We need to adapt its logic to rely on new `alert.attributes.params.rule_source` field, with fallback to the original, for backwards compatibility. + +Specifically, the endpoint handler uses the [`findRules` utility](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/search/find_rules.ts) to fetch rules based on their `immutable` param. + +This needs to be changed so that we rely on the `rule_source.type` param, but fallback to `immutable` if that parameter doesn't exist - i.e., in the case of non-migrated-on-write rules. We need to modify the KQL queries in a similar way to the already described in the section `KQL filters and the convertRulesFilterToKQL`. + +We need to modify the `x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/filters/route.ts` file; specifically the `fetchRulesCount` function, which contains the KQL query filters that should be updated. + +_See Source: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/filters/route.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/filters/route.ts)_ + +- **Coverage Overview** - `/rules_coverage_overview` (Internal): This endpoint is called to retrieve the data that populates the MITRE Coverage Overview table, and currently depends on the `immutable` field to fetch the user's installed rules. + +Similarly to what was described in the previous endpoint, we should update the logic so that we rely on the `rule_source.type` field, but fallback to `immutable` if that parameter doesn't exist - i.e., in the case of non-migrated-on-write rules. + +This endpoint handler also uses the [`findRules` utility](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/search/find_rules.ts) to fetch rules, but the KQL filter that is passed to that utility is created by the reusable [`convertRulesFilterToKQL` utility function](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/common/detection_engine/rule_management/rule_filtering.ts): + +_See Source: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/coverage_overview/handle_coverage_overview_request.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/api/rules/coverage_overview/handle_coverage_overview_request.ts)_ + +Therefor, it is enough to modify the `convertRulesFilterToKQL` utility logic as was described in the section above: [KQL filters and the `convertRulesFilterToKQL` method](#kql-filters-and-the-convertrulesfiltertokql-method) + +### Prebuilt Rules endpoints + +- [**(LEGACY) Get Prebuilt Rules and Timeline Status** - `/rules/prepackaged/_status`](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts) + +This currently depends on rules `alert.attributes.params.immutable` to fetch the number of custom rules and number of prebuilt rules. We need to adapt these filters used in the `findRules` method used in the endpoint handler to rely on new `alert.attributes.params.rule_source.type` field, with fallback to the original, for backwards compatibility: + +_See Source: [x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_and_timelines_status/get_prebuilt_rules_and_timelines_status_route.ts)_ + +As explained above, this endpoint fetches the installed prebuilt rules, as well, using the `getExistingPrepackagedRules` reusable utility. This function needs to be modified as well to update its KQL query filters: + +_See source for `getExistingPrepackagedRules`: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/search/get_existing_prepackaged_rules.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/search/get_existing_prepackaged_rules.ts)_ + +- [**Get Prebuilt Rules Status** - `GET /prebuilt_rules/status` (Internal)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/get_prebuilt_rules_status/get_prebuilt_rules_status_route.ts) + +Uses `IPrebuiltRuleObjectsClient` to retrieve instances of prebuilt rules according to the `immutable` field. The Prebuilt Rule Objects client fetches prebuilt rules using the `getExistingPrepackagedRules` function mentioned above, so modifying it as described above will suffice: +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/prebuilt_rule_objects_client.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/prebuilt_rule_objects_client.ts)_ + +- [**(LEGACY) Install Prebuilt Rules And Timelines** - `PUT /rules/prepackaged`](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts) + +This endpoint fetches the installed prebuilt rules using the `getExistingPrepackagedRules` reusable utility, as well: + +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/install_prebuilt_rules_and_timelines/install_prebuilt_rules_and_timelines_route.ts)_ + +Therefore, modifying the `getExistingPrepackagedRules` function as described above will suffice. + +- **Installation and Upgrade `_review` and `_perform` endpoints:** + +All four endpoints use the Prebuilt Rule Saved Objects client (`IPrebuiltRuleObjectsClient`) to retrieve instances of prebuilt rules according to the `immutable` field. This needs to be modified as described in the **Get Prebuilt Rules Status** - `GET /prebuilt_rules/status` section above. + +Additionally: + +- [**Review Rule Installation** - `POST /prebuilt_rules/installation/_review` (Internal)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_installation/review_rule_installation_route.ts) + +This endpoint uses the `convertPrebuiltRuleAssetToRuleResponse` method, which takes in a prebuilt rule asset and converts it to an object of type `RuleResponse`. This method has to be modified so that new prebuilt rules objects are returned by the endpoint with a `rule_source` field of type `external` and its other corresponding subfields, as well as the legacy `immutable` value of `true`. + +_Source: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/normalization/rule_converters.ts)_ + +```ts +// [... file continues above ...] + +export const convertPrebuiltRuleAssetToRuleResponse = ( + prebuiltRuleAsset: PrebuiltRuleAsset +): RuleResponse => { + const prebuiltRuleAssetDefaults = { + enabled: false, + // [... other prebuilt rule asset defaults ...] + }; + + const ruleResponseSpecificFields = { + // [... other prebuilt rule fields ...] + immutable: true, + rule_source: { + type: 'external', + isCustomized: false, + sourceUpdatedAt: prebuiltRuleAsset.sourceUpdatedAt, + }, + revision: 1, + }; + + return RuleResponse.parse({ + ...prebuiltRuleAssetDefaults, + ...prebuiltRuleAsset, + ...ruleResponseSpecificFields, + }); +}; +``` + +- [**Perform Rule Installation** - `POST /prebuilt_rules/installation/_install` (Internal)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_installation/perform_rule_installation_route.ts) + +To install a new prebuilt rule, this endpoint uses the [`createPrebuiltRules` method](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/logic/rule_objects/create_prebuilt_rules.ts), which in turn calls the [`createRules` method](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/crud/create_rules.ts). + +This endpoint also suffers from the issue of tightly coupled logic explained above: using th `createRules` method for creating, importing and upgrading -in some cases- rules. We need to create a new CRUD method specifically for installing prebuilt rules, that extracts that responsibility out of the `createRules` method. + +- [**Review Rule Upgrade** - `POST /prebuilt_rules/upgrade/_review` (Internal)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/review_rule_upgrade/review_rule_upgrade_route.ts) + +This endpoint uses the `convertPrebuiltRuleAssetToRuleResponse` method to get a `RuleResponse`-type object from a target version of a rule provided from upstream. This method needs to be modified as described in the section that details the changes needed for the **Review Rule Installation** - `POST /prebuilt_rules/installation/_review`. + +This endpoint will need further changes, which will be detailed further down, and are out of the scope of Saved Object, migration and rule schema updates. + +- [**Perform Rule Upgrade** - `POST /prebuilt_rules/upgrade/_perform` (Internal)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts) + +This endpoint will require major changes to add the capability of letting users selecting a custom version of the rule with custom values for rule fields. This will be explained further below in the "Changes to upgrade `_review` and `_perform` endpoints" section. + +The calculation of the value for the `rule_source.is_customized` field for the updated rule will depend on that logic as well, so its calculation will be explained in that section. + +Again, this endpoint suffers from tightly coupled logic explained in [`Problem with tightly coupled logic in our endpoints`](#problem-with-tightly-coupled-logic-in-our-endpoints): it uses the `upgradePrebuiltRules` method to actually upgrade the rules, but this method either patches existing rules -for the normal case-, or deletes an existing rule and recreates it if the rule underwent a type change, using the `patchRules` and `createRules` methods respectively. We should decouple that logic by introducing a new CRUD method with a specific use case for upgrading prebuilt rule. + +### Rule monitoring endpoints + +- [**Detection Engine Health: Get Cluster Health** - `GET or POST /detection_engine/health/_cluster` (internal):](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/api/detection_engine_health/get_cluster_health/get_cluster_health_route.ts) + +This endpoint uses the [Detection Engine Health Client (`IDetectionEngineHealthClient`)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/detection_engine_health_client_interface.ts), calling its [`calculateClusterHealth` method](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/detection_engine_health_client.ts) in the request handler. + +The Detection Engine Health client receives as its parameter the [Rule Objects Health client (`IRuleObjectsHealthClient`)](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/rule_objects_health_client.ts), whose method `calculateClusterHealth` performs an aggregation on rule stats based on different rule attributes and parameters. + +This is done in the [`getRuleStatsAggregation` method](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/aggregations/rule_stats.ts), where an aggregation is done over the `immutable` param. This needs to be updated to the new `rule_source.type` param, with a fallback to `immutable`: + +_Source: x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/aggregations/rule_stats.ts(https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/aggregations/rule_stats.ts)_ + +- **Detection Engine Health: Get Space Health** - `GET or POST /detection_engine/health/_space` (internal): + +In this endpoint, the `getSpaceHealthAggregation` method of the Rule Objects Health client (`IRuleObjectsHealthClient`) is called instead, but it internally calls the same [`getRuleStatsAggregation` method](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring/logic/detection_engine_health/rule_objects/aggregations/rule_stats.ts) as in the previous endpoint. + +Therefore, the update described in the endpoint above would cover this endpoint too. + +- **Detection Engine Health: Get Rule Health** - `POST /detection_engine/health/_rule` (internal): + +This endpoint does not depend on any of the affected params, i.e. no changes are needed here. + +### Rule Execution Logs + +Rule execution logging works independently of whether the rules are prebuilt or not, so any changes to the rule schema won't affect these endpoints. + +## Exporting and importing rules + +**Current behaviour:** + +- Custom Rules can be exported and imported +- When trying to import a custom rule, if the request payload doesn't include an `overwrite: true` value, its `rule_id` should not already exist in any of the installed rules. Otherwise the import logic will fail : `rule_id: {rule_id} already exists`. If the request payload includes an `overwrite: true`, the rule will be overwritten. +- Prebuilt Rules cannot be exported +- Prebuilt Rules cannot be imported (if you try to import a rule that has been set the `immutable` field to `true` manually, the import endpoint will reject it as the `immutable` field is expected to be `false`) + +**Updated behaviour** + +We will now allow the user to export and import both **prebuilt** and **custom rules**. + +### Exporting rules + +The user will now be able to export both custom and prebuilt rules (including any customizations that might have been performed on its modifiable fields). + +The export endpoints (bulk export and bulk action in export mode) will not carry out any migration-on-write logic. Since these endpoints solely read the rules and generate an ndjson file for export purposes, introducing additional writing or patching logic to migrate the rule's schema in Elasticsearch would negatively impact the endpoints' performance and introduce unnecessary overhead. + +Instead, we will carry out a normalization-on-read process, as described above, when the rule to be exported is read from ES, and before writing the rule's fields to the `ndjson` file. This means that the rule will actually be exported with the updated schema. + +This normalization will take place within the `internalRuleToAPIResponse` method, which internally calls the `normalizeRuleSourceSchemaOnRuleRead`, as described in the [Normalization on read](#normalization-on-read) section. + +There are two helper functions used for exporting: + +- [getExportByObjectIds](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts) +- [getExportAll](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts) + +The **Export Rules** - `POST /rules/_export` endpoint uses either the first or the second helper depending on the request payload, while **Bulk Actions** - `POST /rules/_bulk_action` uses only `getExportByObjectIds`. + +Both of these methods use `internalRuleToAPIResponse` internally to transform rules into our API response schema, so the normalization will come out of the box when executing that transformation. + +Also, in order to allow the endpoint to export both custom **and** prebuilt rules, we need to update the logic and remove the checks that we currently do server-side in both of these methods, and which filter out prebuilt rules from the response payload: + +_Source for `getRulesFromObjects`: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_by_object_ids.ts)_ + + +_Source for `getExportAll`: [x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts](https://github.com/elastic/kibana/blob/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/logic/export/get_export_all.ts)_ + +### Importing rules + +The user will now be able to import both custom and prebuilt rules (including any customizations that might have been performed on its modifiable fields). + +We want to handle the case of importing both migrated and non-migrated rules via an `ndjson` file. + +If a user imports a prebuilt rule, Kibana should continue to track the rule asset from the `security_detection_engine` package if the `rule_id` matches. This means that a user will be able to upgrade a previously imported prebuilt rule, visualize any diffs on any customized fields, and continue to receive updates on the rule. + +To allow for importing of Elastic prebuilt rules, we will **not rely** in the `rule_source` or the legacy `immutable` fields (which are not part of the import endpoint parameters), but we will rather **calculate them dynamically based on the `rule_id` and `version` request parameters**. + +The logic to importing a rule is as follows: + + - First, read the import endpoint request parameters `rule_id` and `version`. These two are two required parameters in the endpoint. + +- Secondly, check that the `security_detection_engine` Fleet package is installed and install it if it isn't. We will need the package to be installed to check if a rule that is being imported is an Elastic prebuilt rule. + +- Then, using the `rule_id` and `version`, attempt to fetch the corresponding `security-rule` asset from ES. + +- **If a matching `rule_id` and `version` is found**, that means that the rule is an Elastic prebuilt rule, and we should therefore dynamically calculate the rule's `rule_source` field and its subfields: + - `type`: should be always `external` since a matching external `security-rule` was found. + - `source_updated_at`: can be retrieved from the corresponding `security-rule` asset. + - `is_customized`: should be calculated based on the differences between the `security-rule` asset's fields and the rule fields from the import request. If any of them are different, i.e. have diverged from the base version, `is_customized` should be true. + +- Finally, using the import payload, plus the rule's `security-rule` asset fields and the calculated `rule_source` fields, create the rule, or update it if already exists in Kibana. + +**If a matching `rule_id` is found, but the `version` is not found**, it means there are some versions of this prebuilt rule known to Kibana, which means we should identify the rule being imported as prebuilt. The prebuilt rules package has a limit on the number of historical rule versions, and we can't assume that for a given rule_id we will always have ALL historical versions available as security-rule assets. + +In this case, we will set the rule's params to be: +``` +{ + ruleSource: { + type: 'external', + isCustomized: false + } +} +``` + + +**If a matching `rule_id` is NOT found**, that means that the rule is a custom rule. And `rule_source` will be simply: +``` +{ + type: 'internal' +} +``` + +And we can finally create a rule or update an existing rule using the request payload and the calculated `rule_source` field. + +Given the requirements described above, the following table shows the behaviour of our endpoint for a combination of inputs and Kibana states. + +(All situation assume that the Elastic prebuilt rules package will be installed, since we have set this as a precondition of the endpoint) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Current state of rule
    (match by rule_id)
    Matching rule_id found as security-rule asset?Matching version found for security-rule asset?Example field in import payloadOverwrite existing rule?Output
    Not installedNoN/A +
    +{
    +  name: "My custom rule",
    +} 
    +
    +
    N/A +
    +{
    +  name: "My custom rule",
    +  rule_source: {
    +    type: "internal"
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My custom rule",
    +} 
    +
    +
    NoN/A +
    +{
    +  name: "My edited rule",
    +} 
    +
    +
    + No + + Rule import rejected
    because of rule_id match +
    +
    +{
    +  name: "My custom rule",
    +} 
    +
    +
    NoN/A +
    +{
    +  name: "My edited rule",
    +} 
    +
    +
    + Yes + +
    +{
    +  name: "My edited rule",
    +  ruleSource: {
    +    type: "internal"
    +  }
    +} 
    +
    +
    + Not installed + +
    +{
    +  name: "My prebuilt rule",
    +  source_updated_at: "2024-05-..."
    +} 
    +
    +
    No +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    N/A
    +{
    +  name: "My prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: false,
    +  }
    +} 
    +
    +
    + Not installed + +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    N/A +
    +{
    +  name: "My prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: false,
    +  }
    +} 
    +
    +
    + Not installed + +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My custom prebuilt rule",
    +} 
    +
    +
    N/A +
    +{
    +  name: "My custom prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: true,
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: false,
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My custom prebuilt rule",
    +} 
    +
    +
    No + Rule import rejected
    because of rule_id match and overwrite flag is false +
    +
    +{
    +  name: "My prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: false,
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My custom prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My custom prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: true,
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My custom prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: true,
    +  }
    +} 
    +
    +
    +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My prebuilt rule",
    +} 
    +
    +
    Yes +
    +{
    +  name: "My prebuilt rule",
    +  ruleSource: {
    +    type: "external",
    +    isCustomized: false,
    +  }
    +} 
    +
    +
    + + +### Handling the `version` parameter + +In the code above, we made an additional check: if the rule to be imported is a prebuilt rule, then the `version` field will be required as part of the payload as well. Attempting to import a prebuilt rule without it will result in an error and the importing of that rule will be skipped. The `version` is necessary to be able to provide updates to the rule when a new version is available in the Prebuilt Rules package. Without it we don't know if the installed version is newer or older than the update being offered by the package. + +Since users will be importing rules via an `ndjson` file, they can potentially modify it as they please. If the `version` field of a prebuilt rule is changed by the user before importing, the update workflow could be broken. The possible scenarios are the following: + +**1. The user removes the `version` field from the importing payload:** as mentioned above, we won't be able to start the upgrading flow because we don't have a version number to compare to the version coming from the update. Therefore, we should **reject the import if the `version` is missing**. + +**2. The user lowers the `version` field in the importing payload:** for example, a user exports a prebuilt rule with `version: 5`, and, before importing it, modifies it to `version: 4`. This wouldn't represent a problem as a new version of the rule (i.e. `version: 6`) would still trigger the update workflow, and the rule field diffs would still work as expected. + +**3. The user increases the `version` field in the importing payload:** for example, a user exports a prebuilt rule with `version: 5`, and before importing it modifies it to `version: 6`. This would mean that when the actual rule with `version: 6` was released, we wouldn't trigger the update workflow, since the version from the target version (the update) needs to be higher than what is currently installed for that to happen. However, the update would eventually be triggered when the next update was released, i.e. when `version: 7` is released, and work as expected. + +**4. The user sets the `version` field from the importing payload to a number that does not exist in the Prebuilt Rules package**: this scenario would still depend on whether the `version` that the user modifies the rule to is higher or lower than the version of the update: + +- If it was higher, then we would be back in **scenario 3**, where the update workflow wouldn't trigger. +- If it was lower, then we would be in **scenario 2**, but with the additional problem that we wouldn't be able to fetch the **base** version of the rule - the unmodified version of the rule as it exists in the Prebuilt Rules package. However, we would still be able to normally display the rule field diffs between the current rule and the target (next version) rule (which is the default behaviour), but not between the base and the target (which is a feature that we want to a add as part of this Milestone). + +$\space$ + + +## Customizing Prebuilt Rules + +### Endpoints + +With the rule schema updated, we will allow users to **edit their prebuilt rules** in a similar way to how they currently edit/modify their custom rules. A full detail of which fields we will allow the users to edit can be found in the section "Rule fields" below. + +Endpoints that users will be able to use to modify rules are: + +- **Update Rule** - `PUT /rules`: called by the UI when updating/modifying a single rule via the Rule Editing page +- **Patch Rule** - `PATCH /rules`: used for attaching shared exceptions list to rules +- **Bulk Patch Rules** - `PATCH /rules/_bulk_update`: deprecated and unused by the UI (might still be used by public API users) +- **Bulk Update Rules** - `PUT /rules/_bulk_update`: deprecated and unused by the UI (might still be used by public API users) +- **Bulk Actions** - `POST /rules/_bulk_action` - with `edit` action: called when applying bulk actions via the Rules Table + +The first four endpoints listed above **currently allow users to modify their Elastic prebuilt rules** as well, in (almost) all of their fields, and no difference is made between updating/patching prebuilt rules and custom rules in the docs. However, none of those four endpoints allow to change a prebuilt rule to a custom rule (or vice-versa) by changing the current `immutable` field (i.e. the field is maintained from the existing rule). + +> - **Will we want to allow users to modify (via API) a prebuilt rule to transform it into a Custom Rule, by modifying the `rule_source` parameter?** +> - No. We want to keep the current endpoint logic, where the `immutable` field for the updated value comes from the existing value of the rule and is not modifiable. Allowing that modification would create issues with the corresponding `security_detection_engine` package rule, as it will clash with the modified rule if the `rule_id` is not modified as well. This requirement is therefore not needed anyway since will now offer users the option to customize a prebuilt rule, or alternatively, duplicate a prebuilt rule. + +The endpoint **Bulk Actions** - `POST /rules/_bulk_action` does provide validation in the endpoint logic itself: if a user attempts to edit prebuilt rule (`immutable: true`) the endpoint rejects that edit in two ways: + +- in `dryRun` mode, with an error: "editing prebuilt rules is not supported". +- in normal mode, with validation that throws the error "Elastic rule can't be edited". + +In both cases, the validation checks if the `immutable` param of the rule is `false`, or if the action sent in the payload is setting or adding actions to a rule. If any of those two conditions are true, the validation succeeds and the rule(s) can be edited. + +#### Changes needed to endpoints + +Depending on the endpoint, we will have to modify it to address multiple changes. These are: + +1. **Introduction of migration logic**: as explained in the first section of this document, endpoints should have the additional responsibility of migrating our rule schema. +2. **Calculation of the `is_customized` field**: this field which is part of the `rule_source` field for external rules needs to be recalculated whenever a rule's field is possibly modified. See implementation details in the [Updating the `is_customized` field](#updating-the-is_customized-field) section. +3. **Removing checks that block modifying prebuilt rules:** some of our endpoints prevent users from modifying prebuilt rules. This check needs to be removed from all endpoints to allow the customization of prebuilt rules. +4. **Blocking the update of non-customizable fields:** while the goal of this epic is to allow users to modify their prebuilt rule fields, there are certain rule fields that we will still want to prevent the user from modifying via endpoints, since we will not provide support for resolving conflicts for them via the UI or API if they arise during an update. See the **Customizable** column in [this ticket](https://github.com/elastic/kibana/issues/147239) for a detailed list of fields that should be blocked from modification via the endpoints. + +The table below shows which of these changes need to be applied to our endpoints: ( + +- ✏️ Changes needed +- ➖ No changes needed + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    EndpointsMigration logicis_customized calculationRemoving prebuilt checksBlocking non-customizable fields updates
    Update Rule - PUT /rules✏️✏️✏️
    Patch Rule - PATCH /rules✏️✏️✏️
    Bulk Patch Rules - PATCH /rules/_bulk_update✏️✏️✏️
    Bulk Update Rules - PUT /rules/_bulk_update✏️✏️✏️
    Bulk Actions - POST /rules/_bulk_action✏️✏️✏️
    Perform Rule Upgrade - POST /prebuilt_rules/upgrade/_perform✏️✏️
    Import Rules POST /rules/_import✏️✏️✏️
    + +#### Updating the `is_customized` field + +The `is_customized` field is initialized to a value of `false` for any new prebuilt rule that is installed, as well as in prebuilt rules that are migrated from the legacy schema. + +For all of the endpoints that allow for modifying a prebuilt rule, the five endpoints mentioned in the last section, we will want to calculate if: when the modifications are applied to the current state of the rule, does the rule result in a customized version of the prebuilt rule? + +This means, specifically: **do any of the rule's resulting fields differ from the base version of the rule?** + +In order to determine this, each time a user attempts to customize a prebuilt rule, we will need to pull its corresponding version of the `security-rule` asset, and compare the end result of the customization with the assets field's. If any of them are different, the `rule_source.is_customized` field should be set to `true`. Otherwise, it should be set to `false`. + +Notice that this can therefore result in a two-way operation: a prebuilt rule that is non-customized can end up as being customized (`is_customized: true`), while a rule that is customized at the beggining of the operation can result in a non-customized rule after the modification (if the changes made by the user make the rule match its base version). + +The rule's fields that should be taken into account to determine if the rule has been customized are any of the fields in `BaseRequiredFields`, `BaseOptionalFields` or `BaseDefaultableFields` from the rule schema with the exception of: + +- exceptions +- actions (not part of `security-rule` asset for now anyways) +- `author` and `license` (which shouldn't be customizable anyways) +- `output_index` and `namespace` (deprecated) +- `meta` (to be deprecated) + +In the case of exceptions, all type of changes related to rule exceptions should be ignored during the calculation of `is_customized`: + +- a new shared exception list is added to the rule +- a shared exception list is removed from the rule +- an exception item is added to the rule's shared exception list +- a default exception list is created for the rule and an exception is added to it +- an exception item is removed from the rule's default exception list + +The following use cases should be covered in the calculation of `is_customized`: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseCurrent state of rulesecurity-rule assetPUT Endpoint payloadOutput
    Modified field value diverges from base asset +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: false,
    +    ...
    +  }
    +}
    +
    +
    +
    +{
    +  name: "Original name",
    +}
    +
    +
    +{
    +  name: "My custom name",
    +}
    +
    +
    +{
    +  name: "My custom name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: true,
    +    ...
    +  }
    +}
    +
    +
    New field added, not existing in base asset +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: false,
    +    ...
    +  }
    +}
    +
    +
    +
    +{
    +  name: "Original name",
    +}
    +
    +
    +{
    +  name: "Original name",
    +  note: "My investigation guide",
    +}
    +
    +
    +{
    +  name: "Original name",
    +  note: "My investigation guide",
    +  rule_source: {
    +    type: "external",
    +    is_customized: true,
    +    ...
    +  }
    +}
    +
    +
    Modified matches value in base asset +
    +{
    +  name: "My custom name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: true,
    +    ...
    +  }
    +}
    +
    +
    +
    +{
    +  name: "Original name",
    +}
    +
    +
    +{
    +  name: "Original name",
    +}
    +
    +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: false,
    +    ...
    +  }
    +}
    +
    +
    Field existing in base asset is removed +
    +{
    +  name: "Original name",
    +  "tags": ["Linux", "Windows"]
    +  rule_source: {
    +    type: "external",
    +    is_customized: false,
    +    ...
    +  }
    +}
    +
    +
    +
    +{
    +  name: "Original name",
    +  "tags": ["Linux", "Windows"]
    +}
    +      
    +
    +
    +{
    +  name: "Original name",
    +}
    +      
    +
    +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: true,
    +    ...
    +  }
    +}
    +
    +
    Edge case: base asset not found +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: false,
    +    ...
    +  }
    +}
    +
    +
    +
    Not found
    +
    +
    +{
    +  name: "Original name",
    +}
    +
    +
    +{
    +  name: "Original name",
    +  rule_source: {
    +    type: "external",
    +    is_customized: true,
    +    ...
    +  }
    +}
    +
    +
    + +Notice the last scenario from the table, which deals with the edge case of the corresponding version of the `security-rule` asset not being found. This would prevent from doing a comparison of the fields to calculate if the rule should be considered customized or not. + +Scenarios in which this could happen are: + +- A user manually deletes package and assets +- A user imports a prebuilt rule with matching `rule_id` but no matching version (base version missing) +- A user imports a prebuilt rule from a newer version of Kibana and the Elastic prebuilt rules package into an older version of Kibana where that `version` of the rule does not exist or hasn't been created yet. + +So, if the corresponding rule asset is not found, do not attempt to do any comparisons and mark the rule as `is_customized: true`; ignoring the current values of the rules, the payload and the end result. + +Reasons: +- A prebuilt rule which is being modified has a much higher chance of ending up as `is_customized: true` than `false`. Given that we cannot know this for certain, marking it as customized is the best educated guess. +- If we ended up making a wrong assumption in that previous point, it can be corrected the next time the rule is upgraded, or if the rule is modified again and the rule asset is found this time. +- A rule which is missing its base version makes more sense being customized than non-customized from a domain-modelling point of view. +- The alternative of rejecting the update on a simple field name change is just bad UX: a user just wants to change a rule's name and probably doesn't care that the corresponding `security-rule` asset is not installed. + +### In the UI + +The current behaviour of the app allows to modify a rule's fields in the following ways: + +#### Via the Rule Edit Page + +The **Rule Edit Page** is currently split into four tabs: + +| Tab | Contains fields| +| -------------- | -------------- | +| **Definition** | - Rule type (cannot be changed)
    - Data Source
    - Query
    - Machine Learning job (ML rules only)
    - Anomaly score threshold (ML rules only)
    - Group by (threshold rules only)
    - Count (cardinality) (threshold rules only)
    - Indicator index patterns (indicator match rules only)
    - Indicator index query (indicator match rules only)
    - Indicator mapping (indicator match rules only)
    - New terms fields (new term rules only)
    - History window size (new terms rules only)
    - Alert Suppression (for custom query and threshold rules only)
    - Timeline Template | +| **About** | - Name
    - Description
    - Severity
    - Severity override
    - Risk score
    - Risk score override
    - Tags
    - Reference URLs
    - False positive examples
    - MITRE ATT&CK™ threats
    - Custom highlighted fields
    - Investigation guide
    - Author
    - License
    - Elastic Endpoint exceptions
    - Building block
    - Rule name override
    - Timestamp override| +| **Schedule** | - Interval
    - Lookback time| +| **Actions** | - Actions
    - Response actions (custom query rules only)| + +Out of these four tabs, only **Actions** is enabled and accessible when editing a prebuilt rule - since actions (and shared exceptions lists and snoozing) are the only fields that can currently be modified for prebuilt rules from the UI. + +All of the fields in the UI, listed above, are currently editable for custom rules, except for rule type, which is read only. + +Once done editing the rule, the user clicks on the "Save Changes" button, which calls the **Update Rule** - `PUT /rules` endpoint, passing the payload for the whole rule. + +**Expected behaviour for customizing prebuilt rules** + +- All four tabs of the Rule Edit page should be enabled, and all the fields within each tab should be editable, as they currently are for custom rules. +- The only fields in the UI that should not be customizable are: **Rule Type**, **Author** and **License**, which should continue to be read-only. +- **Definition** should be the default open tab when opening the edit rule page for a prebuilt rule (current default is **Actions**) +- Field validation should continue to work as it does for custom rules. +- No fields should return a validation error for the values that come from the `security_detection_engine` package with prebuilt rules. This means that a user should be able to successfully save any stock prebuilt rule with no changes. + +#### Via the Rule Management page + +The existing filter in the Rules table should be updated so that rules can be filtered by: +- custom rules +- non-customized prebuilt rules +- customized prebuilt rules + +#### Via Bulk Actions + +Custom rules can currently be updated via the Rule Table's **Bulk Actions**, which uses the **Bulk Actions** - `POST /rules/_bulk_action` endpoint. + +Apart from enabling/disabling a rule - the only other action that modifies a rule's saved object and is currently possible for prebuilt rules - the user can use bulk actions to: + +- Add, delete and overwrite **index patterns** +- Add, delete and overwrite **tags** +- Add and overwrite **rule actions** +- Update the rule's **schedule: interval and lookback time** +- Select a **timeline template** for the rule + +As explained above, the UI validates that the five actions listed above are only possible to custom rules by using the `dryRun` mode of the **bulk actions** endpoint. If any of the selected rules in the request payload is a prebuilt rule, a message is displayed to the user informing them that modifying prebuilt rules is not possible, and that rule is removed from the subsequent request that is made in normal mode to actually edit the rule. + +**Expected behaviour for customizing prebuilt rules** + +- The Bulk Actions UI should now allow users to edit prebuilt rules. +- All bulk actions listed above should now be applicable to prebuilt rules (This means that the changes in the API for the validation done in `dryRun` mode should not remove the rules from the payload anymore). + +> The `dryRun` mode request will still be necessary since we perform other checks that can still prevent prebuilt rules from being edited. For example, Machine Learning and ES|QL rules cannot be bulk edited to add or delete index patterns, since they don't have that field in their schema. + +#### Via the Rules Details Page + +The Rules Details page allows the user to modify the rule in two ways: + +- enable/disabling + - uses `POST /rules/_bulk_action` endpoint with enable/disable action +- setting rule snoozing + - uses `POST /alerting/rule/{rule_id}/_snooze` endpoint + +Both of these actions are already possible for prebuilt rules. + +- The Rule Details page should include a text field that lets the user know if the current rules is **custom**, **Elastic prebuilt** and **customized Elastic prebuilt**. + +#### Via the Shared Exception Lists page + +The Shared Exception Lists page allows a user to create shared exception lists and then attach them to (or remove them from) a user's security rules. + +This page calls the **Patch Rule** - `PATCH /rules` endpoint to modify only the `exceptions_list` field of a rule saved object. Since a user can append an exception list to multiple rules via the UI, the endpoint is called multiple times simultaneously, one for each rule that is attached to or removed from. + +There is no validation regarding prebuilt rules in the UI for this use case: both the endpoint and the application currently allow the user to attach exceptions lists to both custom and prebuilt rules. + +This means that **no changes will be needed in this page.** + +#### Via the Stack Management > Rules UI + +The Stack Management Rules UI provides a unified view across the Elastic stack, showing not only security rules, but also other types such as observability, ML, etc. + +All rules listed here can be modified in the following ways: + +- enabling and disabling +- snoozing/unsnoozing or scheduling/unscheduling snooze +- updating their API keys +- deleting them + +All of these actions are currently applicable for both prebuilt security rules as well as custom security rules, and they use the Alerting Framework endpoints of: + +- `POST /alerting/rules/_bulk_edit` +- `PATCH /alerting/rules/_bulk_delete` + +This means that **no changes will be needed in this page.** + +## Design Discussion link + +For an up-to-date discussion on the design changes needed for Milestone 3, please see [this ticket](https://github.com/elastic/kibana/issues/178211). + + +## Upgrading Prebuilt Rules + +### Changes to `/upgrade/_perform` endpoint + +The endpoint's currently implemented contract needs to be updated as described in this [PoC](https://github.com/elastic/kibana/pull/144060). + +### Changes to `/upgrade/_review` endpoint + +The endpoint currently implemented contract needs to be updated as described in this [PoC](https://github.com/elastic/kibana/pull/144060). + +### Concrete field diff algorithms by type + +The algorithm used in the `/upgrade/_review` endpoint for calculating rule version diffs' core structure is [fully implemented](https://github.com/elastic/kibana/pull/148392) and operational. However, the current method for calculating field differences is basic: it currently simply compares field values across versions and flags a conflict if the base version, the current version and the target versions differ from one another. In this conflict scenario, the `mergedVersion` of the field proposed by the algorithm always equals the `targetVersion`. + +We propose developing more adaptable diff algorithms tailored to specific rule fields or rule field types. These more specific algorithms aim to minimize conflicts and automate merging of changes, doing the best effort to keep the intended customizations applied by the user, as well as the updates proposed by Elastic. Hopefully, the user will be able to simply review the proposal and accept it. + +In general, for all types of fields, we will follow the heuristic: + +- if `target` === `base` && `current` !== `base`, we set merge proposal to be the current version, without a conflict +- if `current` === `base` && `target` !== `base`, we set merge proposal to be the target version, without a conflict +- if `base` !== `current` !== `target`: mark the diff as a conflict AND: + - **if conflict is non-solvable**: use the `current` version as the merge proposal + - **if conflict is solvable** use the generated merged version as the merge proposal (possible only in a few types, detailed below - see tables) + +Depending on the specific field or type of field we might want to apply a specific merging algorithm when conflicts arise. Let's propose different types. + +#### Single-line string fields + +> Examples: `name`, `query` + +For single-line string fields we will continue to use the existing simple diff algorithm, with all non-solvable scenarios in case of conflict, because: +- Merging keywords (especially enums) should never be done, because it could generate an invalid value. +- Changes to a rule's name might indicate some semantical changes to the whole rule (e.g. related to its source data, query/filters logic, etc). So, if both Elastic and user changed the name of the same rule, this could be an indication that the two versions of these rule are not compatible with each other, and the changes need to be reviewed by the user. Generating a conflict in this case would help the user to pay attention to all the changes. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseBase versionCurrent versionTarget versionMerged version (output)Conflict
    No customization, no updates (AAA)My rule nameMy rule nameMy rule nameMy rule nameNO
    User customization, no updates (ABA)My rule nameMy CUSTOM rule nameMy rule nameMy CUSTOM rule nameNO
    No customization, upstream update (AAB)My rule nameMy rule nameMy UPDATED rule nameMy UPDATED rule nameNO
    Customization and upstream update match (ABB)My rule nameMy GREAT rule nameMy GREAT rule nameMy GREAT rule nameNO
    Customization and upstream update conflict (ABC)My rule nameMy GREAT rule nameMy EXCELLENT rule nameMy GREAT rule nameNON_SOLVABLE
    + + +#### Multi-line string fields + +> Examples: `description`, `setup`, `note` (Investigation guide) + +For multi-line string fields, in case of scenarios where the `base`, `current` and `target` versions are different, the scenario is marked as conflict. +However, in some cases the merged proposal can be successfully calculated and solved, while in other cases not. + +These two types of scenarios are found in the last two rows of the table, but let's see an example of each in detail: + +**Solvable conflict** +**BASE:** +``` +My description. +This is a second line. +``` +**CURRENT** +``` +My GREAT description. +This is a second line. +``` +**TARGET** +``` +My description. +This is a second line, now longer. +``` + +Using a diffing library such as `nodeDiff3`, we can attempt to create a merge proposal out of the 3 versions: +```ts +const nodeDiff3 = require("node-diff3"); +const base = "My description. \nThis is a second line."; +const current = "My GREAT description. \nThis is a second line."; +const target = "My description. \nThis is a second line, now longer."; + +const nodeDiff3.diff3Merge(current, base, target) // Order is not a typo, that's how the library works + +// OUTPUTS: +// [ +// { +// ok: [ +// 'My', 'GREAT', +// 'description.', 'This', +// 'is', 'a', +// 'second', 'line,', +// 'now', 'longer.' +// ] +// } +// ] +``` +The library is able to solve the changes of the two sentences individually and produces an acceptable merge proposal. We should still mark it as a conflict to drive the user's attention to the result and allow them to decide if it makes sense or not. + +**Non-Solvable conflict** +**BASE:** +``` +My description. +This is a second line. +``` +**CURRENT** +``` +My GREAT description. +This is a third line. +``` +**TARGET** +``` +My EXCELLENT description. +This is a fourth. +``` + +```ts +const base = "My description. \nThis is a second line."; +const current = "My GREAT description. \nThis is a third line."; +const target = "My EXCELLENT description. \nThis is a fourth line."; + +nodeDiff3.diff3Merge(current, base, target); + +// OUTPUTS: +// [ +// { ok: [ 'My' ] }, +// { +// conflict: { a: [Array], aIndex: 1, o: [], oIndex: 1, b: [Array], bIndex: 1 } +// }, +// { ok: [ 'description.', 'This', 'is', 'a' ] }, +// { +// conflict: { +// a: [Array], +// aIndex: 6, +// o: [Array], +// oIndex: 5, +// b: [Array], +// bIndex: 6 +// } +// }, +// { ok: [ 'line.' ] } +// ] +``` +The library marks multiple sections of the string as conflicts, since the same sentences have diverged in different way in the current and target version from the original base version. + +Since in this kind of scenarios we cannot provide a satisfactory merge proposal, we will mark it as a conflict and propose the `current` version as the `merge` version. + +In summary: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseBase versionCurrent versionTarget versionMerged version (output)Conflict
    No customization, no updates (AAA)
    My description. 
    This is a second line.
    My description. 
    This is a second line.
    My description. 
    This is a second line.
    My description. 
    This is a second line.
    NO
    User customization, no updates (ABA)
    My description. 
    This is a second line.
    My CUSTOM description. 
    This is a second line.
    My description. 
    This is a second line.
    My CUSTOM description. 
    This is a second line.
    NO
    No customization, upstream update (AAB)
    My description. 
    This is a second line.
    My description. 
    This is a second line.
    My UDPATED description. 
    This is a second line.
    My UDPATED description. 
    This is a second line.
    NO
    Customization and upstream update match (ABB)
    My description. 
    This is a second line.
    My GREAT description. 
    This is a second line.
    My GREAT description. 
    This is a second line.
    My GREAT description. 
    This is a second line.
    NO
    Customization and upstream update solvable conflict (ABC)
    My description. 
    This is a second line.
    My GREAT description. 
    This is a second line.
    My description. 
    This is a second line, now longer.
    My GREAT description. 
    This is a second line, now longer.
    SOLVABLE
    Customization and upstream update non-solvable conflict (ABC)
    My description. 
    This is a second line.
    My GREAT description. 
    This is a third line.
    My EXCELLENT description. 
    This is a fourth line.
    My GREAT description. 
    This is a third line.
    NON_SOLVABLE
    + + + +#### Number fields + +> Examples: `risk_score`, `max_signals` + +Number fields should be treated as a whole unit, i.e. not breakable by digits. Therefore, there is only one possibility of conflicts, the scenario (A B C), which is not solvable. In that case, **keep the current version** with the user customization. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseBase versionCurrent versionTarget versionMerged version (output)Conflict
    No customization, no updates (AAA)10101010NO
    User customization, no updates (ABA)10151015NO
    No customization, upstream update (AAB)10101515NO
    Customization and upstream update match (ABB)10202020NO
    Customization and upstream update conflict (ABC)10203020NON_SOLVABLE
    + +#### Array of scalar value (strings/numbers) fields + +> Examples: `index`, `tags`, `references`, + +For **arrays of scalar values** fields, we can create a Set-based logic to caclulate what the additions and removals where applied to the `base` version onto the `current` and `target` versions and do set manipulations to get a merged version. + +For example: + +**base**: [linux, network] +**current**: [windows, host] +**target**: [linux, ml] +**expected output**: [windows, host, ml] + +The logic is as follows: + +Changes to **current** compared against **base**: +- Added: [windows, host] +- Removed: [linux, network] + + +Changes to **target** compared against **base**: +- Added: [ml] +- Removed: [network] + +Combining both modifications: +- Added: [windows, host, ml] +- Removed: [linux, network] (which elements were removed in both?) + +Applying these combined modifications to base results in: +- **[windows, host, ml]** + +This logic can be achieved using built-in Javascript `Set` logic: + +```js +const base = new Set(["linux", "network"]); +const current = new Set(["windows", "host"]); +const target = new Set(["linux", "ml"]); +const output = new Set(["windows", "host", "ml"]); + + +const addedCurrent = current.difference(base); // [windows, host] +const removedCurrent = base.difference(current); // [linux, network] + +const addedTarget = target.difference(base); // [ml] +const removedTarget = base.difference(target); // [network] + +const bothAdded = addedCurrent.union(addedTarget); // [network] +const bothRemoved = removedCurrent.union(removedTarget); // [network] + +const merged = base + .union(addedTarget) + .difference(bothRemoved); + +// Results in: [windows, host, ml] +``` + +The possible scenarios are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseBase versionCurrent versionTarget versionMerged version (output)Conflict
    No customization, no updates (AAA)[linux,network][linux,network][linux,network][linux,network]NO
    User customization, no updates (ABA)[linux,network][windows, host][linux,network][windows, host]NO
    No customization, upstream update (AAB)[linux,network][linux,network][windows, host][windows, host]NO
    Customization and upstream update match (ABB)[linux,network][linux,ml][linux,ml][linux,ml]NO
    Customization and upstream update conflict (ABC)[linux,network][windows, host][linux, ml][windows, host, ml]SOLVABLE
    + +Notice that with this logic we would never mark a merge scenario as a conflict. + + +#### Array of objects fields + +> Examples: `related_integrations,` `required_fields` + +Since the properties in each object within the array are highly dependent on one another, the whole object should be treated as a block, and not attempt to diff or merge changes to individual fields within each element. + +For example: in a `required_fields` update, if the `type` is updated from `unknown` in the base version to `keyword` in the `target` version, but in the same object the user has updated the base `name` of the field, the change of type will have a high probability of not making sense anymore - there is no way of knowing if the change proposed by Elastic will also apply to the field name that the user is now referring through its customization. + +Therefore, to calculate a merged version, we will use a similar approach to the one used for "Array of strings", but instead of using `Set` logic, we will use `Maps` so that we can keep track of each objects based on an `id` and thus carry out algebraic operations on them to arrive to a merged version. + +The `id` will vary depending on the type of the field: + +|Field|Example object|Key used as `id`| +|---|---|---| +| `required_fields` | `{ ecs: true, name: 'host.name', type: 'keyword' }` | `name` | +| `related_integrations` | `{ "package": "aws", "version": "^2.0.0", "integration": "cloudtrail" }` | `package`+`integration` | + +---- +As an example - `A`, `B` and `C` are the keys of the objects in the array, and `modified` means that an object kept it's key id value, but some other propery of the object was modified: + +**base**: [`A`, `B`] +**current**: [`modified B `, `C`] +**target**: [`modified B`, `D`] + +The logic is as follows: + +Changes to **current** compared against **base**: +- Added: [`C`] +- Removed: [`A`] +- Modified: [`B`] + +Changes to **target** compared against **base**: +- Added: [`D`] +- Removed: [`A`] +- Modified: [`B`] + +In combination: +- Added: [`C`, `D`] (no conflicts) +- Removed: [`A`] (no conflicts) +- Modified: [`B`] (no conflict ONLY if the 2 objects were modified in exactly the same way) + +So there are two possible results: + +- No conflict: [`B`, `C`, `D`] +- Conflict: no acceptable merge proposal can be built, mark as `conflict` and propose the `current` version + + +---- +The possible scenarios are: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Use caseBase versionCurrent versionTarget versionMerged version (output)Conflict
    No customization, no updates (AAA)
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    NO
    User customization, no updates (ABA)
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]      
    +      
    NO
    No customization, upstream update (AAB)
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]    
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]    
    +      
    NO
    Customization and upstream update match (ABB)
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]    
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]    
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.ip",
    +    type: "ip"
    +  },
    +]    
    +      
    NO
    Customization and upstream update solvable conflict (ABC)

    Object A modified in matching way
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  },
    +  {
    +    ecs: false,
    +    name: "host.os.type",
    +    type: "keyword"
    +  },
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "new.field.name",
    +    type: "keyword"
    +  },
    +]    
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "new.field.ip",
    +    type: "ip"
    +  },
    +]   
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +    {
    +    ecs: false,
    +    name: "new.field.name",
    +    type: "keyword"
    +  },
    +  {
    +    ecs: false,
    +    name: "new.field.ip",
    +    type: "ip"
    +  },
    +]
    +      
    SOLVABLE
    Customization and upstream update non-solvable conflict (ABC)

    Object A modified in diverging ways, propose current version
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "unknown"
    +  }
    +]      
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  },
    +]    
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "string"
    +  },
    +]   
    +      
    +[
    +  {
    +    ecs: true,
    +    name: "event.action",
    +    type: "keyword"
    +  }
    +]
    +      
    NON_SOLVABLE
    + +### Changes to Rule Upgrade UX/UI flow + +#### Bulk accepting upgrades with no conflicts + +Making prebuilt rules customizable, plus the changes introduced to the `/upgrade/_review` update described above means that the Upgrade Review endpoint will now determine that some of the rules have `CONFLICT`s that cannot be automatically resolved (the current behaviour is updating all rules to their `target` version). + +However, since we still want to give the users the ability to update all of their rules that have updates with no conflicts in an easy and fast way, we need to introduce a distinct UI that allows for this behaviour. + +The current UI of the **Rule Updates** page has an button with the label "Update all" which currently simply updates all rules to their `target` version. + +We can replace this button for an **Update rules with no conflicts** button. Clicking this button would make a request to `/upgrade/_perform` with a payload that includes only rules that don't have non-solvable conflicts. That payload can be built out of the response of the `/upgrade/_review` endpoint, including ids of such rules and specifying that all rules should be updated to their `MERGED` version. + +```ts +// [PSEUDOCODE] +const reviewUpgradeResponse: ReviewRuleUpgradeResponseBody = await fetch( + '/internal/detection_engine/prebuilt_rules/upgrade/_review', + { method: 'POST' } +); + +// Filter out rules with conflicts, and create payload pointing all to 'MERGE' version +const performUpgradePayload = { + mode: 'SPECIFIC_RULES', + rules: reviewUpgradeResponse.rules + .filter((rule) => !rule.diff.has_conflict) + .map((rule) => ({ + rule_id: rule.rule_id, + revision: rule.revision, + version: rule.target_rule.version, + })), + pick_version: 'MERGE', +}; + + +const performUpgradeResponse: PerformRuleUpgradeResponseBody = await fetch( + '/internal/detection_engine/prebuilt_rules/upgrade/_perform', + { method: 'POST', body: performUpgradePayload } +); +``` + +#### Upgrading rules with conflicts + +Rules whose diffing algorithm resulted in a `CONFLICT` need to be manually resolved or confirmed by the user via the UI before making the API request to upgrade the rule. + +> See [Three-Way-Diff Component ticket](https://github.com/elastic/kibana/issues/171520) that details UI for solving conflicts. + +> See [designs](https://www.figma.com/file/gLHm8LpTtSkAUQHrkG3RHU/%5B8.7%5D-%5BRules%5D-Rule-Immutability%2FCustomization?type=design&mode=design&t=LkauhLzUKUatF6cL-0#712870904). + + + + + + + diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx index ba909390aa3fbc..1f428bc32795cc 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/data_table/index.test.tsx @@ -77,7 +77,8 @@ const getTimelineFromStore = ( return store.getState().timeline.timelineById[timelineId]; }; -describe('unified data table', () => { +// FLAKY: https://github.com/elastic/kibana/issues/179843 +describe.skip('unified data table', () => { beforeEach(() => { (useSourcererDataView as jest.Mock).mockReturnValue(mockSourcererScope); }); @@ -91,8 +92,7 @@ describe('unified data table', () => { SPECIAL_TEST_TIMEOUT ); - // FLAKY: https://github.com/elastic/kibana/issues/179843 - describe.skip('custom cell rendering based on data Type', () => { + describe('custom cell rendering based on data Type', () => { it( 'should render source.ip as link', async () => { diff --git a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts index fa435135681f14..6f80a018319fa8 100644 --- a/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts +++ b/x-pack/plugins/security_solution/server/endpoint/endpoint_app_context_services.ts @@ -25,7 +25,7 @@ import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { FleetActionsClientInterface } from '@kbn/fleet-plugin/server/services/actions/types'; import type { PluginStartContract as ActionsPluginStartContract } from '@kbn/actions-plugin/server'; import type { ResponseActionsClient } from './services'; -import { getResponseActionsClient } from './services'; +import { getResponseActionsClient, NormalizedExternalConnectorClient } from './services'; import { getAgentPolicyCreateCallback, getAgentPolicyUpdateCallback, @@ -290,43 +290,26 @@ export class EndpointAppContextService { throw new EndpointAppContentServicesNotStartedError(); } - let connectorActionsClient = - this.startDependencies.connectorActions.getUnsecuredActionsClient(); - - // If we have a task id and type, then call is coming from a background task and we need to use those - // values with the Action's plugin `UnsecuredActionsClient`'s `.execute()` method. To do so in a - // transparent way to the existing response action client, we create a Proxy here and trap the - // `GET execute` property and wrap it a function that will automatically inject this data into - // `execute()` calls - if (taskId && taskType) { - connectorActionsClient = new Proxy(connectorActionsClient, { - get(target, prop, receiver) { - if (prop === 'execute') { - return function (execArgs: Parameters[0]) { - return target.execute({ - ...execArgs, - relatedSavedObjects: [ - ...(execArgs.relatedSavedObjects ?? []), - { - id: taskId, - type: taskType, - }, - ], - }); - }; - } - - return Reflect.get(target, prop, receiver); - }, - }); - } - return getResponseActionsClient(agentType, { endpointService: this, esClient: this.startDependencies.esClient, username, isAutomated: true, - connectorActions: connectorActionsClient, + connectorActions: new NormalizedExternalConnectorClient( + this.startDependencies.connectorActions.getUnsecuredActionsClient(), + this.createLogger('responseActions'), + { + relatedSavedObjects: + taskId && taskType + ? [ + { + id: taskId, + type: taskType, + }, + ] + : undefined, + } + ), }); } diff --git a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts index add8b6ea17ec2b..82cf8eeb103114 100644 --- a/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts +++ b/x-pack/plugins/security_solution/server/endpoint/routes/actions/response_actions.ts @@ -9,7 +9,7 @@ import type { TypeOf } from '@kbn/config-schema'; import { responseActionsWithLegacyActionProperty } from '../../services/actions/constants'; import { stringify } from '../../utils/stringify'; -import { getResponseActionsClient } from '../../services'; +import { getResponseActionsClient, NormalizedExternalConnectorClient } from '../../services'; import type { ResponseActionsClient } from '../../services/actions/clients/lib/types'; import { CustomHttpRequestError } from '../../../utils/custom_http_request_error'; import type { @@ -320,7 +320,7 @@ function responseActionRequestHandler { let options: GetResponseActionsClientConstructorOptions; @@ -19,7 +18,7 @@ describe('getResponseActionsClient()', () => { beforeEach(() => { options = { ...responseActionsClientMock.createConstructorOptions(), - connectorActions: sentinelOneMock.createConnectorActionsClient(), + connectorActions: responseActionsClientMock.createNormalizedExternalConnectorClient(), }; }); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts index a01fd7a56d638d..351b015621320d 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/index.ts @@ -8,5 +8,5 @@ export * from './endpoint/endpoint_actions_client'; export * from './sentinelone/sentinel_one_actions_client'; export * from './get_response_actions_client'; - export * from './lib/types'; +export * from './lib/normalized_external_connector_client'; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.test.ts index 5c9d6154226e8b..4190224c592c14 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.test.ts @@ -24,6 +24,21 @@ describe('`NormalizedExternalConnectorClient` class', () => { executeInputOptions = { params: { subAction: 'sub-action-1', subActionParams: {} } }; }); + it.each([ + ['getAll', ['space-1']], + ['execute', [{ spaceId: 'space-1', params: {} }]], + ])('should error if %s() is called prior calling .setup()', async (methodName, methodArgs) => { + const testInstance = new NormalizedExternalConnectorClient( + unsecuredActionsClientMock.create(), + logger + ); + + await expect( + // @ts-ignore ignoring args and method name since we are only trying to validate that it errors out + testInstance[methodName](...methodArgs) + ).rejects.toHaveProperty('message', 'Instance has not been .setup()!'); + }); + describe('#getConnectorInstance()', () => { let actionPluginConnectorClient: ActionsClientMock; @@ -35,10 +50,10 @@ describe('`NormalizedExternalConnectorClient` class', () => { it('should search for the connector when first API call is done', async () => { const testInstance = new NormalizedExternalConnectorClient( - 'foo', actionPluginConnectorClient, logger ); + testInstance.setup('foo'); expect(actionPluginConnectorClient.getAll).not.toHaveBeenCalled(); @@ -57,10 +72,10 @@ describe('`NormalizedExternalConnectorClient` class', () => { throw new Error('oh oh'); }); const testInstance = new NormalizedExternalConnectorClient( - 'foo', actionPluginConnectorClient, logger ); + testInstance.setup('foo'); const executePromise = testInstance.execute(executeInputOptions); await expect(executePromise).rejects.toHaveProperty( @@ -90,10 +105,10 @@ describe('`NormalizedExternalConnectorClient` class', () => { ])('should error if a connector instance %s', async (_, getResponse) => { (actionPluginConnectorClient.getAll as jest.Mock).mockResolvedValue(getResponse()); const testInstance = new NormalizedExternalConnectorClient( - 'foo', actionPluginConnectorClient, logger ); + testInstance.setup('foo'); const executePromise = testInstance.execute(executeInputOptions); await expect(executePromise).rejects.toEqual( @@ -113,10 +128,10 @@ describe('`NormalizedExternalConnectorClient` class', () => { it('should call Action Plugin client `.execute()` with expected arguments', async () => { const testInstance = new NormalizedExternalConnectorClient( - 'foo', actionPluginConnectorClient, logger ); + testInstance.setup('foo'); await testInstance.execute(executeInputOptions); expect(actionPluginConnectorClient.execute).toHaveBeenCalledWith({ @@ -139,10 +154,18 @@ describe('`NormalizedExternalConnectorClient` class', () => { it('should call Action Plugin client `.execute()` with expected arguments', async () => { const testInstance = new NormalizedExternalConnectorClient( - 'foo', actionPluginConnectorClient, - logger + logger, + { + relatedSavedObjects: [ + { + id: 'so-id-1', + type: 'so-type-1', + }, + ], + } ); + testInstance.setup('foo'); await testInstance.execute(executeInputOptions); expect(actionPluginConnectorClient.execute).toHaveBeenCalledWith({ @@ -150,6 +173,12 @@ describe('`NormalizedExternalConnectorClient` class', () => { requesterId: 'background_task', spaceId: 'default', params: executeInputOptions.params, + relatedSavedObjects: [ + { + id: 'so-id-1', + type: 'so-type-1', + }, + ], }); }); }); diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.ts index 2c0647b43ad73d..9d998a4b137b04 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/lib/normalized_external_connector_client.ts @@ -12,6 +12,7 @@ import type { ActionTypeExecutorResult } from '@kbn/actions-plugin/common'; import type { Logger } from '@kbn/logging'; import type { ConnectorWithExtraFindData } from '@kbn/actions-plugin/server/application/connector/types'; import { once } from 'lodash'; +import type { RelatedSavedObjects } from '@kbn/actions-plugin/server/lib'; import { stringify } from '../../../../utils/stringify'; import { ResponseActionsClientError, ResponseActionsConnectorNotConfiguredError } from '../errors'; @@ -32,21 +33,19 @@ export interface NormalizedExternalConnectorClientExecuteOptions< * client interfaces. It also provides better typing support. */ export class NormalizedExternalConnectorClient { - protected readonly getConnectorInstance: () => Promise; + private connectorTypeId: string | undefined; - constructor( - protected readonly connectorTypeId: string, - protected readonly connectorsClient: ActionsClient | IUnsecuredActionsClient, - protected readonly log: Logger - ) { - this.getConnectorInstance = once(async () => { + protected readonly getConnectorInstance: () => Promise = once( + async () => { + this.ensureSetupDone(); let connectorList: ConnectorWithExtraFindData[] = []; + const connectorTypeId = this.connectorTypeId as string; try { connectorList = await this.getAll(); } catch (err) { throw new ResponseActionsClientError( - `Unable to retrieve list of stack connectors in order to find one for [${this.connectorTypeId}]: ${err.message}`, + `Unable to retrieve list of stack connectors in order to find one for [${connectorTypeId}]: ${err.message}`, // failure here is likely due to Authz, but because we don't have a good way to determine that, // the `statusCode` below is set to `400` instead of `401`. 400, @@ -54,12 +53,12 @@ export class NormalizedExternalConnectorClient { ); } const connector = connectorList.find(({ actionTypeId, isDeprecated, isMissingSecrets }) => { - return actionTypeId === this.connectorTypeId && !isDeprecated && !isMissingSecrets; + return actionTypeId === connectorTypeId && !isDeprecated && !isMissingSecrets; }); if (!connector) { this.log.debug(stringify(connectorList)); - throw new ResponseActionsConnectorNotConfiguredError(this.connectorTypeId); + throw new ResponseActionsConnectorNotConfiguredError(connectorTypeId); } this.log.debug( @@ -67,7 +66,22 @@ export class NormalizedExternalConnectorClient { ); return connector; - }); + } + ); + + constructor( + protected readonly connectorsClient: ActionsClient | IUnsecuredActionsClient, + protected readonly log: Logger, + protected readonly options?: { + /** Used by `.execute()` when the `IUnsecuredActionsClient` is passed in */ + relatedSavedObjects?: RelatedSavedObjects; + } + ) {} + + private ensureSetupDone(): void { + if (!this.connectorTypeId) { + throw new ResponseActionsClientError(`Instance has not been .setup()!`); + } } private isUnsecuredActionsClient( @@ -77,6 +91,20 @@ export class NormalizedExternalConnectorClient { return !('create' in client) && !('delete' in client) && !('update' in client); } + /** + * Sets up the class instance for use. Must be called prior to using methods of this class + * @param connectorTypeId + */ + public setup(connectorTypeId: string) { + if (this.connectorTypeId) { + throw new ResponseActionsClientError( + `setup() has already been called with connector [${connectorTypeId}]` + ); + } + + this.connectorTypeId = connectorTypeId; + } + public async execute< TResponse = unknown, TParams extends Record = Record @@ -86,6 +114,7 @@ export class NormalizedExternalConnectorClient { }: NormalizedExternalConnectorClientExecuteOptions): Promise< ActionTypeExecutorResult > { + this.ensureSetupDone(); const { id: connectorId } = await this.getConnectorInstance(); if (this.isUnsecuredActionsClient(this.connectorsClient)) { @@ -94,6 +123,7 @@ export class NormalizedExternalConnectorClient { id: connectorId, spaceId, params, + relatedSavedObjects: this.options?.relatedSavedObjects, }) as Promise>; } @@ -104,6 +134,7 @@ export class NormalizedExternalConnectorClient { } protected async getAll(spaceId: string = 'default'): ReturnType { + this.ensureSetupDone(); if (this.isUnsecuredActionsClient(this.connectorsClient)) { return this.connectorsClient.getAll(spaceId); } diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts index 39497e18f18e31..71090d5af98feb 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/mocks.ts @@ -18,6 +18,8 @@ import { merge } from 'lodash'; import type * as esTypes from '@elastic/elasticsearch/lib/api/types'; import type { TransportResult } from '@elastic/elasticsearch'; import type { AttachmentsSubClient } from '@kbn/cases-plugin/server/client/attachments/client'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import type { DeeplyMockedKeys } from '@kbn/utility-types-jest'; import type { ResponseActionsClient } from '../..'; import type { KillOrSuspendProcessRequestBody } from '../../../../../common/endpoint/types'; import { BaseDataGenerator } from '../../../../../common/endpoint/data_generators/base_data_generator'; @@ -45,6 +47,8 @@ import type { IsolationRouteRequestBody, UploadActionApiRequestBody, } from '../../../../../common/api/endpoint'; +import { NormalizedExternalConnectorClient } from '../..'; +import {} from '@kbn/utility-types-jest'; export interface ResponseActionsClientOptionsMock extends ResponseActionsClientOptions { esClient: ElasticsearchClientMock; @@ -267,6 +271,20 @@ const createConnectorActionsClientMock = ({ return client; }; +const createNormalizedExternalConnectorClientMock = ( + connectorActionsClientMock: ActionsClientMock = createConnectorActionsClientMock() +): DeeplyMockedKeys => { + const normalizedClient = new NormalizedExternalConnectorClient( + connectorActionsClientMock, + loggingSystemMock.createLogger() + ); + + jest.spyOn(normalizedClient, 'execute'); + jest.spyOn(normalizedClient, 'setup'); + + return normalizedClient as DeeplyMockedKeys; +}; + export const responseActionsClientMock = Object.freeze({ create: createResponseActionClientMock, createConstructorOptions: createConstructorOptionsMock, @@ -282,7 +300,9 @@ export const responseActionsClientMock = Object.freeze({ createIndexedResponse: createEsIndexTransportResponseMock, - // Some common mocks when working with connector actions + createNormalizedExternalConnectorClient: createNormalizedExternalConnectorClientMock, + + // Some common mocks when working with connector actions client (actions plugin) createConnectorActionsClient: createConnectorActionsClientMock, /** Create a mock connector instance */ createConnector: createConnectorMock, diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts index 2701120d1e4f08..bb51ebe917c6d1 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/mocks.ts @@ -13,11 +13,12 @@ import { import type { ActionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; import type { ConnectorWithExtraFindData } from '@kbn/actions-plugin/server/application/connector/types'; import { merge } from 'lodash'; +import type { NormalizedExternalConnectorClient } from '../../..'; import type { ResponseActionsClientOptionsMock } from '../mocks'; import { responseActionsClientMock } from '../mocks'; export interface SentinelOneActionsClientOptionsMock extends ResponseActionsClientOptionsMock { - connectorActions: ActionsClientMock; + connectorActions: NormalizedExternalConnectorClient; } const createSentinelOneAgentDetailsMock = ( @@ -176,7 +177,9 @@ const createConnectorActionsClientMock = (): ActionsClientMock => { const createConstructorOptionsMock = (): SentinelOneActionsClientOptionsMock => { return { ...responseActionsClientMock.createConstructorOptions(), - connectorActions: createConnectorActionsClientMock(), + connectorActions: responseActionsClientMock.createNormalizedExternalConnectorClient( + createConnectorActionsClientMock() + ), }; }; diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts index b2e521060edfc5..b19242e60340b9 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.test.ts @@ -10,13 +10,13 @@ import { responseActionsClientMock } from '../mocks'; import { SentinelOneActionsClient } from './sentinel_one_actions_client'; import { getActionDetailsById as _getActionDetailsById } from '../../action_details_by_id'; import { ResponseActionsNotSupportedError } from '../errors'; -import type { ActionsClientMock } from '@kbn/actions-plugin/server/actions_client/actions_client.mock'; import type { SentinelOneActionsClientOptionsMock } from './mocks'; import { sentinelOneMock } from './mocks'; import { ENDPOINT_ACTION_RESPONSES_INDEX, ENDPOINT_ACTIONS_INDEX, } from '../../../../../../common/endpoint/constants'; +import type { NormalizedExternalConnectorClient } from '../../..'; jest.mock('../../action_details_by_id', () => { const originalMod = jest.requireActual('../../action_details_by_id'); @@ -32,7 +32,7 @@ const getActionDetailsByIdMock = _getActionDetailsById as jest.Mock; describe('SentinelOneActionsClient class', () => { let classConstructorOptions: SentinelOneActionsClientOptionsMock; let s1ActionsClient: ResponseActionsClient; - let connectorActionsMock: ActionsClientMock; + let connectorActionsMock: NormalizedExternalConnectorClient; const createS1IsolationOptions = ( overrides: Omit< @@ -79,7 +79,6 @@ describe('SentinelOneActionsClient class', () => { await s1ActionsClient.isolate(createS1IsolationOptions()); expect(connectorActionsMock.execute as jest.Mock).toHaveBeenCalledWith({ - actionId: 's1-connector-instance-id', params: { subAction: 'isolateHost', subActionParams: { @@ -162,7 +161,6 @@ describe('SentinelOneActionsClient class', () => { await s1ActionsClient.release(createS1IsolationOptions()); expect(connectorActionsMock.execute as jest.Mock).toHaveBeenCalledWith({ - actionId: 's1-connector-instance-id', params: { subAction: 'releaseHost', subActionParams: { diff --git a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts index ac40e5726997c2..e674caa69c7e63 100644 --- a/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts +++ b/x-pack/plugins/security_solution/server/endpoint/services/actions/clients/sentinelone/sentinel_one_actions_client.ts @@ -5,7 +5,6 @@ * 2.0. */ -import type { ActionsClient, IUnsecuredActionsClient } from '@kbn/actions-plugin/server'; import { SENTINELONE_CONNECTOR_ID, SUB_ACTION, @@ -15,8 +14,10 @@ import type { SentinelOneGetAgentsParams, SentinelOneGetAgentsResponse, } from '@kbn/stack-connectors-plugin/common/sentinelone/types'; -import type { NormalizedExternalConnectorClientExecuteOptions } from '../lib/normalized_external_connector_client'; -import { NormalizedExternalConnectorClient } from '../lib/normalized_external_connector_client'; +import type { + NormalizedExternalConnectorClientExecuteOptions, + NormalizedExternalConnectorClient, +} from '../lib/normalized_external_connector_client'; import type { CommonResponseActionMethodOptions, ProcessPendingActionsMethodOptions, @@ -34,7 +35,7 @@ import type { import { ResponseActionsClientImpl } from '../lib/base_response_actions_client'; export type SentinelOneActionsClientOptions = ResponseActionsClientOptions & { - connectorActions: ActionsClient | IUnsecuredActionsClient; + connectorActions: NormalizedExternalConnectorClient; }; export class SentinelOneActionsClient extends ResponseActionsClientImpl { @@ -43,11 +44,8 @@ export class SentinelOneActionsClient extends ResponseActionsClientImpl { constructor({ connectorActions, ...options }: SentinelOneActionsClientOptions) { super(options); - this.connectorActionsClient = new NormalizedExternalConnectorClient( - SENTINELONE_CONNECTOR_ID, - connectorActions, - this.log - ); + this.connectorActionsClient = connectorActions; + connectorActions.setup(SENTINELONE_CONNECTOR_ID); } protected async writeActionRequestToEndpointIndex( diff --git a/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-meta-telemetry-request.json b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-meta-telemetry-request.json new file mode 100644 index 00000000000000..2d9951d1c1dc27 --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-meta-telemetry-request.json @@ -0,0 +1,874 @@ +{ + "@timestamp": "2024-02-23T08:47:03.036Z", + "cluster_uuid": "PanARIslSNC5x-B-ttgunw", + "cluster_name": "es-test-cluster", + "license_id": "b15da743-9adb-45fa-9258-dcecad41d1e4", + "endpoint_id": "123", + "endpoint_version": "8.6.2", + "endpoint_package_version": null, + "endpoint_metrics": { + "cpu": { + "histogram": { + "counts": [3934326, 520, 140, 110, 212, 78, 41, 18, 12, 25, 9, 5, 5, 2, 0, 0, 0, 0, 0, 0], + "values": [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100] + }, + "mean": 0.2697424700222798, + "latest": 0.1 + }, + "memory": { + "mean": 373780821, + "latest": 411860992 + }, + "uptime": { + "endpoint": 26882599, + "system": 26883343 + }, + "documentsVolume": { + "file_events": { + "suppressed_count": 1651293, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "process_events": { + "suppressed_count": 0, + "suppressed_bytes": 0, + "sent_count": 11026887, + "sent_bytes": 23412176619 + }, + "network_events": { + "suppressed_count": 3270009, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "overall": { + "suppressed_count": 4921302, + "suppressed_bytes": 0, + "sent_count": 11026887, + "sent_bytes": 23412176619 + } + }, + "maliciousBehaviorRules": [ + { + "id": "123", + "endpoint_uptime_percent": 0 + } + ], + "systemImpact": [ + { + "process": { + "executable": "/usr/sbin/sshd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 304 + }, + "process_events": { + "week_idle_ms": 31791, + "week_ms": 110821 + }, + "network_events": { + "week_idle_ms": 2030, + "week_ms": 53 + }, + "overall": { + "week_idle_ms": 33821, + "week_ms": 111178 + } + }, + { + "process": { + "executable": "unknown" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 4552 + }, + "overall": { + "week_idle_ms": 0, + "week_ms": 4552 + } + }, + { + "file_events": { + "week_idle_ms": 130, + "week_ms": 7 + }, + "process": { + "executable": "/lib/systemd/systemd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 1920 + }, + "process_events": { + "week_idle_ms": 1273, + "week_ms": 1750 + }, + "overall": { + "week_idle_ms": 1403, + "week_ms": 3677 + } + }, + { + "file_events": { + "week_idle_ms": 7, + "week_ms": 0 + }, + "process": { + "executable": "/bin/systemctl" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 3055 + }, + "process_events": { + "week_idle_ms": 0, + "week_ms": 9 + }, + "overall": { + "week_idle_ms": 7, + "week_ms": 3064 + } + }, + { + "file_events": { + "week_idle_ms": 3104, + "week_ms": 1 + }, + "process": { + "executable": "/usr/bin/apt-key" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 61 + }, + "process_events": { + "week_idle_ms": 178857, + "week_ms": 2062 + }, + "overall": { + "week_idle_ms": 181961, + "week_ms": 2124 + } + }, + { + "process": { + "executable": "/usr/bin/gce_workload_cert_refresh" + }, + "process_events": { + "week_idle_ms": 230, + "week_ms": 1405 + }, + "network_events": { + "week_idle_ms": 135, + "week_ms": 21 + }, + "overall": { + "week_idle_ms": 365, + "week_ms": 1426 + } + }, + { + "process": { + "executable": "/usr/bin/apt-config" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 65 + }, + "process_events": { + "week_idle_ms": 18708, + "week_ms": 840 + }, + "overall": { + "week_idle_ms": 18708, + "week_ms": 905 + } + }, + { + "process": { + "executable": "/usr/lib/apt/apt.systemd.daily" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 273 + }, + "process_events": { + "week_idle_ms": 1064, + "week_ms": 352 + }, + "overall": { + "week_idle_ms": 1064, + "week_ms": 625 + } + }, + { + "process": { + "executable": "/usr/bin/dpkg" + }, + "process_events": { + "week_idle_ms": 11479, + "week_ms": 558 + }, + "overall": { + "week_idle_ms": 11479, + "week_ms": 558 + } + }, + { + "process": { + "executable": "/usr/sbin/cron" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 80 + }, + "process_events": { + "week_idle_ms": 270, + "week_ms": 451 + }, + "overall": { + "week_idle_ms": 270, + "week_ms": 531 + } + }, + { + "process": { + "executable": "/usr/bin/cmp" + }, + "process_events": { + "week_idle_ms": 39452, + "week_ms": 513 + }, + "overall": { + "week_idle_ms": 39452, + "week_ms": 513 + } + }, + { + "file_events": { + "week_idle_ms": 144, + "week_ms": 0 + }, + "process": { + "executable": "/sbin/dhclient-script" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 251 + }, + "process_events": { + "week_idle_ms": 2412, + "week_ms": 186 + }, + "overall": { + "week_idle_ms": 2556, + "week_ms": 437 + } + }, + { + "process": { + "executable": "/usr/bin/env" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 413 + }, + "process_events": { + "week_idle_ms": 45, + "week_ms": 4 + }, + "overall": { + "week_idle_ms": 45, + "week_ms": 417 + } + }, + { + "process": { + "executable": "/usr/bin/cat" + }, + "process_events": { + "week_idle_ms": 39679, + "week_ms": 359 + }, + "overall": { + "week_idle_ms": 39679, + "week_ms": 359 + } + }, + { + "process": { + "executable": "/bin/sh" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 35 + }, + "process_events": { + "week_idle_ms": 444, + "week_ms": 197 + }, + "overall": { + "week_idle_ms": 444, + "week_ms": 232 + } + }, + { + "process": { + "executable": "/usr/lib/apt/apt-helper" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 100 + }, + "process_events": { + "week_idle_ms": 8, + "week_ms": 62 + }, + "overall": { + "week_idle_ms": 8, + "week_ms": 162 + } + }, + { + "process": { + "executable": "/usr/bin/date" + }, + "process_events": { + "week_idle_ms": 1024, + "week_ms": 143 + }, + "overall": { + "week_idle_ms": 1024, + "week_ms": 143 + } + }, + { + "file_events": { + "week_idle_ms": 5315, + "week_ms": 2 + }, + "process": { + "executable": "/usr/bin/apt-get" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 53 + }, + "process_events": { + "week_idle_ms": 576, + "week_ms": 76 + }, + "overall": { + "week_idle_ms": 5891, + "week_ms": 131 + } + }, + { + "process": { + "executable": "/usr/bin/unattended-upgrade" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 27 + }, + "process_events": { + "week_idle_ms": 139, + "week_ms": 95 + }, + "overall": { + "week_idle_ms": 139, + "week_ms": 122 + } + }, + { + "process": { + "executable": "/usr/bin/gpgconf" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 26 + }, + "process_events": { + "week_idle_ms": 12075, + "week_ms": 93 + }, + "overall": { + "week_idle_ms": 12075, + "week_ms": 119 + } + } + ], + "threads": [ + { + "name": "Cron", + "cpu": { + "mean": 0.005330585583239717 + } + }, + { + "name": "FileLogThread", + "cpu": { + "mean": 0.01387886588350829 + } + }, + { + "name": "LoggingLimitThread", + "cpu": { + "mean": 0.0003385089239880071 + } + }, + { + "name": "DocumentLoggingThread", + "cpu": { + "mean": 0.002019893909071295 + } + }, + { + "name": "DocumentLoggingMaintenance", + "cpu": { + "mean": 0.0001711144011367948 + } + }, + { + "name": "BulkConsumerThread", + "cpu": { + "mean": 0.01437360969549076 + } + }, + { + "name": "DocumentLoggingConsumerThread", + "cpu": { + "mean": 0.1566068758230231 + } + }, + { + "name": "DocumentLoggingLimitThread", + "cpu": { + "mean": 0.000383147463414997 + } + }, + { + "name": "ArtifactManifestDownload", + "cpu": { + "mean": 0.00202733366564246 + } + }, + { + "name": "PolicyReloadThread", + "cpu": { + "mean": 0.00001487951314232998 + } + }, + { + "name": "PerformanceMonitorWorkerThread", + "cpu": { + "mean": 0.005423582540379278 + } + }, + { + "name": "MetadataThread", + "cpu": { + "mean": 0.00001115963485674749 + } + }, + { + "name": "EventsQueueThread", + "cpu": { + "mean": 0.05409447002894065 + } + }, + { + "name": "DelayedAlertEnrichment", + "cpu": { + "mean": 0 + } + }, + { + "name": "MaintainProcessMap", + "cpu": { + "mean": 0.002905224941039929 + } + }, + { + "name": "FileScoreThread", + "cpu": { + "mean": 0.003567363275873613 + } + }, + { + "name": "DiagnosticMalwareThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "QuarantineManagerWorkerThread", + "cpu": { + "mean": 0.002083131839926198 + } + }, + { + "name": "EventProcessingThread", + "cpu": { + "mean": 0.01754294664738331 + } + }, + { + "name": "HostIsolationMonitorThread", + "cpu": { + "mean": 0.0008481322806622976 + } + }, + { + "name": "MountMonitor", + "cpu": { + "mean": 0.003463206812704382 + } + }, + { + "name": "responseActionsUploadThread", + "cpu": { + "mean": 0.00270807149264102 + } + }, + { + "name": "responseActionsProcessThread", + "cpu": { + "mean": 0.002689472100521233 + } + }, + { + "name": "serviceCommsThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "grpcConnectionManagerThread", + "cpu": { + "mean": 0.0110926774602411 + } + }, + { + "name": "checkinAPIThread", + "cpu": { + "mean": 0.0003124700433295513 + } + }, + { + "name": "actionsAPIThread", + "cpu": { + "mean": 0.0004910243538035807 + } + }, + { + "name": "stateReportThread", + "cpu": { + "mean": 0.00539010824743476 + } + }, + { + "name": "EventsLoopThread", + "cpu": { + "mean": 0.003266057265515501 + } + }, + { + "name": "FanotifyWatchdog", + "cpu": { + "mean": 0.0002231929794201937 + } + }, + { + "name": "FanotifySyncConsumer", + "cpu": { + "mean": 0.001885980676100637 + } + }, + { + "name": "FanotifyAsyncConsumer", + "cpu": { + "mean": 0.0002492321603525497 + } + }, + { + "name": "FanotifyConsumer", + "cpu": { + "mean": 0.03793164685246193 + } + }, + { + "name": "RulesEngineThread", + "cpu": { + "mean": 0.02721466395730229 + } + } + ], + "eventFilter": { + "active_global_count": 0, + "active_user_count": 0 + } + }, + "endpoint_meta": { + "os": { + "Ext": { + "variant": "Debian" + }, + "kernel": "5.10.0-21-cloud-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21)", + "name": "Linux", + "family": "debian", + "type": "linux", + "version": "11.8", + "platform": "debian", + "full": "Debian 11.8" + }, + "capabilities": [ + "kill_process", + "suspend_process", + "running_processes", + "isolation", + "ebpf(auto)" + ] + }, + "policy_config": { + "value": { + "linux": { + "advanced": { + "agent": { + "connection_delay": 60 + }, + "alerts": { + "require_user_artifacts": null + }, + "artifacts": { + "global": { + "base_url": null, + "manifest_relative_url": null, + "public_key": null, + "interval": null, + "ca_cert": null + }, + "user": { + "public_key": null, + "ca_cert": null, + "base_url": null, + "interval": null + } + }, + "elasticsearch": { + "delay": null, + "tls": { + "verify_peer": null, + "verify_hostname": null, + "ca_cert": null + } + }, + "fanotify": { + "ignore_unknown_filesystems": null, + "monitored_filesystems": null, + "ignored_filesystems": null + }, + "logging": { + "file": null, + "stdout": null, + "stderr": null, + "syslog": null + }, + "diagnostic": { + "enabled": null + }, + "malware": { + "quarantine": null + }, + "memory_protection": { + "memory_scan_collect_sample": null, + "memory_scan": null + }, + "kernel": { + "capture_mode": null + }, + "event_filter": { + "default": null + }, + "utilization_limits": { + "cpu": null + }, + "logstash": { + "delay": null + } + } + }, + "mac": { + "advanced": { + "agent": { + "connection_delay": null + }, + "artifacts": { + "global": { + "base_url": null, + "manifest_relative_url": null, + "public_key": null, + "interval": null, + "ca_cert": null + }, + "user": { + "public_key": null, + "ca_cert": null, + "base_url": null, + "interval": null + } + }, + "elasticsearch": { + "delay": null, + "tls": { + "verify_peer": null, + "verify_hostname": null, + "ca_cert": null + } + }, + "logging": { + "file": null, + "stdout": null, + "stderr": null, + "syslog": null + }, + "logstash": { + "delay": null + }, + "malware": { + "quarantine": null, + "threshold": null + }, + "kernel": { + "connect": null, + "harden": null, + "process": null, + "filewrite": null, + "network": null, + "network_extension": { + "enable_content_filtering": null, + "enable_packet_filtering": null + } + }, + "harden": { + "self_protect": null + }, + "diagnostic": { + "enabled": null + }, + "alerts": { + "cloud_lookup": null, + "cloud_lookup_url": null + }, + "memory_protection": { + "memory_scan_collect_sample": false, + "memory_scan": null + }, + "event_filter": { + "default": null + } + } + }, + "windows": { + "advanced": { + "agent": { + "connection_delay": null + }, + "artifacts": { + "global": { + "base_url": null, + "manifest_relative_url": null, + "public_key": null, + "interval": null, + "ca_cert": null + }, + "user": { + "public_key": null, + "ca_cert": null, + "base_url": null, + "interval": null + } + }, + "elasticsearch": { + "delay": null, + "tls": { + "verify_peer": null, + "verify_hostname": null, + "ca_cert": null + } + }, + "logging": { + "file": null, + "stdout": null, + "stderr": null, + "syslog": null + }, + "malware": { + "quarantine": null, + "threshold": null + }, + "kernel": { + "connect": null, + "harden": null, + "process": null, + "filewrite": null, + "network": null, + "fileopen": null, + "asyncimageload": null, + "syncimageload": null, + "registry": null, + "fileaccess": null, + "registryaccess": null, + "process_handle": null + }, + "diagnostic": { + "enabled": null, + "rollback_telemetry_enabled": null + }, + "alerts": { + "cloud_lookup": null, + "cloud_lookup_url": null, + "require_user_artifacts": null + }, + "ransomware": { + "mbr": null, + "canary": null + }, + "memory_protection": { + "context_manipulation_detection": null, + "shellcode": null, + "memory_scan": null, + "shellcode_collect_sample": null, + "memory_scan_collect_sample": null, + "shellcode_enhanced_pe_parsing": null, + "shellcode_trampoline_detection": null + }, + "event_filter": { + "default": null + }, + "utilization_limits": { + "cpu": null + } + } + } + } + }, + "policy_response": { + "agent_policy_status": "verified", + "manifest_version": "1.0.874", + "status": "success", + "actions": [], + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + } + }, + "telemetry_meta": { + "metrics_timestamp": "2024-02-23T08:46:59.303Z" + } +} diff --git a/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metadata.json b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metadata.json new file mode 100644 index 00000000000000..c46e574421c7dc --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metadata.json @@ -0,0 +1,251 @@ +[ + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-29T18:35:51.819450273Z", + "Endpoint": { + "capabilities": [ + "kill_process", + "suspend_process", + "running_processes", + "isolation", + "ebpf(auto)" + ], + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "name": "123", + "id": "123", + "endpoint_policy_version": "1", + "version": "55", + "status": "success" + } + }, + "status": "enrolled" + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metadata" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 34893855, + "ingested": "2024-01-29T18:35:53Z", + "created": "2024-01-29T18:35:51.819450273Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metadata", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metadata" + }, + "message": "Endpoint metadata" + }, + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-29T16:38:37.863555622Z", + "Endpoint": { + "capabilities": [ + "kill_process", + "suspend_process", + "running_processes", + "isolation", + "ebpf(auto)" + ], + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "name": "123", + "id": "123", + "endpoint_policy_version": "1", + "version": "26", + "status": "success" + } + }, + "status": "enrolled" + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metadata" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 33347679, + "ingested": "2024-01-29T16:38:39Z", + "created": "2024-01-29T16:38:37.863555622Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metadata", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metadata" + }, + "message": "Endpoint metadata" + }, + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-29T16:35:51.210383141Z", + "Endpoint": { + "capabilities": [ + "kill_process", + "suspend_process", + "running_processes", + "isolation", + "ebpf(auto)" + ], + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "name": "123", + "id": "123", + "endpoint_policy_version": "1", + "version": "55", + "status": "success" + } + }, + "status": "enrolled" + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metadata" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 34885625, + "ingested": "2024-01-29T16:35:53Z", + "created": "2024-01-29T16:35:51.210383141Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metadata", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metadata" + }, + "message": "Endpoint metadata" + } +] diff --git a/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metrics.json b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metrics.json new file mode 100644 index 00000000000000..cc3e0b03af31ce --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-metrics.json @@ -0,0 +1,2534 @@ +[ + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-26T14:38:30.628421712Z", + "Endpoint": { + "metrics": { + "system_impact": [ + { + "process": { + "executable": "/usr/bin/amazon-ssm-agent" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 36 + }, + "process_events": { + "week_idle_ms": 5, + "week_ms": 12487 + }, + "overall": { + "week_idle_ms": 5, + "week_ms": 12523 + } + }, + { + "process": { + "executable": "/usr/bin/ps" + }, + "process_events": { + "week_idle_ms": 8692, + "week_ms": 10288 + }, + "overall": { + "week_idle_ms": 8692, + "week_ms": 10288 + } + }, + { + "process": { + "executable": "/usr/sbin/sshd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 116 + }, + "process_events": { + "week_idle_ms": 3621, + "week_ms": 7204 + }, + "network_events": { + "week_idle_ms": 97, + "week_ms": 0 + }, + "overall": { + "week_idle_ms": 3718, + "week_ms": 7320 + } + }, + { + "process": { + "executable": "/usr/sbin/dhclient-script" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 430 + }, + "process_events": { + "week_idle_ms": 152054, + "week_ms": 6229 + }, + "overall": { + "week_idle_ms": 152054, + "week_ms": 6659 + } + }, + { + "process": { + "executable": "/usr/sbin/crond" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 73 + }, + "process_events": { + "week_idle_ms": 9491, + "week_ms": 2060 + }, + "overall": { + "week_idle_ms": 9491, + "week_ms": 2133 + } + }, + { + "file_events": { + "week_idle_ms": 80958, + "week_ms": 1963 + }, + "process": { + "executable": "/usr/lib/systemd/systemd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 23 + }, + "process_events": { + "week_idle_ms": 6, + "week_ms": 7 + }, + "overall": { + "week_idle_ms": 80964, + "week_ms": 1993 + } + }, + { + "process": { + "executable": "/bin/logger" + }, + "process_events": { + "week_idle_ms": 25156, + "week_ms": 1097 + }, + "overall": { + "week_idle_ms": 25156, + "week_ms": 1097 + } + }, + { + "file_events": { + "week_idle_ms": 12, + "week_ms": 0 + }, + "process": { + "executable": "/usr/lib64/sa/sadc" + }, + "process_events": { + "week_idle_ms": 4182, + "week_ms": 1005 + }, + "overall": { + "week_idle_ms": 4194, + "week_ms": 1005 + } + }, + { + "process": { + "executable": "unknown" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 981 + }, + "overall": { + "week_idle_ms": 0, + "week_ms": 981 + } + }, + { + "process": { + "executable": "/usr/bin/date" + }, + "process_events": { + "week_idle_ms": 8682, + "week_ms": 856 + }, + "overall": { + "week_idle_ms": 8682, + "week_ms": 856 + } + }, + { + "file_events": { + "week_idle_ms": 89949, + "week_ms": 835 + }, + "process": { + "executable": "/usr/lib/systemd/systemd-logind (deleted)" + }, + "overall": { + "week_idle_ms": 89949, + "week_ms": 835 + } + }, + { + "process": { + "executable": "/bin/cat" + }, + "process_events": { + "week_idle_ms": 28801, + "week_ms": 754 + }, + "overall": { + "week_idle_ms": 28801, + "week_ms": 754 + } + }, + { + "process": { + "executable": "/usr/lib64/sa/sa1" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 69 + }, + "process_events": { + "week_idle_ms": 7188, + "week_ms": 637 + }, + "overall": { + "week_idle_ms": 7188, + "week_ms": 706 + } + }, + { + "process": { + "executable": "/bin/cut" + }, + "process_events": { + "week_idle_ms": 7258, + "week_ms": 660 + }, + "overall": { + "week_idle_ms": 7258, + "week_ms": 660 + } + }, + { + "process": { + "executable": "/bin/ipcalc" + }, + "process_events": { + "week_idle_ms": 6603, + "week_ms": 477 + }, + "overall": { + "week_idle_ms": 6603, + "week_ms": 477 + } + }, + { + "process": { + "executable": "/sbin/ip" + }, + "process_events": { + "week_idle_ms": 14654, + "week_ms": 470 + }, + "overall": { + "week_idle_ms": 14654, + "week_ms": 470 + } + }, + { + "process": { + "executable": "/bin/curl" + }, + "process_events": { + "week_idle_ms": 4696, + "week_ms": 432 + }, + "network_events": { + "week_idle_ms": 3120, + "week_ms": 20 + }, + "overall": { + "week_idle_ms": 7816, + "week_ms": 452 + } + }, + { + "process": { + "executable": "/bin/run-parts" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 66 + }, + "process_events": { + "week_idle_ms": 4219, + "week_ms": 354 + }, + "overall": { + "week_idle_ms": 4219, + "week_ms": 420 + } + }, + { + "process": { + "executable": "/usr/sbin/dhclient" + }, + "process_events": { + "week_idle_ms": 3, + "week_ms": 326 + }, + "overall": { + "week_idle_ms": 3, + "week_ms": 326 + } + }, + { + "process": { + "executable": "/bin/sh" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 51 + }, + "process_events": { + "week_idle_ms": 2569, + "week_ms": 239 + }, + "overall": { + "week_idle_ms": 2569, + "week_ms": 290 + } + } + ], + "memory": { + "endpoint": { + "private": { + "mean": 119318921, + "latest": 136073216 + } + } + }, + "disks": [ + { + "total": 0, + "free": 0, + "device": "sysfs", + "mount": "/sys", + "fstype": "sysfs" + }, + { + "total": 0, + "free": 0, + "device": "proc", + "mount": "/proc", + "fstype": "proc" + }, + { + "total": 4157120512, + "free": 4157120512, + "device": "devtmpfs", + "mount": "/dev", + "fstype": "devtmpfs" + }, + { + "total": 0, + "free": 0, + "device": "securityfs", + "mount": "/sys/kernel/security", + "fstype": "securityfs" + }, + { + "total": 4166328320, + "free": 4166328320, + "device": "tmpfs", + "mount": "/dev/shm", + "fstype": "tmpfs" + }, + { + "total": 0, + "free": 0, + "device": "devpts", + "mount": "/dev/pts", + "fstype": "devpts" + }, + { + "total": 4166328320, + "free": 4165955584, + "device": "tmpfs", + "mount": "/run", + "fstype": "tmpfs" + }, + { + "total": 4166328320, + "free": 4166328320, + "device": "tmpfs", + "mount": "/sys/fs/cgroup", + "fstype": "tmpfs" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/systemd", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "pstore", + "mount": "/sys/fs/pstore", + "fstype": "pstore" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/devices", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/cpu,cpuacct", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/perf_event", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/pids", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/blkio", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/net_cls,net_prio", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/freezer", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/memory", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/cpuset", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/hugetlb", + "fstype": "cgroup" + }, + { + "endpoint_drive": true, + "total": 8577331200, + "free": 1841799168, + "device": "/dev/xvda1", + "mount": "/", + "fstype": "xfs" + }, + { + "total": 0, + "free": 0, + "device": "mqueue", + "mount": "/dev/mqueue", + "fstype": "mqueue" + }, + { + "total": 0, + "free": 0, + "device": "hugetlbfs", + "mount": "/dev/hugepages", + "fstype": "hugetlbfs" + }, + { + "total": 0, + "free": 0, + "device": "debugfs", + "mount": "/sys/kernel/debug", + "fstype": "debugfs" + }, + { + "total": 0, + "free": 0, + "device": "sunrpc", + "mount": "/var/lib/nfs/rpc_pipefs", + "fstype": "rpc_pipefs" + }, + { + "total": 0, + "free": 0, + "device": "systemd-1", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "autofs" + }, + { + "total": 0, + "free": 0, + "device": "binfmt_misc", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "binfmt_misc" + }, + { + "total": 0, + "free": 0, + "device": "tracefs", + "mount": "/sys/kernel/debug/tracing", + "fstype": "tracefs" + }, + { + "total": 0, + "free": 0, + "device": "none", + "mount": "/sys/fs/bpf", + "fstype": "bpf" + } + ], + "documents_volume": { + "file_events": { + "suppressed_count": 3928398, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "process_events": { + "suppressed_count": 0, + "suppressed_bytes": 0, + "sent_count": 5689500, + "sent_bytes": 12905842838 + }, + "network_events": { + "suppressed_count": 23529207, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "overall": { + "suppressed_count": 27457605, + "suppressed_bytes": 0, + "sent_count": 5689500, + "sent_bytes": 12905842838 + } + }, + "malicious_behavior_rules": [ + { + "id": "123", + "endpoint_uptime_percent": 0 + } + ], + "cpu": { + "endpoint": { + "histogram": { + "counts": [3439059, 129, 15, 0, 5, 6, 4, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "values": [ + 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 + ] + }, + "mean": 0.2374646952923115, + "latest": 0.1 + } + }, + "threads": [ + { + "name": "Cron", + "cpu": { + "mean": 0.00252963994365742 + } + }, + { + "name": "FileLogThread", + "cpu": { + "mean": 0.0006221101490102125 + } + }, + { + "name": "LoggingLimitThread", + "cpu": { + "mean": 0.0003625542590258192 + } + }, + { + "name": "DocumentLoggingThread", + "cpu": { + "mean": 0.001359578471346822 + } + }, + { + "name": "DocumentLoggingMaintenance", + "cpu": { + "mean": 0.0001029983690414259 + } + }, + { + "name": "BulkConsumerThread", + "cpu": { + "mean": 0.009533529038474382 + } + }, + { + "name": "DocumentLoggingConsumerThread", + "cpu": { + "mean": 0.1315907162873257 + } + }, + { + "name": "DocumentLoggingLimitThread", + "cpu": { + "mean": 0.0002471960856994222 + } + }, + { + "name": "ArtifactManifestDownload", + "cpu": { + "mean": 0.001561455274668017 + } + }, + { + "name": "PolicyReloadThread", + "cpu": { + "mean": 0.00001235980428497111 + } + }, + { + "name": "PerformanceMonitorWorkerThread", + "cpu": { + "mean": 0.004639046541625823 + } + }, + { + "name": "MetadataThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "EventsQueueThread", + "cpu": { + "mean": 0.05644722616946305 + } + }, + { + "name": "DelayedAlertEnrichment", + "cpu": { + "mean": 0 + } + }, + { + "name": "MaintainProcessMap", + "cpu": { + "mean": 0.002167085684631601 + } + }, + { + "name": "FileScoreThread", + "cpu": { + "mean": 0.002241244510341427 + } + }, + { + "name": "DiagnosticMalwareThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "QuarantineManagerWorkerThread", + "cpu": { + "mean": 0.002014648098450291 + } + }, + { + "name": "EventProcessingThread", + "cpu": { + "mean": 0.00583794755726802 + } + }, + { + "name": "HostIsolationMonitorThread", + "cpu": { + "mean": 0.0008281068870930642 + } + }, + { + "name": "MountMonitor", + "cpu": { + "mean": 0.003407186047890369 + } + }, + { + "name": "responseActionsUploadThread", + "cpu": { + "mean": 0.00208468698939846 + } + }, + { + "name": "responseActionsProcessThread", + "cpu": { + "mean": 0.002105286663206745 + } + }, + { + "name": "serviceCommsThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "grpcConnectionManagerThread", + "cpu": { + "mean": 0.002344242879382854 + } + }, + { + "name": "checkinAPIThread", + "cpu": { + "mean": 0.0002513162482505196 + } + }, + { + "name": "actionsAPIThread", + "cpu": { + "mean": 0.0004985125580051291 + } + }, + { + "name": "stateReportThread", + "cpu": { + "mean": 0.004400094313632049 + } + }, + { + "name": "EventsLoopThread", + "cpu": { + "mean": 0.008866112391817567 + } + }, + { + "name": "FanotifyWatchdog", + "cpu": { + "mean": 0.0002142369165309078 + } + }, + { + "name": "FanotifySyncConsumer", + "cpu": { + "mean": 0.001042344997736917 + } + }, + { + "name": "FanotifyAsyncConsumer", + "cpu": { + "mean": 0 + } + }, + { + "name": "FanotifyConsumer", + "cpu": { + "mean": 0.03632551717409642 + } + }, + { + "name": "RulesEngineThread", + "cpu": { + "mean": 0.03752853985923151 + } + } + ], + "event_filter": { + "active_global_count": 0, + "active_user_count": 0 + }, + "uptime": { + "endpoint": 24272228, + "system": 29719735 + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metrics" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 33235745, + "ingested": "2024-01-26T14:38:32Z", + "created": "2024-01-26T14:38:30.628421712Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metrics", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metrics" + }, + "message": "Endpoint metrics" + }, + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-26T14:35:43.564911752Z", + "Endpoint": { + "metrics": { + "system_impact": [ + { + "process": { + "executable": "/usr/bin/amazon-ssm-agent" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 51 + }, + "process_events": { + "week_idle_ms": 2, + "week_ms": 8914 + }, + "overall": { + "week_idle_ms": 2, + "week_ms": 8965 + } + }, + { + "process": { + "executable": "/usr/bin/ps" + }, + "process_events": { + "week_idle_ms": 7543, + "week_ms": 6667 + }, + "overall": { + "week_idle_ms": 7543, + "week_ms": 6667 + } + }, + { + "process": { + "executable": "/usr/sbin/sshd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 51 + }, + "process_events": { + "week_idle_ms": 3596, + "week_ms": 4596 + }, + "network_events": { + "week_idle_ms": 85, + "week_ms": 5 + }, + "overall": { + "week_idle_ms": 3681, + "week_ms": 4652 + } + }, + { + "process": { + "executable": "/usr/sbin/dhclient-script" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 380 + }, + "process_events": { + "week_idle_ms": 105790, + "week_ms": 3877 + }, + "overall": { + "week_idle_ms": 105790, + "week_ms": 4257 + } + }, + { + "process": { + "executable": "/usr/sbin/crond" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 129 + }, + "process_events": { + "week_idle_ms": 8062, + "week_ms": 1903 + }, + "overall": { + "week_idle_ms": 8062, + "week_ms": 2032 + } + }, + { + "file_events": { + "week_idle_ms": 69051, + "week_ms": 1544 + }, + "process": { + "executable": "/usr/lib/systemd/systemd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 15 + }, + "process_events": { + "week_idle_ms": 31, + "week_ms": 9 + }, + "overall": { + "week_idle_ms": 69082, + "week_ms": 1568 + } + }, + { + "process": { + "executable": "unknown" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 979 + }, + "overall": { + "week_idle_ms": 0, + "week_ms": 979 + } + }, + { + "file_events": { + "week_idle_ms": 29, + "week_ms": 0 + }, + "process": { + "executable": "/usr/lib64/sa/sadc" + }, + "process_events": { + "week_idle_ms": 5107, + "week_ms": 917 + }, + "overall": { + "week_idle_ms": 5136, + "week_ms": 917 + } + }, + { + "process": { + "executable": "/bin/logger" + }, + "process_events": { + "week_idle_ms": 20585, + "week_ms": 880 + }, + "overall": { + "week_idle_ms": 20585, + "week_ms": 880 + } + }, + { + "file_events": { + "week_idle_ms": 72520, + "week_ms": 852 + }, + "process": { + "executable": "/usr/lib/systemd/systemd-logind (deleted)" + }, + "overall": { + "week_idle_ms": 72520, + "week_ms": 852 + } + }, + { + "process": { + "executable": "/usr/bin/date" + }, + "process_events": { + "week_idle_ms": 9862, + "week_ms": 808 + }, + "overall": { + "week_idle_ms": 9862, + "week_ms": 808 + } + }, + { + "process": { + "executable": "/bin/cat" + }, + "process_events": { + "week_idle_ms": 17468, + "week_ms": 701 + }, + "overall": { + "week_idle_ms": 17468, + "week_ms": 701 + } + }, + { + "process": { + "executable": "/usr/lib64/sa/sa1" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 67 + }, + "process_events": { + "week_idle_ms": 7451, + "week_ms": 618 + }, + "overall": { + "week_idle_ms": 7451, + "week_ms": 685 + } + }, + { + "process": { + "executable": "/bin/curl" + }, + "process_events": { + "week_idle_ms": 5615, + "week_ms": 403 + }, + "network_events": { + "week_idle_ms": 4128, + "week_ms": 6 + }, + "overall": { + "week_idle_ms": 9743, + "week_ms": 409 + } + }, + { + "process": { + "executable": "/bin/run-parts" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 116 + }, + "process_events": { + "week_idle_ms": 3770, + "week_ms": 260 + }, + "overall": { + "week_idle_ms": 3770, + "week_ms": 376 + } + }, + { + "process": { + "executable": "/usr/sbin/dhclient" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 36 + }, + "process_events": { + "week_idle_ms": 1, + "week_ms": 278 + }, + "overall": { + "week_idle_ms": 1, + "week_ms": 314 + } + }, + { + "process": { + "executable": "/bin/cut" + }, + "process_events": { + "week_idle_ms": 5067, + "week_ms": 313 + }, + "overall": { + "week_idle_ms": 5067, + "week_ms": 313 + } + }, + { + "process": { + "executable": "/sbin/ip" + }, + "process_events": { + "week_idle_ms": 10369, + "week_ms": 286 + }, + "overall": { + "week_idle_ms": 10369, + "week_ms": 286 + } + }, + { + "process": { + "executable": "/bin/sh" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 20 + }, + "process_events": { + "week_idle_ms": 2397, + "week_ms": 208 + }, + "overall": { + "week_idle_ms": 2397, + "week_ms": 228 + } + }, + { + "process": { + "executable": "/bin/ipcalc" + }, + "process_events": { + "week_idle_ms": 4827, + "week_ms": 201 + }, + "overall": { + "week_idle_ms": 4827, + "week_ms": 201 + } + } + ], + "memory": { + "endpoint": { + "private": { + "mean": 118266395, + "latest": 135163904 + } + } + }, + "disks": [ + { + "total": 0, + "free": 0, + "device": "sysfs", + "mount": "/sys", + "fstype": "sysfs" + }, + { + "total": 0, + "free": 0, + "device": "proc", + "mount": "/proc", + "fstype": "proc" + }, + { + "total": 4157120512, + "free": 4157120512, + "device": "devtmpfs", + "mount": "/dev", + "fstype": "devtmpfs" + }, + { + "total": 0, + "free": 0, + "device": "securityfs", + "mount": "/sys/kernel/security", + "fstype": "securityfs" + }, + { + "total": 4166328320, + "free": 4166328320, + "device": "tmpfs", + "mount": "/dev/shm", + "fstype": "tmpfs" + }, + { + "total": 0, + "free": 0, + "device": "devpts", + "mount": "/dev/pts", + "fstype": "devpts" + }, + { + "total": 4166328320, + "free": 4165955584, + "device": "tmpfs", + "mount": "/run", + "fstype": "tmpfs" + }, + { + "total": 4166328320, + "free": 4166328320, + "device": "tmpfs", + "mount": "/sys/fs/cgroup", + "fstype": "tmpfs" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/systemd", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "pstore", + "mount": "/sys/fs/pstore", + "fstype": "pstore" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/blkio", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/cpu,cpuacct", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/net_cls,net_prio", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/devices", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/cpuset", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/hugetlb", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/pids", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/freezer", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/memory", + "fstype": "cgroup" + }, + { + "total": 0, + "free": 0, + "device": "cgroup", + "mount": "/sys/fs/cgroup/perf_event", + "fstype": "cgroup" + }, + { + "endpoint_drive": true, + "total": 8577331200, + "free": 1908756480, + "device": "/dev/xvda1", + "mount": "/", + "fstype": "xfs" + }, + { + "total": 0, + "free": 0, + "device": "hugetlbfs", + "mount": "/dev/hugepages", + "fstype": "hugetlbfs" + }, + { + "total": 0, + "free": 0, + "device": "mqueue", + "mount": "/dev/mqueue", + "fstype": "mqueue" + }, + { + "total": 0, + "free": 0, + "device": "debugfs", + "mount": "/sys/kernel/debug", + "fstype": "debugfs" + }, + { + "total": 0, + "free": 0, + "device": "sunrpc", + "mount": "/var/lib/nfs/rpc_pipefs", + "fstype": "rpc_pipefs" + }, + { + "total": 0, + "free": 0, + "device": "systemd-1", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "autofs" + }, + { + "total": 0, + "free": 0, + "device": "binfmt_misc", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "binfmt_misc" + }, + { + "total": 0, + "free": 0, + "device": "tracefs", + "mount": "/sys/kernel/debug/tracing", + "fstype": "tracefs" + }, + { + "total": 0, + "free": 0, + "device": "none", + "mount": "/sys/fs/bpf", + "fstype": "bpf" + } + ], + "documents_volume": { + "file_events": { + "suppressed_count": 3926292, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "process_events": { + "suppressed_count": 0, + "suppressed_bytes": 0, + "sent_count": 5737776, + "sent_bytes": 12992145486 + }, + "network_events": { + "suppressed_count": 24813200, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "overall": { + "suppressed_count": 28739492, + "suppressed_bytes": 0, + "sent_count": 5737776, + "sent_bytes": 12992145486 + } + }, + "malicious_behavior_rules": [ + { + "id": "123", + "endpoint_uptime_percent": 0 + } + ], + "cpu": { + "endpoint": { + "histogram": { + "counts": [3147842, 87, 11, 10, 9, 5, 10, 6, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "values": [ + 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 + ] + }, + "mean": 0.2338436071605115, + "latest": 0.9000000000000001 + } + }, + "threads": [ + { + "name": "Cron", + "cpu": { + "mean": 0.002129690752013577 + } + }, + { + "name": "FileLogThread", + "cpu": { + "mean": 0.0004778416387496615 + } + }, + { + "name": "LoggingLimitThread", + "cpu": { + "mean": 0.0002965913619825484 + } + }, + { + "name": "DocumentLoggingThread", + "cpu": { + "mean": 0.001116336931906537 + } + }, + { + "name": "DocumentLoggingMaintenance", + "cpu": { + "mean": 0.00009062513838355648 + } + }, + { + "name": "BulkConsumerThread", + "cpu": { + "mean": 0.008971888699972091 + } + }, + { + "name": "DocumentLoggingConsumerThread", + "cpu": { + "mean": 0.1281974968924846 + } + }, + { + "name": "DocumentLoggingLimitThread", + "cpu": { + "mean": 0.000205966223598992 + } + }, + { + "name": "ArtifactManifestDownload", + "cpu": { + "mean": 0.001515911405688581 + } + }, + { + "name": "PolicyReloadThread", + "cpu": { + "mean": 0.00000823864894395968 + } + }, + { + "name": "PerformanceMonitorWorkerThread", + "cpu": { + "mean": 0.003917477572852828 + } + }, + { + "name": "MetadataThread", + "cpu": { + "mean": 0.00000411932447197984 + } + }, + { + "name": "EventsQueueThread", + "cpu": { + "mean": 0.04977791691940438 + } + }, + { + "name": "DelayedAlertEnrichment", + "cpu": { + "mean": 0 + } + }, + { + "name": "MaintainProcessMap", + "cpu": { + "mean": 0.001837218714503009 + } + }, + { + "name": "FileScoreThread", + "cpu": { + "mean": 0.001923724528414585 + } + }, + { + "name": "DiagnosticMalwareThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "QuarantineManagerWorkerThread", + "cpu": { + "mean": 0.001557104650408379 + } + }, + { + "name": "EventProcessingThread", + "cpu": { + "mean": 0.00591534994176305 + } + }, + { + "name": "HostIsolationMonitorThread", + "cpu": { + "mean": 0.0006508532665728148 + } + }, + { + "name": "MountMonitor", + "cpu": { + "mean": 0.002533384550267602 + } + }, + { + "name": "responseActionsUploadThread", + "cpu": { + "mean": 0.001771309522951331 + } + }, + { + "name": "responseActionsProcessThread", + "cpu": { + "mean": 0.001783667496367271 + } + }, + { + "name": "serviceCommsThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "grpcConnectionManagerThread", + "cpu": { + "mean": 0.001956679124190424 + } + }, + { + "name": "checkinAPIThread", + "cpu": { + "mean": 0.0002389210358973501 + } + }, + { + "name": "actionsAPIThread", + "cpu": { + "mean": 0.0003913361794870389 + } + }, + { + "name": "stateReportThread", + "cpu": { + "mean": 0.003550860912819238 + } + }, + { + "name": "EventsLoopThread", + "cpu": { + "mean": 0.0077690568352644 + } + }, + { + "name": "FanotifyWatchdog", + "cpu": { + "mean": 0.0001647732096556607 + } + }, + { + "name": "FanotifySyncConsumer", + "cpu": { + "mean": 0.001103980504692926 + } + }, + { + "name": "FanotifyAsyncConsumer", + "cpu": { + "mean": 0 + } + }, + { + "name": "FanotifyConsumer", + "cpu": { + "mean": 0.02717934093270123 + } + }, + { + "name": "RulesEngineThread", + "cpu": { + "mean": 0.03744471189424889 + } + } + ], + "event_filter": { + "active_global_count": 0, + "active_user_count": 0 + }, + "uptime": { + "endpoint": 24275825, + "system": 29714870 + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metrics" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 34569822, + "ingested": "2024-01-26T14:35:45Z", + "created": "2024-01-26T14:35:43.564911752Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metrics", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metrics" + }, + "message": "Endpoint metrics" + }, + { + "agent": { + "build": { + "original": "version: 8.6.2, compiled: Fri Feb 10 14:00:00 2023, branch: 8.6, commit: eaee25e73cc58a52387e50d5bce542ec8965f638" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.2" + }, + "@timestamp": "2024-01-26T15:06:50.254822749Z", + "Endpoint": { + "metrics": { + "system_impact": [ + { + "process": { + "executable": "/usr/sbin/sshd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 304 + }, + "process_events": { + "week_idle_ms": 31791, + "week_ms": 110821 + }, + "network_events": { + "week_idle_ms": 2030, + "week_ms": 53 + }, + "overall": { + "week_idle_ms": 33821, + "week_ms": 111178 + } + }, + { + "process": { + "executable": "unknown" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 4552 + }, + "overall": { + "week_idle_ms": 0, + "week_ms": 4552 + } + }, + { + "file_events": { + "week_idle_ms": 130, + "week_ms": 7 + }, + "process": { + "executable": "/lib/systemd/systemd" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 1920 + }, + "process_events": { + "week_idle_ms": 1273, + "week_ms": 1750 + }, + "overall": { + "week_idle_ms": 1403, + "week_ms": 3677 + } + }, + { + "file_events": { + "week_idle_ms": 7, + "week_ms": 0 + }, + "process": { + "executable": "/bin/systemctl" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 3055 + }, + "process_events": { + "week_idle_ms": 0, + "week_ms": 9 + }, + "overall": { + "week_idle_ms": 7, + "week_ms": 3064 + } + }, + { + "file_events": { + "week_idle_ms": 3104, + "week_ms": 1 + }, + "process": { + "executable": "/usr/bin/apt-key" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 61 + }, + "process_events": { + "week_idle_ms": 178857, + "week_ms": 2062 + }, + "overall": { + "week_idle_ms": 181961, + "week_ms": 2124 + } + }, + { + "process": { + "executable": "/usr/bin/gce_workload_cert_refresh" + }, + "process_events": { + "week_idle_ms": 230, + "week_ms": 1405 + }, + "network_events": { + "week_idle_ms": 135, + "week_ms": 21 + }, + "overall": { + "week_idle_ms": 365, + "week_ms": 1426 + } + }, + { + "process": { + "executable": "/usr/bin/apt-config" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 65 + }, + "process_events": { + "week_idle_ms": 18708, + "week_ms": 840 + }, + "overall": { + "week_idle_ms": 18708, + "week_ms": 905 + } + }, + { + "process": { + "executable": "/usr/lib/apt/apt.systemd.daily" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 273 + }, + "process_events": { + "week_idle_ms": 1064, + "week_ms": 352 + }, + "overall": { + "week_idle_ms": 1064, + "week_ms": 625 + } + }, + { + "process": { + "executable": "/usr/bin/dpkg" + }, + "process_events": { + "week_idle_ms": 11479, + "week_ms": 558 + }, + "overall": { + "week_idle_ms": 11479, + "week_ms": 558 + } + }, + { + "process": { + "executable": "/usr/sbin/cron" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 80 + }, + "process_events": { + "week_idle_ms": 270, + "week_ms": 451 + }, + "overall": { + "week_idle_ms": 270, + "week_ms": 531 + } + }, + { + "process": { + "executable": "/usr/bin/cmp" + }, + "process_events": { + "week_idle_ms": 39452, + "week_ms": 513 + }, + "overall": { + "week_idle_ms": 39452, + "week_ms": 513 + } + }, + { + "file_events": { + "week_idle_ms": 144, + "week_ms": 0 + }, + "process": { + "executable": "/sbin/dhclient-script" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 251 + }, + "process_events": { + "week_idle_ms": 2412, + "week_ms": 186 + }, + "overall": { + "week_idle_ms": 2556, + "week_ms": 437 + } + }, + { + "process": { + "executable": "/usr/bin/env" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 413 + }, + "process_events": { + "week_idle_ms": 45, + "week_ms": 4 + }, + "overall": { + "week_idle_ms": 45, + "week_ms": 417 + } + }, + { + "process": { + "executable": "/usr/bin/cat" + }, + "process_events": { + "week_idle_ms": 39679, + "week_ms": 359 + }, + "overall": { + "week_idle_ms": 39679, + "week_ms": 359 + } + }, + { + "process": { + "executable": "/bin/sh" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 35 + }, + "process_events": { + "week_idle_ms": 444, + "week_ms": 197 + }, + "overall": { + "week_idle_ms": 444, + "week_ms": 232 + } + }, + { + "process": { + "executable": "/usr/lib/apt/apt-helper" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 100 + }, + "process_events": { + "week_idle_ms": 8, + "week_ms": 62 + }, + "overall": { + "week_idle_ms": 8, + "week_ms": 162 + } + }, + { + "process": { + "executable": "/usr/bin/date" + }, + "process_events": { + "week_idle_ms": 1024, + "week_ms": 143 + }, + "overall": { + "week_idle_ms": 1024, + "week_ms": 143 + } + }, + { + "file_events": { + "week_idle_ms": 5315, + "week_ms": 2 + }, + "process": { + "executable": "/usr/bin/apt-get" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 53 + }, + "process_events": { + "week_idle_ms": 576, + "week_ms": 76 + }, + "overall": { + "week_idle_ms": 5891, + "week_ms": 131 + } + }, + { + "process": { + "executable": "/usr/bin/unattended-upgrade" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 27 + }, + "process_events": { + "week_idle_ms": 139, + "week_ms": 95 + }, + "overall": { + "week_idle_ms": 139, + "week_ms": 122 + } + }, + { + "process": { + "executable": "/usr/bin/gpgconf" + }, + "malware": { + "week_idle_ms": 0, + "week_ms": 26 + }, + "process_events": { + "week_idle_ms": 12075, + "week_ms": 93 + }, + "overall": { + "week_idle_ms": 12075, + "week_ms": 119 + } + } + ], + "memory": { + "endpoint": { + "private": { + "mean": 373780821, + "latest": 411860992 + } + } + }, + "disks": [ + { + "total": 0, + "free": 0, + "device": "sysfs", + "mount": "/sys", + "fstype": "sysfs" + }, + { + "total": 0, + "free": 0, + "device": "proc", + "mount": "/proc", + "fstype": "proc" + }, + { + "total": 2049777664, + "free": 2049777664, + "device": "udev", + "mount": "/dev", + "fstype": "devtmpfs" + }, + { + "total": 0, + "free": 0, + "device": "devpts", + "mount": "/dev/pts", + "fstype": "devpts" + }, + { + "total": 412172288, + "free": 411795456, + "device": "tmpfs", + "mount": "/run", + "fstype": "tmpfs" + }, + { + "endpoint_drive": true, + "total": 10331889664, + "free": 4091109376, + "device": "/dev/sda1", + "mount": "/", + "fstype": "ext4" + }, + { + "total": 0, + "free": 0, + "device": "securityfs", + "mount": "/sys/kernel/security", + "fstype": "securityfs" + }, + { + "total": 2060849152, + "free": 2060849152, + "device": "tmpfs", + "mount": "/dev/shm", + "fstype": "tmpfs" + }, + { + "total": 5242880, + "free": 5242880, + "device": "tmpfs", + "mount": "/run/lock", + "fstype": "tmpfs" + }, + { + "total": 0, + "free": 0, + "device": "cgroup2", + "mount": "/sys/fs/cgroup", + "fstype": "cgroup2" + }, + { + "total": 0, + "free": 0, + "device": "pstore", + "mount": "/sys/fs/pstore", + "fstype": "pstore" + }, + { + "total": 0, + "free": 0, + "device": "efivarfs", + "mount": "/sys/firmware/efi/efivars", + "fstype": "efivarfs" + }, + { + "total": 0, + "free": 0, + "device": "none", + "mount": "/sys/fs/bpf", + "fstype": "bpf" + }, + { + "total": 0, + "free": 0, + "device": "systemd-1", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "autofs" + }, + { + "total": 0, + "free": 0, + "device": "hugetlbfs", + "mount": "/dev/hugepages", + "fstype": "hugetlbfs" + }, + { + "total": 0, + "free": 0, + "device": "mqueue", + "mount": "/dev/mqueue", + "fstype": "mqueue" + }, + { + "total": 0, + "free": 0, + "device": "debugfs", + "mount": "/sys/kernel/debug", + "fstype": "debugfs" + }, + { + "total": 0, + "free": 0, + "device": "tracefs", + "mount": "/sys/kernel/tracing", + "fstype": "tracefs" + }, + { + "total": 0, + "free": 0, + "device": "fusectl", + "mount": "/sys/fs/fuse/connections", + "fstype": "fusectl" + }, + { + "total": 0, + "free": 0, + "device": "configfs", + "mount": "/sys/kernel/config", + "fstype": "configfs" + }, + { + "total": 129751040, + "free": 118589440, + "device": "/dev/sda15", + "mount": "/boot/efi", + "fstype": "vfat" + }, + { + "total": 0, + "free": 0, + "device": "binfmt_misc", + "mount": "/proc/sys/fs/binfmt_misc", + "fstype": "binfmt_misc" + }, + { + "total": 0, + "free": 0, + "device": "tracefs", + "mount": "/sys/kernel/debug/tracing", + "fstype": "tracefs" + } + ], + "documents_volume": { + "file_events": { + "suppressed_count": 1651293, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "process_events": { + "suppressed_count": 0, + "suppressed_bytes": 0, + "sent_count": 11026887, + "sent_bytes": 23412176619 + }, + "network_events": { + "suppressed_count": 3270009, + "suppressed_bytes": 0, + "sent_count": 0, + "sent_bytes": 0 + }, + "overall": { + "suppressed_count": 4921302, + "suppressed_bytes": 0, + "sent_count": 11026887, + "sent_bytes": 23412176619 + } + }, + "malicious_behavior_rules": [ + { + "id": "123", + "endpoint_uptime_percent": 0 + } + ], + "cpu": { + "endpoint": { + "histogram": { + "counts": [ + 3934326, 520, 140, 110, 212, 78, 41, 18, 12, 25, 9, 5, 5, 2, 0, 0, 0, 0, 0, 0 + ], + "values": [ + 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 + ] + }, + "mean": 0.2697424700222798, + "latest": 0.1 + } + }, + "threads": [ + { + "name": "Cron", + "cpu": { + "mean": 0.005330585583239717 + } + }, + { + "name": "FileLogThread", + "cpu": { + "mean": 0.01387886588350829 + } + }, + { + "name": "LoggingLimitThread", + "cpu": { + "mean": 0.0003385089239880071 + } + }, + { + "name": "DocumentLoggingThread", + "cpu": { + "mean": 0.002019893909071295 + } + }, + { + "name": "DocumentLoggingMaintenance", + "cpu": { + "mean": 0.0001711144011367948 + } + }, + { + "name": "BulkConsumerThread", + "cpu": { + "mean": 0.01437360969549076 + } + }, + { + "name": "DocumentLoggingConsumerThread", + "cpu": { + "mean": 0.1566068758230231 + } + }, + { + "name": "DocumentLoggingLimitThread", + "cpu": { + "mean": 0.000383147463414997 + } + }, + { + "name": "ArtifactManifestDownload", + "cpu": { + "mean": 0.00202733366564246 + } + }, + { + "name": "PolicyReloadThread", + "cpu": { + "mean": 0.00001487951314232998 + } + }, + { + "name": "PerformanceMonitorWorkerThread", + "cpu": { + "mean": 0.005423582540379278 + } + }, + { + "name": "MetadataThread", + "cpu": { + "mean": 0.00001115963485674749 + } + }, + { + "name": "EventsQueueThread", + "cpu": { + "mean": 0.05409447002894065 + } + }, + { + "name": "DelayedAlertEnrichment", + "cpu": { + "mean": 0 + } + }, + { + "name": "MaintainProcessMap", + "cpu": { + "mean": 0.002905224941039929 + } + }, + { + "name": "FileScoreThread", + "cpu": { + "mean": 0.003567363275873613 + } + }, + { + "name": "DiagnosticMalwareThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "QuarantineManagerWorkerThread", + "cpu": { + "mean": 0.002083131839926198 + } + }, + { + "name": "EventProcessingThread", + "cpu": { + "mean": 0.01754294664738331 + } + }, + { + "name": "HostIsolationMonitorThread", + "cpu": { + "mean": 0.0008481322806622976 + } + }, + { + "name": "MountMonitor", + "cpu": { + "mean": 0.003463206812704382 + } + }, + { + "name": "responseActionsUploadThread", + "cpu": { + "mean": 0.00270807149264102 + } + }, + { + "name": "responseActionsProcessThread", + "cpu": { + "mean": 0.002689472100521233 + } + }, + { + "name": "serviceCommsThread", + "cpu": { + "mean": 0 + } + }, + { + "name": "grpcConnectionManagerThread", + "cpu": { + "mean": 0.0110926774602411 + } + }, + { + "name": "checkinAPIThread", + "cpu": { + "mean": 0.0003124700433295513 + } + }, + { + "name": "actionsAPIThread", + "cpu": { + "mean": 0.0004910243538035807 + } + }, + { + "name": "stateReportThread", + "cpu": { + "mean": 0.00539010824743476 + } + }, + { + "name": "EventsLoopThread", + "cpu": { + "mean": 0.003266057265515501 + } + }, + { + "name": "FanotifyWatchdog", + "cpu": { + "mean": 0.0002231929794201937 + } + }, + { + "name": "FanotifySyncConsumer", + "cpu": { + "mean": 0.001885980676100637 + } + }, + { + "name": "FanotifyAsyncConsumer", + "cpu": { + "mean": 0.0002492321603525497 + } + }, + { + "name": "FanotifyConsumer", + "cpu": { + "mean": 0.03793164685246193 + } + }, + { + "name": "RulesEngineThread", + "cpu": { + "mean": 0.02721466395730229 + } + } + ], + "event_filter": { + "active_global_count": 0, + "active_user_count": 0 + }, + "uptime": { + "endpoint": 26882599, + "system": 26883343 + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.metrics" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Debian" + }, + "kernel": "5.10.0-21-cloud-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21)", + "name": "Linux", + "family": "debian", + "type": "linux", + "version": "11.8", + "platform": "debian", + "full": "Debian 11.8" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 16194584, + "ingested": "2024-01-26T15:06:52Z", + "created": "2024-01-26T15:06:50.254822749Z", + "kind": "metric", + "module": "endpoint", + "action": "endpoint_metrics", + "id": "123", + "category": ["host"], + "type": ["info"], + "dataset": "endpoint.metrics" + }, + "message": "Endpoint metrics" + } +] diff --git a/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-policy.json b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-policy.json new file mode 100644 index 00000000000000..7085e3efa61463 --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/endpoint-policy.json @@ -0,0 +1,1205 @@ +[ + { + "agent": { + "build": { + "original": "version: 8.6.2, compiled: Fri Feb 10 14:00:00 2023, branch: 8.6, commit: eaee25e73cc58a52387e50d5bce542ec8965f638" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.2" + }, + "@timestamp": "2024-01-26T15:06:50.25217928Z", + "Endpoint": { + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "response": { + "configurations": { + "behavior_protection": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_malicious_behavior" + ], + "status": "success" + }, + "streaming": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_output", + "workflow" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_malware", + "detect_process_events", + "detect_file_write_events", + "configure_user_notification" + ], + "status": "success" + }, + "logging": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_logging", + "workflow" + ], + "status": "success" + }, + "host_isolation": { + "concerned_actions": [ + "agent_connectivity", + "configure_host_isolation", + "load_config", + "workflow" + ], + "status": "success" + }, + "events": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "detect_file_write_events", + "detect_network_events", + "configure_file_events", + "configure_network_events", + "configure_process_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "agent_connectivity", + "configure_memory_threat", + "configure_process_events", + "download_global_artifacts", + "download_user_artifacts", + "workflow", + "load_config", + "detect_process_events" + ], + "status": "success" + } + }, + "diagnostic": { + "behavior_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_diagnostic_malicious_behavior" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_diagnostic_malware", + "detect_process_events", + "detect_file_write_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "configure_process_events", + "configure_diagnostic_memory_threat" + ], + "status": "success" + } + } + }, + "name": "123", + "id": "123", + "actions": [ + { + "name": "configure_memory_threat", + "message": "Successfully enabled memory threat prevention with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_diagnostic_memory_threat", + "message": "Successfully enabled memory threat detection with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_host_isolation", + "message": "Host is not isolated", + "status": "success" + }, + { + "name": "configure_malicious_behavior", + "message": "Enabled 34 out of 34 malicious behavior rules", + "status": "success" + }, + { + "name": "configure_diagnostic_malicious_behavior", + "message": "Enabled 65 out of 65 diagnostic malicious behavior rules", + "status": "success" + }, + { + "name": "configure_user_notification", + "message": "Successfully configured user notification", + "status": "success" + }, + { + "name": "configure_malware", + "message": "Successfully enabled malware prevention", + "status": "success" + }, + { + "name": "configure_diagnostic_malware", + "message": "Successfully enabled malware detection", + "status": "success" + }, + { + "name": "configure_output", + "message": "Successfully configured output connection", + "status": "success" + }, + { + "name": "configure_logging", + "message": "Successfully configured logging", + "status": "success" + }, + { + "name": "load_config", + "message": "Successfully parsed configuration", + "status": "success" + }, + { + "name": "download_user_artifacts", + "message": "Successfully downloaded user artifacts", + "status": "success" + }, + { + "name": "download_global_artifacts", + "message": "Global artifacts are available for use", + "status": "success" + }, + { + "name": "detect_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "detect_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "detect_file_write_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_file_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "configure_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "agent_connectivity", + "message": "Successfully connected to Agent", + "status": "success" + }, + { + "name": "workflow", + "message": "Successfully executed all workflows", + "status": "success" + } + ], + "endpoint_policy_version": "1", + "version": "51", + "artifacts": { + "global": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-rules-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-exceptionlist-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-trustlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-rules-linux-v1" + } + ], + "version": "1.0.874" + }, + "user": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-blocklist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-exceptionlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-hostisolationexceptionlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b" + } + ], + "version": "1.0.9" + } + }, + "status": "success" + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.policy" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Debian" + }, + "kernel": "5.10.0-21-cloud-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21)", + "name": "Linux", + "family": "debian", + "type": "linux", + "version": "11.8", + "platform": "debian", + "full": "Debian 11.8" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 1, + "ingested": "2024-01-26T15:06:52Z", + "created": "2024-01-26T15:06:50.25217928Z", + "kind": "state", + "module": "endpoint", + "action": "endpoint_policy_response", + "id": "123", + "category": ["host"], + "type": ["change"], + "dataset": "endpoint.policy" + }, + "message": "Endpoint policy change" + }, + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-26T14:38:30.627297556Z", + "Endpoint": { + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "response": { + "configurations": { + "behavior_protection": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_malicious_behavior" + ], + "status": "success" + }, + "streaming": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_output", + "workflow" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_malware", + "detect_process_events", + "detect_file_write_events", + "configure_user_notification" + ], + "status": "success" + }, + "logging": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_logging", + "workflow" + ], + "status": "success" + }, + "host_isolation": { + "concerned_actions": [ + "agent_connectivity", + "configure_host_isolation", + "load_config", + "workflow" + ], + "status": "success" + }, + "events": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "detect_file_write_events", + "detect_network_events", + "configure_file_events", + "configure_network_events", + "configure_process_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "agent_connectivity", + "configure_memory_threat", + "configure_process_events", + "download_global_artifacts", + "download_user_artifacts", + "workflow", + "load_config", + "detect_process_events" + ], + "status": "success" + } + }, + "diagnostic": { + "behavior_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_diagnostic_malicious_behavior" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_diagnostic_malware", + "detect_process_events", + "detect_file_write_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "configure_process_events", + "configure_diagnostic_memory_threat" + ], + "status": "success" + } + } + }, + "name": "123", + "id": "123", + "actions": [ + { + "name": "configure_memory_threat", + "message": "Successfully enabled memory threat prevention with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_diagnostic_memory_threat", + "message": "Successfully enabled memory threat detection with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_host_isolation", + "message": "Host is not isolated", + "status": "success" + }, + { + "name": "configure_malicious_behavior", + "message": "Enabled 34 out of 34 malicious behavior rules", + "status": "success" + }, + { + "name": "configure_diagnostic_malicious_behavior", + "message": "Enabled 65 out of 65 diagnostic malicious behavior rules", + "status": "success" + }, + { + "name": "configure_user_notification", + "message": "Successfully configured user notification", + "status": "success" + }, + { + "name": "configure_malware", + "message": "Successfully enabled malware prevention", + "status": "success" + }, + { + "name": "configure_diagnostic_malware", + "message": "Successfully enabled malware detection", + "status": "success" + }, + { + "name": "configure_output", + "message": "Successfully configured output connection", + "status": "success" + }, + { + "name": "configure_logging", + "message": "Successfully configured logging", + "status": "success" + }, + { + "name": "load_config", + "message": "Successfully parsed configuration", + "status": "success" + }, + { + "name": "download_user_artifacts", + "message": "Successfully downloaded user artifacts", + "status": "success" + }, + { + "name": "download_global_artifacts", + "message": "Global artifacts are available for use", + "status": "success" + }, + { + "name": "detect_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "detect_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "detect_file_write_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_file_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "configure_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "agent_connectivity", + "message": "Successfully connected to Agent", + "status": "success" + }, + { + "name": "workflow", + "message": "Successfully executed all workflows", + "status": "success" + } + ], + "endpoint_policy_version": "1", + "version": "26", + "artifacts": { + "global": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-rules-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-exceptionlist-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-trustlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-rules-linux-v1" + } + ], + "version": "1.0.874" + }, + "user": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-blocklist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-exceptionlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-hostisolationexceptionlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-trustlist-linux-v1" + } + ], + "version": "1.0.12" + } + }, + "status": "success" + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.policy" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 1, + "ingested": "2024-01-26T14:38:32Z", + "created": "2024-01-26T14:38:30.627297556Z", + "kind": "state", + "module": "endpoint", + "action": "endpoint_policy_response", + "id": "123", + "category": ["host"], + "type": ["change"], + "dataset": "endpoint.policy" + }, + "message": "Endpoint policy change" + }, + { + "agent": { + "build": { + "original": "version: 8.6.0, compiled: Mon Jan 2 23:00:00 2023, branch: 8.6, commit: e2d09ff1b8e49bfb5f8940d317eb4ac96672d956" + }, + "id": "123", + "type": "endpoint", + "version": "8.6.0" + }, + "@timestamp": "2024-01-26T14:35:43.563903627Z", + "Endpoint": { + "configuration": { + "isolation": false + }, + "state": { + "isolation": false + }, + "policy": { + "applied": { + "response": { + "configurations": { + "behavior_protection": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_malicious_behavior" + ], + "status": "success" + }, + "streaming": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_output", + "workflow" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_malware", + "detect_process_events", + "detect_file_write_events", + "configure_user_notification" + ], + "status": "success" + }, + "logging": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "configure_logging", + "workflow" + ], + "status": "success" + }, + "host_isolation": { + "concerned_actions": [ + "agent_connectivity", + "configure_host_isolation", + "load_config", + "workflow" + ], + "status": "success" + }, + "events": { + "concerned_actions": [ + "agent_connectivity", + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "detect_file_write_events", + "detect_network_events", + "configure_file_events", + "configure_network_events", + "configure_process_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "agent_connectivity", + "configure_memory_threat", + "configure_process_events", + "download_global_artifacts", + "download_user_artifacts", + "workflow", + "load_config", + "detect_process_events" + ], + "status": "success" + } + }, + "diagnostic": { + "behavior_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_file_events", + "configure_network_events", + "configure_process_events", + "configure_diagnostic_malicious_behavior" + ], + "status": "success" + }, + "malware": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "configure_diagnostic_malware", + "detect_process_events", + "detect_file_write_events" + ], + "status": "success" + }, + "memory_protection": { + "concerned_actions": [ + "load_config", + "workflow", + "download_global_artifacts", + "download_user_artifacts", + "detect_process_events", + "configure_process_events", + "configure_diagnostic_memory_threat" + ], + "status": "success" + } + } + }, + "name": "123", + "id": "123", + "actions": [ + { + "name": "configure_memory_threat", + "message": "Successfully enabled memory threat prevention with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_diagnostic_memory_threat", + "message": "Successfully enabled memory threat detection with memory scanning enabled", + "status": "success" + }, + { + "name": "configure_host_isolation", + "message": "Host is not isolated", + "status": "success" + }, + { + "name": "configure_malicious_behavior", + "message": "Enabled 34 out of 34 malicious behavior rules", + "status": "success" + }, + { + "name": "configure_diagnostic_malicious_behavior", + "message": "Enabled 65 out of 65 diagnostic malicious behavior rules", + "status": "success" + }, + { + "name": "configure_user_notification", + "message": "Successfully configured user notification", + "status": "success" + }, + { + "name": "configure_malware", + "message": "Successfully enabled malware prevention", + "status": "success" + }, + { + "name": "configure_diagnostic_malware", + "message": "Successfully enabled malware detection", + "status": "success" + }, + { + "name": "configure_output", + "message": "Successfully configured output connection", + "status": "success" + }, + { + "name": "configure_logging", + "message": "Successfully configured logging", + "status": "success" + }, + { + "name": "load_config", + "message": "Successfully parsed configuration", + "status": "success" + }, + { + "name": "download_user_artifacts", + "message": "Successfully downloaded user artifacts", + "status": "success" + }, + { + "name": "download_global_artifacts", + "message": "Global artifacts are available for use", + "status": "success" + }, + { + "name": "detect_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "detect_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "detect_file_write_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_file_events", + "message": "Success enabling file events; current state is enabled", + "status": "success" + }, + { + "name": "configure_network_events", + "message": "Success enabling network events; current state is enabled", + "status": "success" + }, + { + "name": "configure_process_events", + "message": "Success enabling process events; current state is enabled", + "status": "success" + }, + { + "name": "agent_connectivity", + "message": "Successfully connected to Agent", + "status": "success" + }, + { + "name": "workflow", + "message": "Successfully executed all workflows", + "status": "success" + } + ], + "endpoint_policy_version": "1", + "version": "55", + "artifacts": { + "global": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "diagnostic-rules-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-blocklist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-exceptionlist" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpointelf-v1-model" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-configuration-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-exceptionlist-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "global-trustlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-malware-signature-v1-linux" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "production-rules-linux-v1" + } + ], + "version": "1.0.874" + }, + "user": { + "identifiers": [ + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-blocklist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-eventfilterlist-linux-v1" + }, + { + "sha256": "181210f8f9c779c26da1d9b2075bde0127302ee0e3fca38c9a83f5b1dd8e5d3b", + "name": "endpoint-exceptionlist-linux-v1" + }, + { + "sha256": "d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658", + "name": "endpoint-hostisolationexceptionlist-linux-v1" + }, + { + "sha256": "d801aa1fb7ddcc330a5e3173372ea6af4a3d08ec58074478e85aa5603e926658", + "name": "endpoint-trustlist-linux-v1" + } + ], + "version": "1.0.10" + } + }, + "status": "success" + } + } + }, + "ecs": { + "version": "1.11.0" + }, + "data_stream": { + "namespace": "default", + "type": "metrics", + "dataset": "endpoint.policy" + }, + "elastic": { + "agent": { + "id": "123" + } + }, + "host": { + "hostname": "123", + "os": { + "Ext": { + "variant": "Amazon Linux" + }, + "kernel": "5.10.102-99.473.amzn2.x86_64 #1 SMP Wed Mar 2 19:14:12 UTC 2022", + "name": "Linux", + "family": "amazon linux", + "type": "linux", + "version": "2", + "platform": "amazon linux", + "full": "Amazon Linux 2" + }, + "ip": ["127.0.0.1", "::1"], + "name": "123", + "id": "123", + "mac": ["aa:aa:aa:aa:aa:aa"], + "architecture": "x86_64" + }, + "event": { + "agent_id_status": "verified", + "sequence": 1, + "ingested": "2024-01-26T14:35:45Z", + "created": "2024-01-26T14:35:43.563903627Z", + "kind": "state", + "module": "endpoint", + "action": "endpoint_policy_response", + "id": "123", + "category": ["host"], + "type": ["change"], + "dataset": "endpoint.policy" + }, + "message": "Endpoint policy change" + } +] diff --git a/x-pack/plugins/security_solution/server/integration_tests/__mocks__/fleet-agents.json b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/fleet-agents.json new file mode 100644 index 00000000000000..a1c8c7731024a5 --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/__mocks__/fleet-agents.json @@ -0,0 +1,132 @@ +[ + { + "policy_coordinator_idx": 1, + "outputs": { + "default": { + "api_key": "", + "permissions_hash": "123", + "type": "elasticsearch", + "to_retire_api_key_ids": [ + { + "retired_at": "2022-11-10T17:22:38Z", + "id": "123" + } + ], + "api_key_id": "" + } + }, + "default_api_key": null, + "agent": { + "id": "123", + "version": "8.0.0" + }, + "enrolled_at": "2022-06-02T18:49:23Z", + "policy_id": "policy-elastic-agent-on-cloud", + "last_checkin_status": "online", + "active": false, + "default_api_key_history": null, + "local_metadata": { + "os": { + "kernel": "4.15.0-1027-aws", + "name": "Ubuntu", + "family": "debian", + "version": "20.04.3 LTS (Focal Fossa)", + "platform": "ubuntu", + "full": "Ubuntu focal(20.04.3 LTS (Focal Fossa))" + }, + "elastic": { + "agent": { + "build.original": "8.0.0 (build: 2ab3a7334016f570e0bfc7e9a577a35a22e02df5 at 2022-02-03 22:52:29 +0000 UTC)", + "upgradeable": false, + "log_level": "info", + "id": "123", + "version": "8.0.0", + "snapshot": false + } + }, + "host": { + "hostname": "123", + "ip": ["127.0.0.1/8", "172.17.0.85/16"], + "name": "123", + "id": "", + "mac": ["02:42:ac:11:00:55"], + "architecture": "x86_64" + } + }, + "unenrolled_reason": "timeout", + "type": "PERMANENT", + "last_checkin": "2022-06-06T20:08:36Z", + "access_api_key_id": "123", + "default_api_key_id": null, + "unenrolled_at": "2022-06-07T20:09:32Z", + "updated_at": "2022-06-07T20:09:32Z", + "policy_revision_idx": 3, + "policy_output_permissions_hash": null, + "action_seq_no": [-1] + }, + { + "policy_coordinator_idx": 1, + "outputs": { + "default": { + "api_key": "", + "permissions_hash": "123", + "type": "elasticsearch", + "to_retire_api_key_ids": [ + { + "retired_at": "2022-11-10T17:22:38Z", + "id": "123" + } + ], + "api_key_id": "" + } + }, + "default_api_key": null, + "agent": { + "id": "123", + "version": "8.1.2" + }, + "enrolled_at": "2022-06-06T20:08:27Z", + "policy_id": "policy-elastic-agent-on-cloud", + "last_checkin_status": "online", + "active": false, + "default_api_key_history": null, + "local_metadata": { + "os": { + "kernel": "5.4.0-1032-aws", + "name": "Ubuntu", + "family": "debian", + "version": "20.04.4 LTS (Focal Fossa)", + "platform": "ubuntu", + "full": "Ubuntu focal(20.04.4 LTS (Focal Fossa))" + }, + "elastic": { + "agent": { + "build.original": "8.1.2 (build: 6118f25235a52a7f0c4937a0a309e380c92d8119 at 2022-03-30 00:39:00 +0000 UTC)", + "upgradeable": false, + "log_level": "info", + "id": "123", + "version": "8.1.2", + "snapshot": false + } + }, + "host": { + "hostname": "123", + "ip": ["127.0.0.1/8", "172.17.0.69/16"], + "name": "123", + "id": "", + "mac": ["02:42:ac:11:00:45"], + "architecture": "x86_64" + } + }, + "unenrolled_reason": "timeout", + "type": "PERMANENT", + "last_checkin": "2022-06-14T18:37:15Z", + "access_api_key_id": "123", + "default_api_key_id": null, + "unenrolled_at": "2022-06-15T18:38:08Z", + "updated_at": "2022-06-15T18:38:08Z", + "policy_revision_idx": 4, + "policy_output_permissions_hash": null, + "action_seq_no": [-1] + } +] diff --git a/x-pack/plugins/security_solution/server/integration_tests/lib/helpers.ts b/x-pack/plugins/security_solution/server/integration_tests/lib/helpers.ts index 418c984fc777bb..dadfdf79ebc9e8 100644 --- a/x-pack/plugins/security_solution/server/integration_tests/lib/helpers.ts +++ b/x-pack/plugins/security_solution/server/integration_tests/lib/helpers.ts @@ -4,8 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { v4 as uuidGen } from 'uuid'; import Fs from 'fs'; import Util from 'util'; +import type { ElasticsearchClient } from '@kbn/core/server'; import deepmerge from 'deepmerge'; import { createTestServers, createRootWithCorePlugins } from '@kbn/core-test-helpers-kbn-server'; const asyncUnlink = Util.promisify(Fs.unlink); @@ -54,9 +56,6 @@ export async function setupTestServers(logFilePath: string, settings = {}) { const root = createRootWithCorePlugins( deepmerge( { - server: { - port: 9991, - }, logging: { appenders: { file: { @@ -107,3 +106,24 @@ export async function setupTestServers(logFilePath: string, settings = {}) { export async function removeFile(path: string) { await asyncUnlink(path).catch(() => void 0); } + +export async function bulkInsert( + esClient: ElasticsearchClient, + index: string, + data: unknown[], + ids: string[] = [] +): Promise { + const bulk = data.flatMap((d, i) => { + const _id = ids[i] ?? uuidGen(); + return [{ create: { _index: index, _id } }, d]; + }); + await esClient.bulk({ body: bulk, refresh: 'wait_for' }).catch(() => {}); +} + +export function updateTimestamps(data: object[]): object[] { + const currentTimeMillis = new Date().getTime(); + return data.map((d, i) => { + // wait a couple of millisecs to not make timestamps overlap + return { ...d, '@timestamp': new Date(currentTimeMillis + (i + 1) * 100) }; + }); +} diff --git a/x-pack/plugins/security_solution/server/integration_tests/lib/telemetry_helpers.ts b/x-pack/plugins/security_solution/server/integration_tests/lib/telemetry_helpers.ts index 3eb8d7aca8883c..d4656a1192b342 100644 --- a/x-pack/plugins/security_solution/server/integration_tests/lib/telemetry_helpers.ts +++ b/x-pack/plugins/security_solution/server/integration_tests/lib/telemetry_helpers.ts @@ -23,8 +23,13 @@ import { deleteExceptionList, deleteExceptionListItem, } from '@kbn/lists-plugin/server/services/exception_lists'; +import { AGENT_POLICY_SAVED_OBJECT_TYPE } from '@kbn/fleet-plugin/common/constants'; + +import { packagePolicyService } from '@kbn/fleet-plugin/server/services'; + import { ENDPOINT_ARTIFACT_LISTS } from '@kbn/securitysolution-list-constants'; import { DETECTION_TYPE, NAMESPACE_TYPE } from '@kbn/lists-plugin/common/constants.mock'; +import { bulkInsert, updateTimestamps } from './helpers'; import { TelemetryEventsSender } from '../../lib/telemetry/sender'; import type { SecuritySolutionPluginStart, @@ -33,9 +38,19 @@ import type { import type { SecurityTelemetryTask } from '../../lib/telemetry/task'; import { Plugin as SecuritySolutionPlugin } from '../../plugin'; import { AsyncTelemetryEventsSender } from '../../lib/telemetry/async_sender'; +import { type ITelemetryReceiver, TelemetryReceiver } from '../../lib/telemetry/receiver'; import { DEFAULT_DIAGNOSTIC_INDEX } from '../../lib/telemetry/constants'; import mockEndpointAlert from '../__mocks__/endpoint-alert.json'; import mockedRule from '../__mocks__/rule.json'; +import fleetAgents from '../__mocks__/fleet-agents.json'; +import endpointMetrics from '../__mocks__/endpoint-metrics.json'; +import endpointMetadata from '../__mocks__/endpoint-metadata.json'; +import endpointPolicy from '../__mocks__/endpoint-policy.json'; + +const fleetIndex = '.fleet-agents'; +const endpointMetricsIndex = '.ds-metrics-endpoint.metrics-1'; +const endpointMetricsMetadataIndex = '.ds-metrics-endpoint.metadata-1'; +const endpointMetricsPolicyIndex = '.ds-metrics-endpoint.policy-1'; export function getTelemetryTasks( spy: jest.SpyInstance< @@ -86,6 +101,30 @@ export function getAsyncTelemetryEventSender( } } +export function getTelemetryReceiver( + spy: jest.SpyInstance< + SecuritySolutionPluginStart, + [core: CoreStart, plugins: SecuritySolutionPluginStartDependencies] + > +): ITelemetryReceiver { + const pluginInstances = spy.mock.instances; + if (pluginInstances.length === 0) { + throw new Error('security_solution plugin not started'); + } + const plugin = pluginInstances[0]; + if (plugin instanceof SecuritySolutionPlugin) { + /* eslint dot-notation: "off" */ + const receiver = plugin['telemetryReceiver']; + if (receiver instanceof TelemetryReceiver) { + return receiver; + } else { + throw new Error('security_solution plugin not started'); + } + } else { + throw new Error('security_solution plugin not started'); + } +} + export function getTelemetryTask( tasks: SecurityTelemetryTask[], id: string @@ -132,6 +171,45 @@ export async function createMockedAlert( }); } +export async function mockEndpointData( + esClient: ElasticsearchClient, + so: SavedObjectsServiceStart +) { + await createAgentPolicy('policy-elastic-agent-on-cloud', esClient, so); + await bulkInsert(esClient, fleetIndex, fleetAgents, ['123', '456']); + await bulkInsert(esClient, endpointMetricsIndex, updateTimestamps(endpointMetrics)); + await bulkInsert(esClient, endpointMetricsMetadataIndex, updateTimestamps(endpointMetadata)); + await bulkInsert(esClient, endpointMetricsPolicyIndex, updateTimestamps(endpointPolicy)); +} + +export async function initEndpointIndices(esClient: ElasticsearchClient) { + const mappings: object = { + dynamic: false, + properties: { + '@timestamp': { + type: 'date', + }, + agent: { + properties: { + id: { + type: 'keyword', + }, + }, + }, + }, + }; + + await esClient.indices.create({ index: endpointMetricsIndex, mappings }).catch(() => {}); + await esClient.indices.create({ index: endpointMetricsPolicyIndex, mappings }).catch(() => {}); + await esClient.indices.create({ index: endpointMetricsMetadataIndex, mappings }).catch(() => {}); +} + +export async function dropEndpointIndices(esClient: ElasticsearchClient) { + await esClient.indices.delete({ index: endpointMetricsIndex }).catch(() => {}); + await esClient.indices.delete({ index: endpointMetricsMetadataIndex }).catch(() => {}); + await esClient.indices.delete({ index: endpointMetricsPolicyIndex }).catch(() => {}); +} + export async function cleanupMockedEndpointAlerts(esClient: ElasticsearchClient) { const index = `${DEFAULT_DIAGNOSTIC_INDEX.replace('-*', '')}-001`; @@ -162,6 +240,51 @@ export async function cleanupMockedAlerts( }); } +export async function createAgentPolicy( + id: string, + esClient: ElasticsearchClient, + so: SavedObjectsServiceStart +) { + const soClient = so.getScopedClient(fakeKibanaRequest); + const packagePolicy = { + name: 'Endpoint Policy 1', + description: 'Endpoint policy 1', + namespace: 'default', + enabled: true, + policy_id: 'policy-elastic-agent-on-cloud', + package: { name: 'endpoint', title: 'Elastic Endpoint', version: '8.11.1' }, + inputs: [ + { + config: { + policy: { + value: { + linux: { + advanced: { + agent: { + connection_delay: 60, + }, + }, + }, + }, + }, + }, + enabled: true, + type: 'endpoint', + streams: [], + }, + ], + }; + + await soClient.create(AGENT_POLICY_SAVED_OBJECT_TYPE, {}, { id }).catch(() => {}); + await packagePolicyService + .create(soClient, esClient, packagePolicy, { + id, + spaceId: 'default', + bumpRevision: false, + }) + .catch(() => {}); +} + export async function createMockedExceptionList(so: SavedObjectsServiceStart) { const type = DETECTION_TYPE; const listId = ENDPOINT_ARTIFACT_LISTS.trustedApps.id; diff --git a/x-pack/plugins/security_solution/server/integration_tests/receiver.test.ts b/x-pack/plugins/security_solution/server/integration_tests/receiver.test.ts new file mode 100644 index 00000000000000..d78a8b1b5d293d --- /dev/null +++ b/x-pack/plugins/security_solution/server/integration_tests/receiver.test.ts @@ -0,0 +1,165 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 Path from 'path'; +import type { ElasticsearchClient } from '@kbn/core/server'; + +import { bulkInsert, setupTestServers, removeFile } from './lib/helpers'; +import { getTelemetryReceiver } from './lib/telemetry_helpers'; + +import type { ITelemetryReceiver } from '../lib/telemetry/receiver'; + +import { + type TestElasticsearchUtils, + type TestKibanaUtils, +} from '@kbn/core-test-helpers-kbn-server'; +import { Plugin as SecuritySolutionPlugin } from '../plugin'; +import type { SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import type { Nullable } from '../lib/telemetry/types'; + +// not needed, but it avoids some error messages like "Error: Cross origin http://localhost forbidden" +jest.mock('axios'); + +const logFilePath = Path.join(__dirname, 'logs.log'); + +const securitySolutionPlugin = jest.spyOn(SecuritySolutionPlugin.prototype, 'start'); + +describe('ITelemetryReceiver', () => { + let esServer: TestElasticsearchUtils; + let kibanaServer: TestKibanaUtils; + let telemetryReceiver: ITelemetryReceiver; + let esClient: ElasticsearchClient; + const TEST_INDEX = 'test'; + + beforeAll(async () => { + await removeFile(logFilePath); + + const servers = await setupTestServers(logFilePath); + esServer = servers.esServer; + kibanaServer = servers.kibanaServer; + + expect(securitySolutionPlugin).toHaveBeenCalledTimes(1); + + telemetryReceiver = getTelemetryReceiver(securitySolutionPlugin); + + esClient = kibanaServer.coreStart.elasticsearch.client.asInternalUser; + }); + + afterAll(async () => { + if (kibanaServer) { + await kibanaServer.stop(); + } + if (esServer) { + await esServer.stop(); + } + }); + + beforeEach(async () => { + jest.clearAllMocks(); + await esClient.indices.create({ index: TEST_INDEX }).catch(() => {}); + }); + + afterEach(async () => { + await esClient.indices.delete({ index: TEST_INDEX }).catch(() => {}); + }); + + describe('paginate', () => { + const numOfDocs = 400; + const maxPageSizeBytes = 1_000; + + beforeEach(async () => { + telemetryReceiver.setMaxPageSizeBytes(maxPageSizeBytes); + }); + + afterEach(async () => { + await esClient.deleteByQuery({ index: TEST_INDEX }).catch(() => {}); + }); + + it('should paginate queries', async () => { + const docs = mockedDocs(numOfDocs); + await bulkInsert(esClient, TEST_INDEX, docs); + + const results = telemetryReceiver.paginate(TEST_INDEX, testQuery()); + + const pages = await getPages(results); + + const pageSize = Math.floor(maxPageSizeBytes / JSON.stringify(docs[0]).length); + expect(pages.length).toEqual(Math.ceil(numOfDocs / pageSize)); + expect(pages.flat()).toEqual(docs); + }); + + it('should return only expected data', async () => { + const from = new Date().toISOString(); + const batchOne = mockedDocs(numOfDocs); + const to = new Date().toISOString(); + + // wait for 500 ms to ensure that the timestamp of the next batch has different @timestamps + await new Promise((resolve) => setTimeout(resolve, 500)); + const batchTwo = mockedDocs(numOfDocs, 'batchTwo'); + + await bulkInsert(esClient, TEST_INDEX, batchTwo); + await bulkInsert(esClient, TEST_INDEX, batchOne); + + const results = telemetryReceiver.paginate(TEST_INDEX, testQuery(from, to)); + + const pages = await getPages(results); + + const pageSize = Math.floor(maxPageSizeBytes / JSON.stringify(batchOne[0]).length); + expect(pages.length).toEqual(Math.ceil(numOfDocs / pageSize)); + expect(pages.flat()).toEqual(batchOne); + }); + + it('should manage empty response', async () => { + await bulkInsert(esClient, TEST_INDEX, mockedDocs(numOfDocs)); + + const results = telemetryReceiver.paginate(TEST_INDEX, testQuery('now-2d', 'now-1d')); + + const pages = await getPages(results); + expect(pages.length).toEqual(0); + }); + }); + + function mockedDocs(length: number, valuePrefix: string = 'value'): object[] { + const docs = Array.from({ length }, (_, i) => ({ + '@timestamp': new Date().toISOString(), + data: { + key: `${valuePrefix}_${i}`, + }, + })); + return docs; + } + + function testQuery( + from: Nullable = undefined, + to: Nullable = undefined + ): SearchRequest { + return { + query: { + range: { + '@timestamp': { + lte: to ?? new Date().toISOString(), + gte: from ?? 'now-1d', + }, + }, + }, + sort: [ + { + '@timestamp': { + order: 'asc' as const, + }, + }, + ], + }; + } + + async function getPages(it: AsyncGenerator): Promise { + const pages = []; + for await (const doc of it) { + pages.push(doc); + } + return pages; + } +}); diff --git a/x-pack/plugins/security_solution/server/integration_tests/telemetry.test.ts b/x-pack/plugins/security_solution/server/integration_tests/telemetry.test.ts index e2357d6d614ed7..15b25a45c68c2b 100644 --- a/x-pack/plugins/security_solution/server/integration_tests/telemetry.test.ts +++ b/x-pack/plugins/security_solution/server/integration_tests/telemetry.test.ts @@ -7,12 +7,15 @@ import Path from 'path'; import axios, { type AxiosRequestConfig } from 'axios'; +import type { ElasticsearchClient } from '@kbn/core/server'; + import type { ExceptionListItemSchema, ExceptionListSchema, } from '@kbn/securitysolution-io-ts-list-types'; import { ENDPOINT_STAGING } from '@kbn/telemetry-plugin/common/constants'; +import { TELEMETRY_CHANNEL_ENDPOINT_META } from '../lib/telemetry/constants'; import { eventually, setupTestServers, removeFile } from './lib/helpers'; import { @@ -26,6 +29,9 @@ import { getTelemetryTask, getTelemetryTaskType, getTelemetryTasks, + initEndpointIndices, + dropEndpointIndices, + mockEndpointData, } from './lib/telemetry_helpers'; import { @@ -40,13 +46,14 @@ import { import type { SecurityTelemetryTask } from '../lib/telemetry/task'; import { TelemetryChannel } from '../lib/telemetry/types'; import type { AsyncTelemetryEventsSender } from '../lib/telemetry/async_sender'; +import endpointMetaTelemetryRequest from './__mocks__/endpoint-meta-telemetry-request.json'; jest.mock('axios'); const logFilePath = Path.join(__dirname, 'logs.log'); const taskManagerStartSpy = jest.spyOn(TaskManagerPlugin.prototype, 'start'); -const telemetrySenderStartSpy = jest.spyOn(SecuritySolutionPlugin.prototype, 'start'); +const securitySolutionStartSpy = jest.spyOn(SecuritySolutionPlugin.prototype, 'start'); const mockedAxiosGet = jest.spyOn(axios, 'get'); const mockedAxiosPost = jest.spyOn(axios, 'post'); @@ -58,6 +65,7 @@ describe('telemetry tasks', () => { let asyncTelemetryEventSender: AsyncTelemetryEventsSender; let exceptionsList: ExceptionListSchema[] = []; let exceptionsListItem: ExceptionListItemSchema[] = []; + let esClient: ElasticsearchClient; beforeAll(async () => { await removeFile(logFilePath); @@ -69,10 +77,10 @@ describe('telemetry tasks', () => { expect(taskManagerStartSpy).toHaveBeenCalledTimes(1); taskManagerPlugin = taskManagerStartSpy.mock.results[0].value; - expect(telemetrySenderStartSpy).toHaveBeenCalledTimes(1); + expect(securitySolutionStartSpy).toHaveBeenCalledTimes(1); - tasks = getTelemetryTasks(telemetrySenderStartSpy); - asyncTelemetryEventSender = getAsyncTelemetryEventSender(telemetrySenderStartSpy); + tasks = getTelemetryTasks(securitySolutionStartSpy); + asyncTelemetryEventSender = getAsyncTelemetryEventSender(securitySolutionStartSpy); // update queue config to not wait for a long bufferTimeSpanMillis asyncTelemetryEventSender.updateQueueConfig(TelemetryChannel.TASK_METRICS, { @@ -80,6 +88,8 @@ describe('telemetry tasks', () => { inflightEventsThreshold: 1_000, maxPayloadSizeBytes: 1024 * 1024, }); + + esClient = kibanaServer.coreStart.elasticsearch.client.asInternalUser; }); afterAll(async () => { @@ -238,6 +248,35 @@ describe('telemetry tasks', () => { }); }); + describe('endpoint-meta-telemetry', () => { + beforeEach(async () => { + await initEndpointIndices(esClient); + }); + + afterEach(async () => { + await dropEndpointIndices(esClient); + }); + + it('should execute when scheduled', async () => { + await mockAndScheduleEndpointTask(); + + const body = await eventually(async () => { + const found = mockedAxiosPost.mock.calls.find(([url]) => { + return url.startsWith(ENDPOINT_STAGING) && url.endsWith(TELEMETRY_CHANNEL_ENDPOINT_META); + }); + + expect(found).not.toBeFalsy(); + + return JSON.parse((found ? found[1] : '{}') as string); + }); + + expect(body.endpoint_metrics).toStrictEqual(endpointMetaTelemetryRequest.endpoint_metrics); + expect(body.endpoint_meta).toStrictEqual(endpointMetaTelemetryRequest.endpoint_meta); + expect(body.policy_config).toStrictEqual(endpointMetaTelemetryRequest.policy_config); + expect(body.policy_response).toStrictEqual(endpointMetaTelemetryRequest.policy_response); + }); + }); + async function mockAndScheduleDetectionRulesTask(): Promise { const task = getTelemetryTask(tasks, 'security:telemetry-detection-rules'); @@ -261,6 +300,19 @@ describe('telemetry tasks', () => { return task; } + async function mockAndScheduleEndpointTask(): Promise { + const task = getTelemetryTask(tasks, 'security:endpoint-meta-telemetry'); + + await mockEndpointData(esClient, kibanaServer.coreStart.savedObjects); + + // schedule task to run ASAP + await eventually(async () => { + await taskManagerPlugin.runSoon(task.getTaskId()); + }); + + return task; + } + async function mockAndScheduleEndpointDiagnosticsTask(): Promise { const task = getTelemetryTask(tasks, 'security:endpoint-diagnostics'); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/fleet_agent_response.ts b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/fleet_agent_response.ts index 2c9c54f696c4fe..742088da6bbb90 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/fleet_agent_response.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/fleet_agent_response.ts @@ -5,478 +5,10 @@ * 2.0. */ -import type { Agent } from '@kbn/fleet-plugin/common'; - -export const stubFleetAgentResponse: { - agents: Agent[]; - total: number; - page: number; - perPage: number; -} = { - agents: [ - { - id: '45112616-62e0-42c5-a8f9-2f8a71a92040', - type: 'PERMANENT', - active: true, - enrolled_at: '2024-01-11T03:39:21.515Z', - upgraded_at: null, - upgrade_started_at: null, - access_api_key_id: 'jY3dWnkBj1tiuAw9pAmq', - default_api_key_id: 'so3dWnkBj1tiuAw9yAm3', - policy_id: '147b2096-bd12-4b7e-a100-061dc11ba799', - last_checkin: '2024-01-11T04:00:35.217Z', - last_checkin_status: 'online', - policy_revision: 2, - packages: [], - sort: [1704944361515, 'Host-roan3tb8c3'], - components: [ - { - id: 'endpoint-0', - type: 'endpoint', - status: 'STARTING', - message: 'Running as external service', - units: [ - { - id: 'endpoint-1', - type: 'input', - status: 'STARTING', - message: 'Protecting machine', - payload: { - extra: 'payload', - }, - }, - { - id: 'shipper', - type: 'output', - status: 'STARTING', - message: 'Connected over GRPC', - payload: { - extra: 'payload', - }, - }, - ], - }, - ], - agent: { - id: '45112616-62e0-42c5-a8f9-2f8a71a92040', - version: '8.13.0', - }, - user_provided_metadata: {}, - local_metadata: { - elastic: { - agent: { - 'build.original': '8.0.0-SNAPSHOT (build: j74oz at 2021-05-07 18:42:49 +0000 UTC)', - id: '45112616-62e0-42c5-a8f9-2f8a71a92040', - log_level: 'info', - snapshot: true, - upgradeable: true, - version: '8.13.0', - }, - }, - host: { - architecture: '4nil08yn9j', - hostname: 'Host-roan3tb8c3', - id: '866c98c0-c323-4f6b-9e4c-8cc4694e4ba7', - ip: ['00.00.000.00'], - mac: ['00-00-00-00-00-00', '00-00-00-00-00-00', '0-00-00-00-00-00'], - name: 'Host-roan3tb8c3', - os: { - name: 'Windows', - full: 'Windows 10', - version: '10.0', - platform: 'Windows', - family: 'windows', - Ext: { - variant: 'Windows Pro', - }, - }, - }, - os: { - family: 'windows', - full: 'Windows 10', - kernel: '10.0.17763.1879 (Build.160101.0800)', - name: 'Windows', - platform: 'Windows', - version: '10.0', - Ext: { - variant: 'Windows Pro', - }, - }, - }, - status: 'online', - }, - { - id: '74550426-040d-4216-a227-599fd3efa91c', - type: 'PERMANENT', - active: true, - enrolled_at: '2024-01-11T03:39:21.512Z', - upgraded_at: null, - upgrade_started_at: null, - access_api_key_id: 'jY3dWnkBj1tiuAw9pAmq', - default_api_key_id: 'so3dWnkBj1tiuAw9yAm3', - policy_id: '16608650-4839-4053-a0eb-6ee9d11ac84d', - last_checkin: '2024-01-11T04:00:35.302Z', - last_checkin_status: 'online', - policy_revision: 2, - packages: [], - sort: [1704944361512, 'Host-vso4lwuc51'], - components: [ - { - id: 'endpoint-0', - type: 'endpoint', - status: 'FAILED', - message: 'Running as external service', - units: [ - { - id: 'endpoint-1', - type: 'input', - status: 'FAILED', - message: 'Protecting machine', - payload: { - error: { - code: -272, - message: 'Unable to connect to Elasticsearch', - }, - }, - }, - { - id: 'shipper', - type: 'output', - status: 'FAILED', - message: 'Connected over GRPC', - payload: { - extra: 'payload', - }, - }, - ], - }, - ], - agent: { - id: '74550426-040d-4216-a227-599fd3efa91c', - version: '8.13.0', - }, - user_provided_metadata: {}, - local_metadata: { - elastic: { - agent: { - 'build.original': '8.0.0-SNAPSHOT (build: 315fp at 2021-05-07 18:42:49 +0000 UTC)', - id: '74550426-040d-4216-a227-599fd3efa91c', - log_level: 'info', - snapshot: true, - upgradeable: true, - version: '8.13.0', - }, - }, - host: { - architecture: '3oem2enr1y', - hostname: 'Host-vso4lwuc51', - id: '3cdfece3-8b4e-4006-a19e-7ab7e953bb38', - ip: ['00.00.000.00'], - mac: ['00-00-00-00-00-00', '00-00-00-00-00-00', '0-00-00-00-00-00'], - name: 'Host-vso4lwuc51', - os: { - name: 'Windows', - full: 'Windows Server 2012', - version: '6.2', - platform: 'Windows', - family: 'windows', - Ext: { - variant: 'Windows Server', - }, - }, - }, - os: { - family: 'windows', - full: 'Windows Server 2012', - kernel: '10.0.17763.1879 (Build.160101.0800)', - name: 'Windows', - platform: 'Windows', - version: '6.2', - Ext: { - variant: 'Windows Server', - }, - }, - }, - status: 'online', - }, - { - id: 'b80bc33e-1c65-41b3-80d6-8f9757552ab1', - type: 'PERMANENT', - active: true, - enrolled_at: '2024-01-11T03:31:22.832Z', - upgraded_at: null, - upgrade_started_at: null, - access_api_key_id: 'jY3dWnkBj1tiuAw9pAmq', - default_api_key_id: 'so3dWnkBj1tiuAw9yAm3', - policy_id: '125f0769-20b4-4604-81ce-f0db812d510b', - last_checkin: '2024-01-11T04:00:36.305Z', - last_checkin_status: 'online', - policy_revision: 2, - packages: [], - sort: [1704943882832, 'Host-y0zwnrnucm'], - components: [ - { - id: 'endpoint-0', - type: 'endpoint', - status: 'STOPPING', - message: 'Running as external service', - units: [ - { - id: 'endpoint-1', - type: 'input', - status: 'STOPPING', - message: 'Protecting machine', - payload: { - extra: 'payload', - }, - }, - { - id: 'shipper', - type: 'output', - status: 'STOPPING', - message: 'Connected over GRPC', - payload: { - extra: 'payload', - }, - }, - ], - }, - ], - agent: { - id: 'b80bc33e-1c65-41b3-80d6-8f9757552ab1', - version: '8.13.0', - }, - user_provided_metadata: {}, - local_metadata: { - elastic: { - agent: { - 'build.original': '8.0.0-SNAPSHOT (build: klkq1 at 2021-05-07 18:42:49 +0000 UTC)', - id: 'b80bc33e-1c65-41b3-80d6-8f9757552ab1', - log_level: 'info', - snapshot: true, - upgradeable: true, - version: '8.13.0', - }, - }, - host: { - architecture: 'ogtqmitmts', - hostname: 'Host-y0zwnrnucm', - id: 'aca58288-ac9b-4ce7-9cef-67692fe10363', - ip: ['00.00.000.00'], - mac: ['00-00-00-00-00-00', '00-00-00-00-00-00', '0-00-00-00-00-00'], - name: 'Host-y0zwnrnucm', - os: { - name: 'macOS', - full: 'macOS Monterey', - version: '12.6.1', - platform: 'macOS', - family: 'Darwin', - Ext: { - variant: 'Darwin', - }, - }, - }, - os: { - family: 'Darwin', - full: 'macOS Monterey', - kernel: '10.0.17763.1879 (Build.160101.0800)', - name: 'macOS', - platform: 'macOS', - version: '12.6.1', - Ext: { - variant: 'Darwin', - }, - }, - }, - status: 'online', - }, - { - id: 'cbd4cda1-3bac-45a7-9914-812d3b9c5f44', - type: 'PERMANENT', - active: true, - enrolled_at: '2024-01-11T03:21:13.662Z', - upgraded_at: null, - upgrade_started_at: null, - access_api_key_id: 'jY3dWnkBj1tiuAw9pAmq', - default_api_key_id: 'so3dWnkBj1tiuAw9yAm3', - policy_id: '004e29f7-3b96-4ce3-8de8-c3024f56eae2', - last_checkin: '2024-01-11T04:00:37.315Z', - last_checkin_status: 'online', - policy_revision: 2, - packages: [], - sort: [1704943273662, 'Host-60j0gd14nc'], - components: [ - { - id: 'endpoint-0', - type: 'endpoint', - status: 'STOPPING', - message: 'Running as external service', - units: [ - { - id: 'endpoint-1', - type: 'input', - status: 'STOPPING', - message: 'Protecting machine', - payload: { - extra: 'payload', - }, - }, - { - id: 'shipper', - type: 'output', - status: 'STOPPING', - message: 'Connected over GRPC', - payload: { - extra: 'payload', - }, - }, - ], - }, - ], - agent: { - id: 'cbd4cda1-3bac-45a7-9914-812d3b9c5f44', - version: '8.13.0', - }, - user_provided_metadata: {}, - local_metadata: { - elastic: { - agent: { - 'build.original': '8.0.0-SNAPSHOT (build: slgsg at 2021-05-07 18:42:49 +0000 UTC)', - id: 'cbd4cda1-3bac-45a7-9914-812d3b9c5f44', - log_level: 'info', - snapshot: true, - upgradeable: true, - version: '8.13.0', - }, - }, - host: { - architecture: '3cgyqy4tx4', - hostname: 'Host-60j0gd14nc', - id: 'e76f684a-1f5c-4082-9a21-145d34c2d901', - ip: ['00.00.000.00'], - mac: ['00-00-00-00-00-00', '00-00-00-00-00-00', '0-00-00-00-00-00'], - name: 'Host-60j0gd14nc', - os: { - name: 'Windows', - full: 'Windows Server 2012', - version: '6.2', - platform: 'Windows', - family: 'windows', - Ext: { - variant: 'Windows Server', - }, - }, - }, - os: { - family: 'windows', - full: 'Windows Server 2012', - kernel: '10.0.17763.1879 (Build.160101.0800)', - name: 'Windows', - platform: 'Windows', - version: '6.2', - Ext: { - variant: 'Windows Server', - }, - }, - }, - status: 'online', - }, - { - id: '9918e050-035a-4764-bdd3-5cd536a7201c', - type: 'PERMANENT', - active: true, - enrolled_at: '2024-01-11T03:20:54.483Z', - upgraded_at: null, - upgrade_started_at: null, - access_api_key_id: 'jY3dWnkBj1tiuAw9pAmq', - default_api_key_id: 'so3dWnkBj1tiuAw9yAm3', - policy_id: '004e29f7-3b96-4ce3-8de8-c3024f56eae2', - last_checkin: '2024-01-11T04:00:38.328Z', - last_checkin_status: 'online', - policy_revision: 2, - packages: [], - sort: [1704943254483, 'Host-nh94b0esjr'], - components: [ - { - id: 'endpoint-0', - type: 'endpoint', - status: 'STARTING', - message: 'Running as external service', - units: [ - { - id: 'endpoint-1', - type: 'input', - status: 'STARTING', - message: 'Protecting machine', - payload: { - extra: 'payload', - }, - }, - { - id: 'shipper', - type: 'output', - status: 'STARTING', - message: 'Connected over GRPC', - payload: { - extra: 'payload', - }, - }, - ], - }, - ], - agent: { - id: '9918e050-035a-4764-bdd3-5cd536a7201c', - version: '8.13.0', - }, - user_provided_metadata: {}, - local_metadata: { - elastic: { - agent: { - 'build.original': '8.0.0-SNAPSHOT (build: pd6rl at 2021-05-07 18:42:49 +0000 UTC)', - id: '9918e050-035a-4764-bdd3-5cd536a7201c', - log_level: 'info', - snapshot: true, - upgradeable: true, - version: '8.13.0', - }, - }, - host: { - architecture: 'q5ni746k3b', - hostname: 'Host-nh94b0esjr', - id: 'd036aae1-8a97-4aa6-988c-2e178665272a', - ip: ['00.00.000.00'], - mac: ['00-00-00-00-00-00', '00-00-00-00-00-00', '0-00-00-00-00-00'], - name: 'Host-nh94b0esjr', - os: { - Ext: { - variant: 'Debian', - }, - kernel: '4.19.0-21-cloud-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30)', - name: 'Linux', - family: 'debian', - type: 'linux', - version: '10.12', - platform: 'debian', - full: 'Debian 10.12', - }, - }, - os: { - family: 'debian', - full: 'Debian 10.12', - kernel: '4.19.0-21-cloud-amd64 #1 SMP Debian 4.19.249-2 (2022-06-30)', - name: 'Linux', - platform: 'debian', - version: '10.12', - Ext: { - variant: 'Debian', - }, - type: 'linux', - }, - }, - status: 'online', - }, - ], - total: 5, - page: 1, - perPage: 10000, -}; +export const stubFleetAgentResponse: Map = new Map([ + ['45112616-62e0-42c5-a8f9-2f8a71a92040', '147b2096-bd12-4b7e-a100-061dc11ba799'], + ['74550426-040d-4216-a227-599fd3efa91c', '16608650-4839-4053-a0eb-6ee9d11ac84d'], + ['b80bc33e-1c65-41b3-80d6-8f9757552ab1', '125f0769-20b4-4604-81ce-f0db812d510b'], + ['cbd4cda1-3bac-45a7-9914-812d3b9c5f44', '004e29f7-3b96-4ce3-8de8-c3024f56eae2'], + ['9918e050-035a-4764-bdd3-5cd536a7201c', '004e29f7-3b96-4ce3-8de8-c3024f56eae2'], +]); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts index 5f430ca9e41e09..bbdb08e481c483 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/index.ts @@ -18,7 +18,7 @@ import type { ITaskMetricsService } from '../task_metrics.types'; import { type IUsageCounter } from '@kbn/usage-collection-plugin/server/usage_counters/usage_counter'; import { type UsageCounters } from '@kbn/usage-collection-plugin/common/types'; import { stubEndpointAlertResponse, stubProcessTree, stubFetchTimelineEvents } from './timeline'; -import { stubEndpointMetricsResponse } from './metrics'; +import { stubEndpointMetricsAbstractResponse, stubEndpointMetricsByIdResponse } from './metrics'; import { prebuiltRuleAlertsResponse } from './prebuilt_rule_alerts'; import type { ESClusterInfo, ESLicense } from '../types'; import { stubFleetAgentResponse } from './fleet_agent_response'; @@ -122,7 +122,8 @@ export const createMockTelemetryReceiver = ( getAlertsIndex: jest.fn().mockReturnValue('alerts-*'), fetchDiagnosticAlertsBatch: jest.fn().mockReturnValue(diagnosticsAlert ?? jest.fn()), getExperimentalFeatures: jest.fn().mockReturnValue(undefined), - fetchEndpointMetrics: jest.fn().mockReturnValue(stubEndpointMetricsResponse), + fetchEndpointMetricsAbstract: jest.fn().mockReturnValue(stubEndpointMetricsAbstractResponse), + fetchEndpointMetricsById: jest.fn().mockReturnValue(stubEndpointMetricsByIdResponse), fetchEndpointPolicyResponses: jest.fn(), fetchPrebuiltRuleAlertsBatch: jest.fn().mockReturnValue(prebuiltRuleAlertsResponse), fetchDetectionRulesPackageVersion: jest.fn(), diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/metrics.ts b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/metrics.ts index 2cf94eccb78dd4..c025468a6dc677 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/metrics.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/__mocks__/metrics.ts @@ -5,7 +5,7 @@ * 2.0. */ -export const stubEndpointMetricsResponse = { +export const stubEndpointMetricsAbstractResponse = { body: { took: 0, timed_out: false, @@ -47,71 +47,7 @@ export const stubEndpointMetricsResponse = { _id: 'ChGf7YEBj3fALY0Ne9um', _score: null, _source: { - agent: { - id: '7116aa6c-0bad-4edc-b954-860f9d487755', - type: 'endpoint', - version: '7.16.11', - }, - '@timestamp': 1657484259677, - Endpoint: { - capabilities: ['isolation'], - configuration: { - isolation: true, - }, - state: { - isolation: true, - }, - status: 'enrolled', - policy: { - applied: { - name: 'With Eventing', - id: 'C2A9093E-E289-4C0A-AA44-8C32A414FA7A', - endpoint_policy_version: 3, - version: 5, - status: 'failure', - }, - }, - }, - data_stream: { - namespace: 'default', - type: 'metrics', - dataset: 'endpoint.metadata', - }, - elastic: { - agent: { - id: '7116aa6c-0bad-4edc-b954-860f9d487755', - }, - }, - host: { - hostname: 'Host-x46nlluvd1', - os: { - Ext: { - variant: 'Windows Server Release 2', - }, - name: 'Windows', - family: 'windows', - version: '6.3', - platform: 'Windows', - full: 'Windows Server 2012R2', - }, - ip: ['10.198.33.76'], - name: 'Host-x46nlluvd1', - id: 'b85883ad-6f72-4ab5-9794-4e1f0593a15e', - mac: ['b6-f3-d2-3d-b4-95', '33-5c-95-1e-20-17', 'b0-90-8a-57-82-1f'], - architecture: '1dc25ub5gq', - }, - event: { - agent_id_status: 'auth_metadata_missing', - ingested: '2022-07-11T14:17:41Z', - created: 1657484259677, - kind: 'metric', - module: 'endpoint', - action: 'endpoint_metadata', - id: 'c7648bef-b723-4925-b9a1-b3953fbb2a23', - category: ['host'], - type: ['info'], - dataset: 'endpoint.metadata', - }, + id: '7116aa6c-0bad-4edc-b954-860f9d487755', }, sort: [1657484259677], }, @@ -124,3 +60,98 @@ export const stubEndpointMetricsResponse = { }, }, }; + +export const stubEndpointMetricsByIdResponse = { + body: { + took: 0, + timed_out: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: { + value: 2, + relation: 'eq', + }, + max_score: null, + hits: [ + { + _index: '.ds-metrics-endpoint.metadata-default-2022.07.08-000001', + _id: 'ChGf7YEBj3fALY0Ne9um', + _score: null, + _source: { + agent: { + id: '7116aa6c-0bad-4edc-b954-860f9d487755', + type: 'endpoint', + version: '7.16.11', + }, + '@timestamp': 1657484259677, + Endpoint: { + capabilities: ['isolation'], + configuration: { + isolation: true, + }, + state: { + isolation: true, + }, + status: 'enrolled', + policy: { + applied: { + name: 'With Eventing', + id: 'C2A9093E-E289-4C0A-AA44-8C32A414FA7A', + endpoint_policy_version: 3, + version: 5, + status: 'failure', + }, + }, + }, + data_stream: { + namespace: 'default', + type: 'metrics', + dataset: 'endpoint.metadata', + }, + elastic: { + agent: { + id: '7116aa6c-0bad-4edc-b954-860f9d487755', + }, + }, + host: { + hostname: 'Host-x46nlluvd1', + os: { + Ext: { + variant: 'Windows Server Release 2', + }, + name: 'Windows', + family: 'windows', + version: '6.3', + platform: 'Windows', + full: 'Windows Server 2012R2', + }, + ip: ['10.198.33.76'], + name: 'Host-x46nlluvd1', + id: 'b85883ad-6f72-4ab5-9794-4e1f0593a15e', + mac: ['b6-f3-d2-3d-b4-95', '33-5c-95-1e-20-17', 'b0-90-8a-57-82-1f'], + architecture: '1dc25ub5gq', + }, + event: { + agent_id_status: 'auth_metadata_missing', + ingested: '2022-07-11T14:17:41Z', + created: 1657484259677, + kind: 'metric', + module: 'endpoint', + action: 'endpoint_metadata', + id: 'c7648bef-b723-4925-b9a1-b3953fbb2a23', + category: ['host'], + type: ['info'], + dataset: 'endpoint.metadata', + }, + }, + sort: [1657484259677], + }, + ], + }, + }, +}; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts index a66aa855a73c94..a0f4e3ec32fee3 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/async_sender.ts @@ -234,8 +234,11 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { // exclude empty buffers rx.filter((n: Event[]) => n.length > 0), + // enrich the events + rx.map((events) => events.map((e) => this.enrich(e))), + // serialize the payloads - rx.map((events) => events.map((e) => JSON.stringify(e.payload))), + rx.map((events) => events.map((e) => this.serialize(e))), // chunk by size rx.map((values) => @@ -263,6 +266,37 @@ export class AsyncTelemetryEventsSender implements IAsyncTelemetryEventsSender { ) as rx.Observable; } + private enrich(event: Event): Event { + const clusterInfo = this.telemetryReceiver?.getClusterInfo(); + + // TODO(szaffarano): generalize the enrichment at channel level to not hardcode the logic here + if (typeof event.payload === 'object') { + let additional = {}; + + if (event.channel !== TelemetryChannel.TASK_METRICS) { + additional = { + cluster_name: clusterInfo?.cluster_name, + cluster_uuid: clusterInfo?.cluster_uuid, + }; + } else { + additional = { + cluster_uuid: clusterInfo?.cluster_uuid, + }; + } + + event.payload = { + ...event.payload, + ...additional, + }; + } + + return event; + } + + private serialize(event: Event): string { + return JSON.stringify(event.payload); + } + private async sendEvents(channel: TelemetryChannel, events: string[]): Promise { this.logger.l(`Sending ${events.length} telemetry events to channel "${channel}"`); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/configuration.ts b/x-pack/plugins/security_solution/server/lib/telemetry/configuration.ts index d5c321ec8bc136..691b0daae8f2c5 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/configuration.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/configuration.ts @@ -5,7 +5,8 @@ * 2.0. */ -import type { TelemetrySenderChannelConfiguration } from './types'; +import os from 'os'; +import type { PaginationConfiguration, TelemetrySenderChannelConfiguration } from './types'; class TelemetryConfigurationDTO { private readonly DEFAULT_TELEMETRY_MAX_BUFFER_SIZE = 100; @@ -15,6 +16,11 @@ class TelemetryConfigurationDTO { private readonly DEFAULT_MAX_DETECTION_ALERTS_BATCH = 50; private readonly DEFAULT_ASYNC_SENDER = false; private readonly DEFAULT_SENDER_CHANNELS = {}; + private readonly DEFAULT_PAGINATION_CONFIG = { + // default to 2% of host's total memory or 80MiB, whichever is smaller + max_page_size_bytes: Math.min(os.totalmem() * 0.02, 80 * 1024 * 1024), + num_docs_to_sample: 10, + }; private _telemetry_max_buffer_size = this.DEFAULT_TELEMETRY_MAX_BUFFER_SIZE; private _max_security_list_telemetry_batch = this.DEFAULT_MAX_SECURITY_LIST_TELEMETRY_BATCH; private _max_endpoint_telemetry_batch = this.DEFAULT_MAX_ENDPOINT_TELEMETRY_BATCH; @@ -24,6 +30,7 @@ class TelemetryConfigurationDTO { private _sender_channels: { [key: string]: TelemetrySenderChannelConfiguration; } = this.DEFAULT_SENDER_CHANNELS; + private _pagination_config: PaginationConfiguration = this.DEFAULT_PAGINATION_CONFIG; public get telemetry_max_buffer_size(): number { return this._telemetry_max_buffer_size; @@ -81,12 +88,22 @@ class TelemetryConfigurationDTO { return this._sender_channels; } + public set pagination_config(paginationConfiguration: PaginationConfiguration) { + this._pagination_config = paginationConfiguration; + } + + public get pagination_config(): PaginationConfiguration { + return this._pagination_config; + } + public resetAllToDefault() { this._telemetry_max_buffer_size = this.DEFAULT_TELEMETRY_MAX_BUFFER_SIZE; this._max_security_list_telemetry_batch = this.DEFAULT_MAX_SECURITY_LIST_TELEMETRY_BATCH; this._max_endpoint_telemetry_batch = this.DEFAULT_MAX_ENDPOINT_TELEMETRY_BATCH; this._max_detection_rule_telemetry_batch = this.DEFAULT_MAX_DETECTION_RULE_TELEMETRY_BATCH; this._max_detection_alerts_batch = this.DEFAULT_MAX_DETECTION_ALERTS_BATCH; + this._sender_channels = this.DEFAULT_SENDER_CHANNELS; + this._pagination_config = this.DEFAULT_PAGINATION_CONFIG; } } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts index 4ab3a68582954e..7a4d71fc398539 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/helpers.ts @@ -89,6 +89,10 @@ export const getPreviousDailyTaskTimestamp = ( return lastExecutionTimestamp; }; +export function safeValue(promise: PromiseSettledResult, defaultValue: unknown = {}): T { + return promise.status === 'fulfilled' ? promise.value : (defaultValue as T); +} + /** * Chunks an Array into an Array> * This is to prevent overloading the telemetry channel + user resources @@ -190,7 +194,7 @@ export const ruleExceptionListItemToTelemetryEvent = ( export const templateExceptionList = ( listData: ExceptionListItem[], clusterInfo: ESClusterInfo, - licenseInfo: ESLicense | undefined, + licenseInfo: Nullable, listType: string ) => { return listData.map((item) => { @@ -234,7 +238,7 @@ export const templateExceptionList = ( /** * Convert counter label list to kebab case * - * @param label_list the list of labels to create standardized UsageCounter from + * @param labelList the list of labels to create standardized UsageCounter from * @returns a string label for usage in the UsageCounter */ export const createUsageCounterLabel = (labelList: string[]): string => labelList.join('-'); @@ -256,7 +260,7 @@ export const addDefaultAdvancedPolicyConfigSettings = (policyConfig: PolicyConfi export const formatValueListMetaData = ( valueListResponse: ValueListResponse, clusterInfo: ESClusterInfo, - licenseInfo: ESLicense | undefined + licenseInfo: Nullable ) => ({ '@timestamp': moment().toISOString(), cluster_uuid: clusterInfo.cluster_uuid, @@ -360,6 +364,16 @@ export const ranges = ( return { rangeFrom, rangeTo }; }; +export const copyLicenseFields = (lic: ESLicense) => { + return { + uid: lic.uid, + status: lic.status, + type: lic.type, + ...(lic.issued_to ? { issued_to: lic.issued_to } : {}), + ...(lic.issuer ? { issuer: lic.issuer } : {}), + }; +}; + export class TelemetryTimelineFetcher { private receiver: ITelemetryReceiver; private extraInfo: Promise; @@ -445,7 +459,7 @@ export class TelemetryTimelineFetcher { const _clusterInfo: ESClusterInfo = clusterInfoPromise.status === 'fulfilled' ? clusterInfoPromise.value : ({} as ESClusterInfo); - const licenseInfo: ESLicense | undefined = + const licenseInfo: Nullable = licenseInfoPromise.status === 'fulfilled' ? licenseInfoPromise.value : ({} as ESLicense); return { clusterInfo: _clusterInfo, licenseInfo }; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts index aa7f012b550276..693892454cc562 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/receiver.ts @@ -5,6 +5,9 @@ * 2.0. */ +import os from 'os'; +import { cloneDeep } from 'lodash'; + import type { Logger, CoreStart, @@ -36,7 +39,7 @@ import type { SortResults, } from '@elastic/elasticsearch/lib/api/types'; import type { TransportResult } from '@elastic/elasticsearch'; -import type { Agent, AgentPolicy, Installation } from '@kbn/fleet-plugin/common'; +import type { AgentPolicy, Installation } from '@kbn/fleet-plugin/common'; import type { AgentClient, AgentPolicyServiceInterface, @@ -59,6 +62,7 @@ import type { SafeEndpointEvent, ResolverSchema } from '../../../common/endpoint import type { TelemetryEvent, EnhancedAlertEvent, + EndpointMetricDocument, ESLicense, ESClusterInfo, GetEndpointListResponse, @@ -69,6 +73,13 @@ import type { ValueListItemsResponseAggregation, ValueListExceptionListResponseAggregation, ValueListIndicatorMatchResponseAggregation, + Nullable, + EndpointMetricsAggregation, + EndpointMetricsAbstract, + EndpointPolicyResponseDocument, + EndpointPolicyResponseAggregation, + EndpointMetadataAggregation, + EndpointMetadataDocument, } from './types'; import { telemetryConfiguration } from './configuration'; import { ENDPOINT_METRICS_INDEX } from '../../../common/constants'; @@ -85,54 +96,83 @@ export interface ITelemetryReceiver { packageService?: PackageService ): Promise; - getClusterInfo(): ESClusterInfo | undefined; + getClusterInfo(): Nullable; fetchClusterInfo(): Promise; - fetchLicenseInfo(): Promise; - - openPointInTime(indexPattern: string): Promise; + fetchLicenseInfo(): Promise>; closePointInTime(pitId: string): Promise; - fetchDetectionRulesPackageVersion(): Promise; + fetchDetectionRulesPackageVersion(): Promise>; - fetchFleetAgents(): Promise< - | { - agents: Agent[]; - total: number; - page: number; - perPage: number; - } - | undefined - >; + /** + * As the policy id + policy version does not exist on the Endpoint Metrics document + * we need to fetch information about the Fleet Agent and sync the metrics document + * with the Agent's policy data. + * + * @returns Map of agent id to policy id + */ + fetchFleetAgents(): Promise>; + /** + * Reads Endpoint Agent policy responses out of the `.ds-metrics-endpoint.policy*` data + * stream and creates a local K/V structure that stores the policy response (V) with + * the Endpoint Agent Id (K). A value will only exist if there has been a endpoint + * enrolled in the last 24 hours OR a policy change has occurred. We only send + * non-successful responses. If the field is null, we assume no responses in + * the last 24h or no failures/warnings in the policy applied. + * + */ fetchEndpointPolicyResponses( executeFrom: string, executeTo: string - ): Promise< - TransportResult>, unknown> - >; + ): Promise>; - fetchEndpointMetrics( + /** + * Reads Endpoint Agent metrics out of the `.ds-metrics-endpoint.metrics` data stream + * and buckets them by Endpoint Agent id and sorts by the top hit. The EP agent will + * report its metrics once per day OR every time a policy change has occured. If + * a metric document(s) exists for an EP agent we map to fleet agent and policy. + */ + fetchEndpointMetricsAbstract( executeFrom: string, executeTo: string - ): Promise< - TransportResult>, unknown> - >; + ): Promise; + fetchEndpointMetricsById(ids: string[]): AsyncGenerator; + + /** + * Reads Endpoint Agent metadata out of the `.ds-metrics-endpoint.metadata` data stream + * and buckets them by Endpoint Agent id and sorts by the top hit. The EP agent will + * report its metadata once per day OR every time a policy change has occured. + * If a metadata document(s) exists for an EP agent we map to fleet agent and policy. + */ fetchEndpointMetadata( executeFrom: string, executeTo: string - ): Promise< - TransportResult>, unknown> - >; + ): Promise>; fetchDiagnosticAlertsBatch( executeFrom: string, executeTo: string ): AsyncGenerator; + /** + * Using a PIT executes the given query and returns the results in pages. + * The page size is calculated using the mean of a sample of N documents + * executing the same query. The query must have a sort attribute. + * + * @param index The index to search + * @param query The query to use + * @returns An async generator of pages of results + * + * @see {@link https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html} + * @see {ITelemetryReceiver#setMaxPageSizeBytes} + * @see {ITelemetryReceiver#setNumDocsToSample} + */ + paginate(index: string, query: ESSearchRequest): AsyncGenerator; + fetchPolicyConfigs(id: string): Promise; fetchTrustedApplications(): Promise<{ @@ -162,22 +202,9 @@ export interface ITelemetryReceiver { }>; fetchPrebuiltRuleAlertsBatch( - pitId: string, - searchAfterValue: SortResults | undefined - ): Promise<{ - moreToFetch: boolean; - newPitId: string; - searchAfter: SortResults | undefined; - alerts: TelemetryEvent[]; - }>; - - copyLicenseFields(lic: ESLicense): { - issuer?: string | undefined; - issued_to?: string | undefined; - uid: string; - status: string; - type: string; - }; + executeFrom: string, + executeTo: string + ): AsyncGenerator; fetchTimelineAlerts( index: string, @@ -201,13 +228,16 @@ export interface ITelemetryReceiver { getAlertsIndex(): string | undefined; getExperimentalFeatures(): ExperimentalFeatures | undefined; + + setMaxPageSizeBytes(bytes: number): void; + setNumDocsToSample(n: number): void; } export class TelemetryReceiver implements ITelemetryReceiver { private readonly logger: Logger; private agentClient?: AgentClient; private agentPolicyService?: AgentPolicyServiceInterface; - private esClient?: ElasticsearchClient; + private _esClient?: ElasticsearchClient; private exceptionListClient?: ExceptionListClient; private soClient?: SavedObjectsClientContract; private getIndexForType?: (type: string) => string; @@ -218,8 +248,13 @@ export class TelemetryReceiver implements ITelemetryReceiver { private experimentalFeatures: ExperimentalFeatures | undefined; private readonly maxRecords = 10_000 as const; + // default to 2% of host's total memory or 80MiB, whichever is smaller + private maxPageSizeBytes: number = Math.min(os.totalmem() * 0.02, 80 * 1024 * 1024); + // number of docs to query to estimate the size of a single doc + private numDocsToSample: number = 10; + constructor(logger: Logger) { - this.logger = logger.get('telemetry_events'); + this.logger = logger.get('telemetry_events.receiver'); } public async start( @@ -234,7 +269,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { this.alertsIndex = alertsIndex; this.agentClient = endpointContextService?.getInternalFleetServices().agent; this.agentPolicyService = endpointContextService?.getInternalFleetServices().agentPolicy; - this.esClient = core?.elasticsearch.client.asInternalUser; + this._esClient = core?.elasticsearch.client.asInternalUser; this.exceptionListClient = exceptionListClient; this.packageService = packageService; this.soClient = @@ -268,21 +303,29 @@ export class TelemetryReceiver implements ITelemetryReceiver { throw Error('elasticsearch client is unavailable: cannot retrieve fleet agents'); } - return this.agentClient?.listAgents({ - perPage: this.maxRecords, - showInactive: true, - sortField: 'enrolled_at', - sortOrder: 'desc', - }); + return ( + this.agentClient + ?.listAgents({ + perPage: this.maxRecords, + showInactive: true, + sortField: 'enrolled_at', + sortOrder: 'desc', + }) + .then((response) => { + const agents = response?.agents ?? []; + + return agents.reduce((cache, agent) => { + if (agent.policy_id !== null && agent.policy_id !== undefined) { + cache.set(agent.id, agent.policy_id); + } + + return cache; + }, new Map()); + }) ?? new Map() + ); } public async fetchEndpointPolicyResponses(executeFrom: string, executeTo: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error( - 'elasticsearch client is unavailable: cannot retrieve elastic endpoint policy responses' - ); - } - const query: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: `.ds-metrics-endpoint.policy*`, @@ -307,6 +350,17 @@ export class TelemetryReceiver implements ITelemetryReceiver { latest_response: { top_hits: { size: 1, + _source: { + includes: [ + 'agent', + 'event', + 'Endpoint.policy.applied.status', + 'Endpoint.policy.applied.actions', + 'Endpoint.policy.applied.artifacts.global', + 'Endpoint.configuration', + 'Endpoint.state', + ], + }, sort: [ { '@timestamp': { @@ -322,14 +376,22 @@ export class TelemetryReceiver implements ITelemetryReceiver { }, }; - return this.esClient.search(query, { meta: true }); + return this.esClient() + .search(query, { meta: true }) + .then((response) => response.body as unknown as EndpointPolicyResponseAggregation) + .then((failedPolicyResponses) => { + const buckets = failedPolicyResponses?.aggregations?.policy_responses?.buckets ?? []; + + // If there is no policy responses in the 24h > now then we will continue + return buckets.reduce( + (cache, endpointAgentId) => + cache.set(endpointAgentId.key, endpointAgentId.latest_response.hits.hits[0]._source), + new Map() + ); + }); } - public async fetchEndpointMetrics(executeFrom: string, executeTo: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve elastic endpoint metrics'); - } - + public async fetchEndpointMetricsAbstract(executeFrom: string, executeTo: string) { const query: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: ENDPOINT_METRICS_INDEX, @@ -354,6 +416,9 @@ export class TelemetryReceiver implements ITelemetryReceiver { latest_metrics: { top_hits: { size: 1, + _source: { + excludes: ['*'], + }, sort: [ { '@timestamp': { @@ -374,14 +439,38 @@ export class TelemetryReceiver implements ITelemetryReceiver { }, }; - return this.esClient.search(query, { meta: true }); + return this.esClient() + .search(query, { meta: true }) + .then((response) => response.body as unknown as EndpointMetricsAggregation) + .then((endpointMetricsResponse) => { + const buckets = endpointMetricsResponse?.aggregations?.endpoint_agents?.buckets ?? []; + + const endpointMetricIds = buckets.map( + (epMetrics) => epMetrics.latest_metrics.hits.hits[0]._id + ); + const totalEndpoints = buckets.length; + + return { endpointMetricIds, totalEndpoints }; + }); } - public async fetchEndpointMetadata(executeFrom: string, executeTo: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve elastic endpoint metrics'); - } + fetchEndpointMetricsById(ids: string[]): AsyncGenerator { + const query: ESSearchRequest = { + sort: [{ '@timestamp': { order: 'desc' as const } }], + query: { + ids: { + values: ids, + }, + }, + _source: { + includes: ['@timestamp', 'agent', 'Endpoint.metrics', 'elastic.agent', 'host', 'event'], + }, + }; + return this.paginate(ENDPOINT_METRICS_INDEX, query); + } + + public async fetchEndpointMetadata(executeFrom: string, executeTo: string) { const query: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: `.ds-metrics-endpoint.metadata-*`, @@ -406,6 +495,9 @@ export class TelemetryReceiver implements ITelemetryReceiver { latest_metadata: { top_hits: { size: 1, + _source: { + includes: ['@timestamp', 'agent', 'Endpoint.capabilities', 'elastic.agent'], + }, sort: [ { '@timestamp': { @@ -421,13 +513,22 @@ export class TelemetryReceiver implements ITelemetryReceiver { }, }; - return this.esClient.search(query, { meta: true }); + return this.esClient() + .search(query, { meta: true }) + .then((response) => response.body as unknown as EndpointMetadataAggregation) + .then((endpointMetadataResponse) => { + const buckets = endpointMetadataResponse?.aggregations?.endpoint_metadata?.buckets ?? []; + + return buckets.reduce((cache, endpointAgentId) => { + const doc = endpointAgentId.latest_metadata.hits.hits[0]._source; + cache.set(endpointAgentId.key, doc); + return cache; + }, new Map()); + }); } public async *fetchDiagnosticAlertsBatch(executeFrom: string, executeTo: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve diagnostic alerts'); - } + tlog(this.logger, `Searching diagnostic alerts from ${executeFrom} to ${executeTo}`); let pitId = await this.openPointInTime(DEFAULT_DIAGNOSTIC_INDEX); let fetchMore = true; @@ -458,7 +559,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { let response = null; while (fetchMore) { try { - response = await this.esClient.search(query); + response = await this.esClient().search(query); const numOfHits = response?.hits.hits.length; if (numOfHits > 0) { @@ -563,10 +664,6 @@ export class TelemetryReceiver implements ITelemetryReceiver { * @returns The elastic rules */ public async fetchDetectionRules() { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve detection rules'); - } - const query: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: this.getIndexForType?.('alert'), @@ -609,7 +706,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { }, }, }; - return this.esClient.search(query, { meta: true }); + return this.esClient().search(query, { meta: true }); } public async fetchDetectionExceptionList(listId: string, ruleVersion: number) { @@ -643,17 +740,13 @@ export class TelemetryReceiver implements ITelemetryReceiver { }; } - public async fetchPrebuiltRuleAlertsBatch( - pitId: string, - searchAfterValue: SortResults | undefined - ) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('es client is unavailable: cannot retrieve pre-built rule alert batches'); - } + public async *fetchPrebuiltRuleAlertsBatch(executeFrom: string, executeTo: string) { + tlog(this.logger, `Searching prebuilt rule alerts from ${executeFrom} to ${executeTo}`); - let newPitId = pitId; + let pitId = await this.openPointInTime(DEFAULT_DIAGNOSTIC_INDEX); let fetchMore = true; - let searchAfter: SortResults | undefined = searchAfterValue; + let searchAfter: SortResults | undefined; + const query: ESSearchRequest = { query: { bool: { @@ -738,8 +831,8 @@ export class TelemetryReceiver implements ITelemetryReceiver { { range: { '@timestamp': { - gte: 'now-1h', - lte: 'now', + gte: executeFrom, + lte: executeTo, }, }, }, @@ -758,55 +851,49 @@ export class TelemetryReceiver implements ITelemetryReceiver { let response = null; try { - response = await this.esClient.search(query); - const numOfHits = response?.hits.hits.length; - - if (numOfHits > 0) { - const lastHit = response?.hits.hits[numOfHits - 1]; - searchAfter = lastHit?.sort; - } - - fetchMore = numOfHits > 0 && numOfHits < 1_000; - } catch (e) { - tlog(this.logger, e); - fetchMore = false; - } + while (fetchMore) { + response = await this.esClient().search(query); + const numOfHits = response?.hits.hits.length; - if (response == null) { - return { - moreToFetch: false, - newPitId: pitId, - searchAfter, - alerts: [] as TelemetryEvent[], - }; - } + if (numOfHits > 0) { + const lastHit = response?.hits.hits[numOfHits - 1]; + query.search_after = lastHit?.sort; + } else { + fetchMore = false; + } - const alerts: TelemetryEvent[] = response.hits.hits.flatMap((h) => - h._source != null ? ([h._source] as TelemetryEvent[]) : [] - ); + fetchMore = numOfHits > 0 && numOfHits < 1_000; + if (response == null) { + await this.closePointInTime(pitId); + return; + } - if (response?.pit_id != null) { - newPitId = response?.pit_id; - } + const alerts: TelemetryEvent[] = response.hits.hits.flatMap((h) => + h._source != null ? ([h._source] as TelemetryEvent[]) : [] + ); - tlog(this.logger, `Prebuilt rule alerts to return: ${alerts.length}`); + if (response?.pit_id != null) { + pitId = response?.pit_id; + } - return { - moreToFetch: fetchMore, - newPitId, - searchAfter, - alerts, - }; - } + tlog(this.logger, `Prebuilt rule alerts to return: ${alerts.length}`); - public async openPointInTime(indexPattern: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('es client is unavailable: cannot retrieve pre-built rule alert batches'); + yield alerts; + } + } catch (e) { + // to keep backward compatibility with the previous implementation, silent return + // once we start using `paginate` this error should be managed downstream + tlog(this.logger, e); + return; + } finally { + await this.closePointInTime(pitId); } + } + private async openPointInTime(indexPattern: string) { const keepAlive = '5m'; const pitId: OpenPointInTimeResponse['id'] = ( - await this.esClient.openPointInTime({ + await this.esClient().openPointInTime({ index: `${indexPattern}*`, keep_alive: keepAlive, expand_wildcards: ['open' as const, 'hidden' as const], @@ -817,28 +904,20 @@ export class TelemetryReceiver implements ITelemetryReceiver { } public async closePointInTime(pitId: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('es client is unavailable: cannot retrieve pre-built rule alert batches'); - } - try { - await this.esClient.closePointInTime({ id: pitId }); + await this.esClient().closePointInTime({ id: pitId }); } catch (error) { tlog(this.logger, `Error trying to close point in time: "${pitId}". Error is: "${error}"`); } } async fetchTimelineAlerts(index: string, rangeFrom: string, rangeTo: string) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve cluster infomation'); - } - // default is from looking at Kibana saved objects and online documentation const keepAlive = '5m'; // create and assign an initial point in time let pitId: OpenPointInTimeResponse['id'] = ( - await this.esClient.openPointInTime({ + await this.esClient().openPointInTime({ index: `${index}*`, keep_alive: keepAlive, }) @@ -902,11 +981,9 @@ export class TelemetryReceiver implements ITelemetryReceiver { size: 1000, }; - tlog(this.logger, `Getting alerts with point in time (PIT) query: ${JSON.stringify(query)}`); - let response = null; try { - response = await this.esClient.search(query); + response = await this.esClient().search(query); const numOfHits = response?.hits.hits.length; if (numOfHits > 0) { @@ -929,7 +1006,7 @@ export class TelemetryReceiver implements ITelemetryReceiver { } try { - await this.esClient.closePointInTime({ id: pitId }); + await this.esClient().closePointInTime({ id: pitId }); } catch (error) { tlog( this.logger, @@ -970,10 +1047,6 @@ export class TelemetryReceiver implements ITelemetryReceiver { } public async fetchTimelineEvents(nodeIds: string[]) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve timeline endpoint events'); - } - const query: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: [`${this.alertsIndex}*`, 'logs-*'], @@ -1010,14 +1083,10 @@ export class TelemetryReceiver implements ITelemetryReceiver { }, }; - return this.esClient.search(query); + return this.esClient().search(query); } - public async fetchValueListMetaData(interval: number) { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve diagnostic alerts'); - } - + public async fetchValueListMetaData(_interval: number) { const listQuery: SearchRequest = { expand_wildcards: ['open' as const, 'hidden' as const], index: '.lists-*', @@ -1097,10 +1166,10 @@ export class TelemetryReceiver implements ITelemetryReceiver { }; const [listMetrics, itemMetrics, exceptionListMetrics, indicatorMatchMetrics] = await Promise.all([ - this.esClient.search(listQuery), - this.esClient.search(itemQuery), - this.esClient.search(exceptionListQuery), - this.esClient.search(indicatorMatchRuleQuery), + this.esClient().search(listQuery), + this.esClient().search(itemQuery), + this.esClient().search(exceptionListQuery), + this.esClient().search(indicatorMatchRuleQuery), ]); const listMetricsResponse = listMetrics as unknown as ValueListResponseAggregation; const itemMetricsResponse = itemMetrics as unknown as ValueListItemsResponseAggregation; @@ -1117,21 +1186,13 @@ export class TelemetryReceiver implements ITelemetryReceiver { } public async fetchClusterInfo(): Promise { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve cluster infomation'); - } - // @ts-expect-error version.build_date is of type estypes.DateTime - return this.esClient.info(); + return this.esClient().info(); } - public async fetchLicenseInfo(): Promise { - if (this.esClient === undefined || this.esClient === null) { - throw Error('elasticsearch client is unavailable: cannot retrieve license information'); - } - + public async fetchLicenseInfo(): Promise> { try { - const ret = (await this.esClient.transport.request({ + const ret = (await this.esClient().transport.request({ method: 'GET', path: '/_license', querystring: { @@ -1146,13 +1207,81 @@ export class TelemetryReceiver implements ITelemetryReceiver { } } - public copyLicenseFields(lic: ESLicense) { - return { - uid: lic.uid, - status: lic.status, - type: lic.type, - ...(lic.issued_to ? { issued_to: lic.issued_to } : {}), - ...(lic.issuer ? { issuer: lic.issuer } : {}), + // calculates the number of documents that can be returned per page + // or "-1" if the query returns no documents + private async docsPerPage(index: string, query: ESSearchRequest): Promise { + const sampleQuery: ESSearchRequest = { + query: cloneDeep(query.query), + size: this.numDocsToSample, + index, }; + const sampleSizeBytes = await this.esClient() + .search(sampleQuery) + .then((r) => r.hits.hits.reduce((sum, hit) => JSON.stringify(hit._source).length + sum, 0)); + const docSizeBytes = sampleSizeBytes / this.numDocsToSample; + + if (docSizeBytes === 0) { + return -1; + } + + return Math.max(Math.floor(this.maxPageSizeBytes / docSizeBytes), 1); + } + + public async *paginate(index: string, query: ESSearchRequest) { + if (query.sort == null) { + throw Error('Not possible to paginate a query without a sort attribute'); + } + + const size = await this.docsPerPage(index, query); + if (size === -1) { + return; + } + + const pit = { + id: await this.openPointInTime(index), + }; + const esQuery = { + ...cloneDeep(query), + pit, + size: Math.min(size, 10_000), + }; + try { + do { + const response = await this.esClient().search(esQuery); + const hits = response?.hits.hits.length ?? 0; + + if (hits === 0) { + return; + } + + esQuery.search_after = response?.hits.hits[hits - 1]?.sort; + + const data = response?.hits.hits.flatMap((h) => + h._source != null ? ([h._source] as T[]) : [] + ); + + yield data; + } while (esQuery.search_after !== undefined); + } catch (e) { + tlog(this.logger, `Error running paginated query: ${e}`); + throw e; + } finally { + await this.closePointInTime(pit.id); + } + } + + public setMaxPageSizeBytes(bytes: number) { + this.maxPageSizeBytes = bytes; + } + + public setNumDocsToSample(n: number) { + this.numDocsToSample = n; + } + + private esClient(): ElasticsearchClient { + if (this._esClient === undefined || this._esClient === null) { + throw Error('elasticsearch client is unavailable'); + } + return this._esClient; } } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts index 7addae79f148de..a788a59b63b719 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender.ts @@ -21,7 +21,7 @@ import type { import type { ITelemetryReceiver } from './receiver'; import { copyAllowlistedFields, filterList } from './filterlists'; import { createTelemetryTaskConfigs } from './tasks'; -import { createUsageCounterLabel, tlog } from './helpers'; +import { copyLicenseFields, createUsageCounterLabel, tlog } from './helpers'; import type { TelemetryChannel, TelemetryEvent } from './types'; import type { SecurityTelemetryTaskConfig } from './task'; import { SecurityTelemetryTask } from './task'; @@ -317,7 +317,7 @@ export class TelemetryEventsSender implements ITelemetryEventsSender { const toSend: TelemetryEvent[] = cloneDeep(this.queue).map((event) => ({ ...event, - ...(licenseInfo ? { license: this.receiver?.copyLicenseFields(licenseInfo) } : {}), + ...(licenseInfo ? { license: copyLicenseFields(licenseInfo) } : {}), cluster_uuid: clusterInfo?.cluster_uuid, cluster_name: clusterInfo?.cluster_name, })); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/sender_helpers.ts b/x-pack/plugins/security_solution/server/lib/telemetry/sender_helpers.ts index c7bb9d74ce1c52..2471b3463eb8f7 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/sender_helpers.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/sender_helpers.ts @@ -10,13 +10,19 @@ import type { TelemetryPluginStart, TelemetryPluginSetup } from '@kbn/telemetry- import type { RawAxiosRequestHeaders } from 'axios'; import { type IUsageCounter } from '@kbn/usage-collection-plugin/server/usage_counters/usage_counter'; import type { ITelemetryReceiver } from './receiver'; -import type { ESClusterInfo, ESLicense, TelemetryChannel, TelemetryCounter } from './types'; +import type { + ESClusterInfo, + ESLicense, + Nullable, + TelemetryChannel, + TelemetryCounter, +} from './types'; import { createUsageCounterLabel } from './helpers'; export interface SenderMetadata { telemetryUrl: string; - licenseInfo: ESLicense | undefined; - clusterInfo: ESClusterInfo | undefined; + licenseInfo: Nullable; + clusterInfo: Nullable; telemetryRequestHeaders: () => RawAxiosRequestHeaders; isTelemetryOptedIn(): Promise; isTelemetryServicesReachable(): Promise; diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts index b666355e3d94c1..701f42a89f4c0d 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/configuration.ts @@ -99,6 +99,13 @@ export function createTelemetryConfigurationTaskConfig() { }); } + if (configArtifact.pagination_config) { + log.l('Updating pagination configuration'); + telemetryConfiguration.pagination_config = configArtifact.pagination_config; + _receiver.setMaxPageSizeBytes(configArtifact.pagination_config.max_page_size_bytes); + _receiver.setNumDocsToSample(configArtifact.pagination_config.num_docs_to_sample); + } + taskMetricsService.end(trace); log.l(`Updated TelemetryConfiguration: ${JSON.stringify(telemetryConfiguration)}`); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts index 785bf172d19e06..f7616830716f10 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/detection_rule.ts @@ -13,10 +13,11 @@ import { templateExceptionList, newTelemetryLogger, createUsageCounterLabel, + safeValue, } from '../helpers'; import type { ITelemetryEventsSender } from '../sender'; import type { ITelemetryReceiver } from '../receiver'; -import type { ExceptionListItem, ESClusterInfo, ESLicense, RuleSearchResult } from '../types'; +import type { ExceptionListItem, RuleSearchResult } from '../types'; import type { TaskExecutionPeriod } from '../task'; import type { ITaskMetricsService } from '../task_metrics.types'; @@ -52,14 +53,8 @@ export function createTelemetryDetectionRuleListsTaskConfig(maxTelemetryBatch: n receiver.fetchLicenseInfo(), ]); - const clusterInfo = - clusterInfoPromise.status === 'fulfilled' - ? clusterInfoPromise.value - : ({} as ESClusterInfo); - const licenseInfo = - licenseInfoPromise.status === 'fulfilled' - ? licenseInfoPromise.value - : ({} as ESLicense | undefined); + const clusterInfo = safeValue(clusterInfoPromise); + const licenseInfo = safeValue(licenseInfoPromise); // Lists Telemetry: Detection Rules diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.test.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.test.ts index 7b1b59e316c7eb..fa1140545640bb 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.test.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.test.ts @@ -49,7 +49,7 @@ describe('endpoint telemetry task test', () => { ); expect(mockTelemetryReceiver.fetchFleetAgents).toHaveBeenCalled(); - expect(mockTelemetryReceiver.fetchEndpointMetrics).toHaveBeenCalledWith( + expect(mockTelemetryReceiver.fetchEndpointMetricsAbstract).toHaveBeenCalledWith( testTaskExecutionPeriod.last, testTaskExecutionPeriod.current ); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts index 89d9b954db2318..8bd9aaecf7319d 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/endpoint.ts @@ -6,18 +6,19 @@ */ import type { Logger } from '@kbn/core/server'; -import type { AgentPolicy } from '@kbn/fleet-plugin/common'; import { FLEET_ENDPOINT_PACKAGE } from '@kbn/fleet-plugin/common'; import type { ITelemetryEventsSender } from '../sender'; -import type { - EndpointMetricsAggregation, - EndpointPolicyResponseAggregation, - EndpointPolicyResponseDocument, - EndpointMetadataAggregation, - EndpointMetadataDocument, - ESClusterInfo, - ESLicense, - Nullable, +import { + TelemetryChannel, + TelemetryCounter, + type EndpointMetadataDocument, + type EndpointMetricDocument, + type EndpointMetricsAbstract, + type EndpointPolicyResponseDocument, + type ESClusterInfo, + type ESLicense, + type FleetAgentResponse, + type Nullable, } from '../types'; import type { ITelemetryReceiver } from '../receiver'; import type { TaskExecutionPeriod } from '../task'; @@ -30,14 +31,16 @@ import { getPreviousDailyTaskTimestamp, isPackagePolicyList, newTelemetryLogger, + safeValue, } from '../helpers'; +import type { TelemetryLogger } from '../telemetry_logger'; import type { PolicyData } from '../../../../common/endpoint/types'; import { TELEMETRY_CHANNEL_ENDPOINT_META } from '../constants'; // Endpoint agent uses this Policy ID while it's installing. const DefaultEndpointPolicyIdToIgnore = '00000000-0000-0000-0000-000000000000'; -const EmptyFleetAgentResponse = { +const EmptyFleetAgentResponse: FleetAgentResponse = { agents: [], total: 0, page: 0, @@ -47,11 +50,10 @@ const EmptyFleetAgentResponse = { const usageLabelPrefix: string[] = ['security_telemetry', 'endpoint_task']; export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { - const taskName = 'Security Solution Telemetry Endpoint Metrics and Info task'; const taskType = 'security:endpoint-meta-telemetry'; return { type: taskType, - title: taskName, + title: 'Security Solution Telemetry Endpoint Metrics and Info task', interval: '24h', timeout: '5m', version: '1.0.0', @@ -75,19 +77,8 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { if (!taskExecutionPeriod.last) { throw new Error('last execution timestamp is required'); } - const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ - receiver.fetchClusterInfo(), - receiver.fetchLicenseInfo(), - ]); - const clusterInfo = - clusterInfoPromise.status === 'fulfilled' - ? clusterInfoPromise.value - : ({} as ESClusterInfo); - const licenseInfo = - licenseInfoPromise.status === 'fulfilled' - ? licenseInfoPromise.value - : ({} as ESLicense | undefined); + const clusterData = await fetchClusterData(receiver); const endpointData = await fetchEndpointData( receiver, @@ -95,275 +86,91 @@ export function createTelemetryEndpointTaskConfig(maxTelemetryBatch: number) { taskExecutionPeriod.current ); - /** STAGE 1 - Fetch Endpoint Agent Metrics - * - * Reads Endpoint Agent metrics out of the `.ds-metrics-endpoint.metrics` data stream - * and buckets them by Endpoint Agent id and sorts by the top hit. The EP agent will - * report its metrics once per day OR every time a policy change has occured. If - * a metric document(s) exists for an EP agent we map to fleet agent and policy + /** + * STAGE 1 - Fetch Endpoint Agent Metrics + * If no metrics exist, then abort execution, otherwise increment + * the usage counter and continue. */ - if (endpointData.endpointMetrics === undefined) { + if (endpointData.endpointMetrics.totalEndpoints === 0) { log.l('no endpoint metrics to report'); taskMetricsService.end(trace); return 0; } - const { body: endpointMetricsResponse } = endpointData.endpointMetrics as unknown as { - body: EndpointMetricsAggregation; - }; - - if (endpointMetricsResponse.aggregations === undefined) { - log.l(`no endpoint metrics to report`); - taskMetricsService.end(trace); - return 0; - } - const telemetryUsageCounter = sender.getTelemetryUsageCluster(); telemetryUsageCounter?.incrementCounter({ counterName: createUsageCounterLabel( - usageLabelPrefix.concat(['payloads', TELEMETRY_CHANNEL_ENDPOINT_META]) + usageLabelPrefix.concat(['payloads', TelemetryChannel.ENDPOINT_META]) ), - counterType: 'num_endpoint', - incrementBy: endpointMetricsResponse.aggregations.endpoint_count.value, + counterType: TelemetryCounter.NUM_ENDPOINT, + incrementBy: endpointData.endpointMetrics.totalEndpoints, }); - const endpointMetrics = endpointMetricsResponse.aggregations.endpoint_agents.buckets.map( - (epMetrics) => { - return { - endpoint_agent: epMetrics.latest_metrics.hits.hits[0]._source.agent.id, - endpoint_version: epMetrics.latest_metrics.hits.hits[0]._source.agent.version, - endpoint_metrics: epMetrics.latest_metrics.hits.hits[0]._source, - }; - } - ); - - /** STAGE 2 - Fetch Fleet Agent Config - * - * As the policy id + policy version does not exist on the Endpoint Metrics document - * we need to fetch information about the Fleet Agent and sync the metrics document - * with the Agent's policy data. - * + /** + * STAGE 2 + * - Fetch Fleet Agent Config + * - Ignore policy used while installing the endpoint agent. + * - Fetch Endpoint Policy Configs */ - const agentsResponse = endpointData.fleetAgentsResponse; - - if (agentsResponse === undefined) { - log.l('no fleet agent information available'); - taskMetricsService.end(trace); - return 0; - } + const policyIdByAgent = endpointData.policyIdByAgent; + endpointData.policyIdByAgent.delete(DefaultEndpointPolicyIdToIgnore); + const endpointPolicyById = await endpointPolicies(policyIdByAgent.values(), receiver, log); - const fleetAgents = agentsResponse.agents.reduce((cache, agent) => { - if (agent.id === DefaultEndpointPolicyIdToIgnore) { - return cache; - } - - if (agent.policy_id !== null && agent.policy_id !== undefined) { - cache.set(agent.id, agent.policy_id); - } - - return cache; - }, new Map()); - - const endpointPolicyCache = new Map(); - for (const policyInfo of fleetAgents.values()) { - if ( - policyInfo !== null && - policyInfo !== undefined && - !endpointPolicyCache.has(policyInfo) - ) { - let agentPolicy: Nullable; - try { - agentPolicy = await receiver.fetchPolicyConfigs(policyInfo); - } catch (err) { - log.l(`error fetching policy config due to ${err?.message}`); - } - const packagePolicies = agentPolicy?.package_policies; - - if (packagePolicies !== undefined && isPackagePolicyList(packagePolicies)) { - packagePolicies - .map((pPolicy) => pPolicy as PolicyData) - .forEach((pPolicy) => { - if ( - pPolicy.inputs[0]?.config !== undefined && - pPolicy.inputs[0]?.config !== null - ) { - pPolicy.inputs.forEach((input) => { - if ( - input.type === FLEET_ENDPOINT_PACKAGE && - input?.config !== undefined && - policyInfo !== undefined - ) { - endpointPolicyCache.set(policyInfo, pPolicy); - } - }); - } - }); - } - } - } - - /** STAGE 3 - Fetch Endpoint Policy Responses - * - * Reads Endpoint Agent policy responses out of the `.ds-metrics-endpoint.policy*` data - * stream and creates a local K/V structure that stores the policy response (V) with - * the Endpoint Agent Id (K). A value will only exist if there has been a endpoint - * enrolled in the last 24 hours OR a policy change has occurred. We only send - * non-successful responses. If the field is null, we assume no responses in - * the last 24h or no failures/warnings in the policy applied. - * + /** + * STAGE 3 - Fetch Endpoint Policy Responses */ - const { body: failedPolicyResponses } = endpointData.epPolicyResponse as unknown as { - body: EndpointPolicyResponseAggregation; - }; - - // If there is no policy responses in the 24h > now then we will continue - const policyResponses = failedPolicyResponses.aggregations - ? failedPolicyResponses.aggregations.policy_responses.buckets.reduce( - (cache, endpointAgentId) => { - const doc = endpointAgentId.latest_response.hits.hits[0]; - cache.set(endpointAgentId.key, doc); - return cache; - }, - new Map() - ) - : new Map(); - - /** STAGE 4 - Fetch Endpoint Agent Metadata - * - * Reads Endpoint Agent metadata out of the `.ds-metrics-endpoint.metadata` data stream - * and buckets them by Endpoint Agent id and sorts by the top hit. The EP agent will - * report its metadata once per day OR every time a policy change has occured. If - * a metadata document(s) exists for an EP agent we map to fleet agent and policy - */ - if (endpointData.endpointMetadata === undefined) { - log.l(`no endpoint metadata to report`); + const policyResponses = endpointData.epPolicyResponse; + if (policyResponses.size === 0) { + log.l('no endpoint policy responses to report'); } - const { body: endpointMetadataResponse } = endpointData.endpointMetadata as unknown as { - body: EndpointMetadataAggregation; - }; - - if (endpointMetadataResponse.aggregations === undefined) { + /** + * STAGE 4 - Fetch Endpoint Agent Metadata + */ + const endpointMetadata = endpointData.endpointMetadata; + if (endpointMetadata.size === 0) { log.l(`no endpoint metadata to report`); } - const endpointMetadata = - endpointMetadataResponse.aggregations.endpoint_metadata.buckets.reduce( - (cache, endpointAgentId) => { - const doc = endpointAgentId.latest_metadata.hits.hits[0]; - cache.set(endpointAgentId.key, doc); - return cache; - }, - new Map() - ); /** STAGE 5 - Create the telemetry log records * * Iterates through the endpoint metrics documents at STAGE 1 and joins them together * to form the telemetry log that is sent back to Elastic Security developers to * make improvements to the product. - * */ - try { - const telemetryPayloads = endpointMetrics.map((endpoint) => { - let policyConfig = null; - let failedPolicy = null; - let endpointMetadataById = null; - - const fleetAgentId = endpoint.endpoint_metrics.elastic.agent.id; - const endpointAgentId = endpoint.endpoint_agent; - - const policyInformation = fleetAgents.get(fleetAgentId); - if (policyInformation) { - policyConfig = endpointPolicyCache.get(policyInformation) || null; - - if (policyConfig) { - failedPolicy = policyResponses.get(endpointAgentId); - } - } - - if (endpointMetadata) { - endpointMetadataById = endpointMetadata.get(endpointAgentId); - } + const mappingContext = { + policyIdByAgent, + endpointPolicyById, + policyResponses, + endpointMetadata, + taskExecutionPeriod, + clusterData, + }; + const telemetryPayloads = []; + for await (const metrics of receiver.fetchEndpointMetricsById( + endpointData.endpointMetrics.endpointMetricIds + )) { + const payloads = metrics.map((endpointMetric) => + mapEndpointMetric(endpointMetric, mappingContext) + ); + telemetryPayloads.push(...payloads); + } - const { - cpu, - memory, - uptime, - documents_volume: documentsVolume, - malicious_behavior_rules: maliciousBehaviorRules, - system_impact: systemImpact, - threads, - event_filter: eventFilter, - } = endpoint.endpoint_metrics.Endpoint.metrics; - const endpointPolicyDetail = extractEndpointPolicyConfig(policyConfig); - if (endpointPolicyDetail) { - endpointPolicyDetail.value = addDefaultAdvancedPolicyConfigSettings( - endpointPolicyDetail.value - ); - } - return { - '@timestamp': taskExecutionPeriod.current, - cluster_uuid: clusterInfo.cluster_uuid, - cluster_name: clusterInfo.cluster_name, - license_id: licenseInfo?.uid, - endpoint_id: endpointAgentId, - endpoint_version: endpoint.endpoint_version, - endpoint_package_version: policyConfig?.package?.version || null, - endpoint_metrics: { - cpu: cpu.endpoint, - memory: memory.endpoint.private, - uptime, - documentsVolume, - maliciousBehaviorRules, - systemImpact, - threads, - eventFilter, - }, - endpoint_meta: { - os: endpoint.endpoint_metrics.host.os, - capabilities: - endpointMetadataById !== null && endpointMetadataById !== undefined - ? endpointMetadataById._source.Endpoint.capabilities - : [], - }, - policy_config: endpointPolicyDetail !== null ? endpointPolicyDetail : {}, - policy_response: - failedPolicy !== null && failedPolicy !== undefined - ? { - agent_policy_status: failedPolicy._source.event.agent_id_status, - manifest_version: - failedPolicy._source.Endpoint.policy.applied.artifacts.global.version, - status: failedPolicy._source.Endpoint.policy.applied.status, - actions: failedPolicy._source.Endpoint.policy.applied.actions - .map((action) => (action.status !== 'success' ? action : null)) - .filter((action) => action !== null), - configuration: failedPolicy._source.Endpoint.configuration, - state: failedPolicy._source.Endpoint.state, - } - : {}, - telemetry_meta: { - metrics_timestamp: endpoint.endpoint_metrics['@timestamp'], - }, - }; - }); + log.l(`sending ${telemetryPayloads.length} endpoint telemetry records`); - /** - * STAGE 6 - Send the documents - * - * Send the documents in a batches of maxTelemetryBatch - */ - const batches = batchTelemetryRecords(telemetryPayloads, maxTelemetryBatch); - for (const batch of batches) { - await sender.sendOnDemand(TELEMETRY_CHANNEL_ENDPOINT_META, batch); - } - taskMetricsService.end(trace); - return telemetryPayloads.length; - } catch (err) { - logger.warn(`could not complete endpoint alert telemetry task due to ${err?.message}`); - taskMetricsService.end(trace, err); - return 0; + /** + * STAGE 6 - Send the documents + * + * Send the documents in a batches of maxTelemetryBatch + */ + const batches = batchTelemetryRecords(telemetryPayloads, maxTelemetryBatch); + for (const batch of batches) { + await sender.sendOnDemand(TELEMETRY_CHANNEL_ENDPOINT_META, batch); } + taskMetricsService.end(trace); + return telemetryPayloads.length; } catch (err) { + log.warn(`could not complete endpoint alert telemetry task due to ${err?.message}`, err); taskMetricsService.end(trace, err); return 0; } @@ -375,22 +182,165 @@ async function fetchEndpointData( receiver: ITelemetryReceiver, executeFrom: string, executeTo: string -) { - const [fleetAgentsResponse, epMetricsResponse, policyResponse, endpointMetadata] = +): Promise<{ + policyIdByAgent: Map; + endpointMetrics: EndpointMetricsAbstract; + epPolicyResponse: Map; + endpointMetadata: Map; +}> { + const [policyIdByAgent, epMetricsAbstractResponse, policyResponse, endpointMetadata] = await Promise.allSettled([ receiver.fetchFleetAgents(), - receiver.fetchEndpointMetrics(executeFrom, executeTo), + receiver.fetchEndpointMetricsAbstract(executeFrom, executeTo), receiver.fetchEndpointPolicyResponses(executeFrom, executeTo), receiver.fetchEndpointMetadata(executeFrom, executeTo), ]); return { - fleetAgentsResponse: - fleetAgentsResponse.status === 'fulfilled' - ? fleetAgentsResponse.value - : EmptyFleetAgentResponse, - endpointMetrics: epMetricsResponse.status === 'fulfilled' ? epMetricsResponse.value : undefined, - epPolicyResponse: policyResponse.status === 'fulfilled' ? policyResponse.value : undefined, - endpointMetadata: endpointMetadata.status === 'fulfilled' ? endpointMetadata.value : undefined, + policyIdByAgent: safeValue(policyIdByAgent, EmptyFleetAgentResponse), + endpointMetrics: safeValue(epMetricsAbstractResponse), + epPolicyResponse: safeValue(policyResponse), + endpointMetadata: safeValue(endpointMetadata), + }; +} + +async function fetchClusterData( + receiver: ITelemetryReceiver +): Promise<{ clusterInfo: ESClusterInfo; licenseInfo: Nullable }> { + const [clusterInfoPromise, licenseInfoPromise] = await Promise.allSettled([ + receiver.fetchClusterInfo(), + receiver.fetchLicenseInfo(), + ]); + + const clusterInfo = safeValue(clusterInfoPromise); + const licenseInfo = safeValue(licenseInfoPromise); + + return { clusterInfo, licenseInfo }; +} + +async function endpointPolicies( + policyIds: IterableIterator, + receiver: ITelemetryReceiver, + log: TelemetryLogger +) { + const endpointPolicyCache = new Map(); + for (const policyId of policyIds) { + if (policyId !== null && policyId !== undefined && !endpointPolicyCache.has(policyId)) { + const agentPolicy = await receiver.fetchPolicyConfigs(policyId).catch((e) => { + log.l(`error fetching policy config due to ${e?.message}`); + return null; + }); + + const packagePolicies = agentPolicy?.package_policies; + + if (packagePolicies !== undefined && isPackagePolicyList(packagePolicies)) { + packagePolicies + .map((pPolicy) => pPolicy as PolicyData) + .forEach((pPolicy) => { + if (pPolicy.inputs[0]?.config !== undefined && pPolicy.inputs[0]?.config !== null) { + pPolicy.inputs.forEach((input) => { + if ( + input.type === FLEET_ENDPOINT_PACKAGE && + input?.config !== undefined && + policyId !== undefined + ) { + endpointPolicyCache.set(policyId, pPolicy); + } + }); + } + }); + } + } + } + return endpointPolicyCache; +} + +function mapEndpointMetric( + endpointMetric: EndpointMetricDocument, + ctx: { + policyIdByAgent: Map; + endpointPolicyById: Map; + policyResponses: Map; + endpointMetadata: Map; + taskExecutionPeriod: TaskExecutionPeriod; + clusterData: { clusterInfo: ESClusterInfo; licenseInfo: Nullable }; + } +) { + let policyConfig = null; + let failedPolicy: Nullable = null; + let endpointMetadataById = null; + + const fleetAgentId = endpointMetric.elastic.agent.id; + const endpointAgentId = endpointMetric.agent.id; + + const policyId = ctx.policyIdByAgent.get(fleetAgentId); + if (policyId) { + policyConfig = ctx.endpointPolicyById.get(policyId) || null; + + if (policyConfig) { + failedPolicy = ctx.policyResponses.get(endpointAgentId); + } + } + + if (ctx.endpointMetadata) { + endpointMetadataById = ctx.endpointMetadata.get(endpointAgentId); + } + + const { + cpu, + memory, + uptime, + documents_volume: documentsVolume, + malicious_behavior_rules: maliciousBehaviorRules, + system_impact: systemImpact, + threads, + event_filter: eventFilter, + } = endpointMetric.Endpoint.metrics; + const endpointPolicyDetail = extractEndpointPolicyConfig(policyConfig); + if (endpointPolicyDetail) { + endpointPolicyDetail.value = addDefaultAdvancedPolicyConfigSettings(endpointPolicyDetail.value); + } + return { + '@timestamp': ctx.taskExecutionPeriod.current, + cluster_uuid: ctx.clusterData.clusterInfo.cluster_uuid, + cluster_name: ctx.clusterData.clusterInfo.cluster_name, + license_id: ctx.clusterData.licenseInfo?.uid, + endpoint_id: endpointAgentId, + endpoint_version: endpointMetric.agent.version, + endpoint_package_version: policyConfig?.package?.version || null, + endpoint_metrics: { + cpu: cpu.endpoint, + memory: memory.endpoint.private, + uptime, + documentsVolume, + maliciousBehaviorRules, + systemImpact, + threads, + eventFilter, + }, + endpoint_meta: { + os: endpointMetric.host.os, + capabilities: + endpointMetadataById !== null && endpointMetadataById !== undefined + ? endpointMetadataById.Endpoint.capabilities + : [], + }, + policy_config: endpointPolicyDetail !== null ? endpointPolicyDetail : {}, + policy_response: + failedPolicy !== null && failedPolicy !== undefined + ? { + agent_policy_status: failedPolicy.event.agent_id_status, + manifest_version: failedPolicy.Endpoint.policy.applied.artifacts.global.version, + status: failedPolicy.Endpoint.policy.applied.status, + actions: failedPolicy.Endpoint.policy.applied.actions + .map((action) => (action.status !== 'success' ? action : null)) + .filter((action) => action !== null), + configuration: failedPolicy.Endpoint.configuration, + state: failedPolicy.Endpoint.state, + } + : {}, + telemetry_meta: { + metrics_timestamp: endpointMetric['@timestamp'], + }, }; } diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts index 27285e906d1363..921ff422bded50 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/prebuilt_rule_alerts.ts @@ -6,14 +6,19 @@ */ import type { Logger } from '@kbn/core/server'; -import type { SortResults } from '@elastic/elasticsearch/lib/api/types'; import type { ITelemetryEventsSender } from '../sender'; import type { ITelemetryReceiver } from '../receiver'; import type { ITaskMetricsService } from '../task_metrics.types'; -import type { ESClusterInfo, ESLicense, TelemetryEvent } from '../types'; +import type { TelemetryEvent } from '../types'; import type { TaskExecutionPeriod } from '../task'; import { TELEMETRY_CHANNEL_DETECTION_ALERTS } from '../constants'; -import { batchTelemetryRecords, processK8sUsernames, newTelemetryLogger } from '../helpers'; +import { + batchTelemetryRecords, + processK8sUsernames, + newTelemetryLogger, + getPreviousDailyTaskTimestamp, + safeValue, +} from '../helpers'; import { copyAllowlistedFields, filterList } from '../filterlists'; export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: number) { @@ -26,6 +31,7 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n interval: '1h', timeout: '15m', version: taskVersion, + getLastExecutionTime: getPreviousDailyTaskTimestamp, runTask: async ( taskId: string, logger: Logger, @@ -48,16 +54,10 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n receiver.fetchDetectionRulesPackageVersion(), ]); - const clusterInfo = - clusterInfoPromise.status === 'fulfilled' - ? clusterInfoPromise.value - : ({} as ESClusterInfo); - const licenseInfo = - licenseInfoPromise.status === 'fulfilled' - ? licenseInfoPromise.value - : ({} as ESLicense | undefined); - const packageInfo = - packageVersion.status === 'fulfilled' ? packageVersion.value : undefined; + const clusterInfo = safeValue(clusterInfoPromise); + const licenseInfo = safeValue(licenseInfoPromise); + const packageInfo = safeValue(packageVersion, undefined); + const index = receiver.getAlertsIndex(); if (index === undefined) { @@ -66,23 +66,15 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n return 0; } - let fetchMore = true; - let searchAfterValue: SortResults | undefined; - let pitId = await receiver.openPointInTime(index); - - while (fetchMore) { - const { moreToFetch, newPitId, searchAfter, alerts } = - await receiver.fetchPrebuiltRuleAlertsBatch(pitId, searchAfterValue); - + for await (const alerts of receiver.fetchPrebuiltRuleAlertsBatch( + taskExecutionPeriod.last ?? 'now-1h', + taskExecutionPeriod.current + )) { if (alerts.length === 0) { taskMetricsService.end(trace); return 0; } - fetchMore = moreToFetch; - searchAfterValue = searchAfter; - pitId = newPitId; - const processedAlerts = alerts.map( (event: TelemetryEvent): TelemetryEvent => copyAllowlistedFields(filterList.prebuiltRulesAlerts, event) @@ -115,7 +107,6 @@ export function createTelemetryPrebuiltRuleAlertsTaskConfig(maxTelemetryBatch: n } taskMetricsService.end(trace); - await receiver.closePointInTime(pitId); return 0; } catch (err) { logger.error('could not complete prebuilt alerts telemetry task'); diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts index 35181b0f73f7f4..cc51fa7ba6d5b2 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/tasks/security_lists.ts @@ -13,7 +13,7 @@ import { LIST_TRUSTED_APPLICATION, TELEMETRY_CHANNEL_LISTS, } from '../constants'; -import type { ESClusterInfo, ESLicense } from '../types'; +import type { ESClusterInfo, ESLicense, Nullable } from '../types'; import { batchTelemetryRecords, templateExceptionList, @@ -69,7 +69,7 @@ export function createTelemetrySecurityListTaskConfig(maxTelemetryBatch: number) const licenseInfo = licenseInfoPromise.status === 'fulfilled' ? licenseInfoPromise.value - : ({} as ESLicense | undefined); + : ({} as Nullable); const FETCH_VALUE_LIST_META_DATA_INTERVAL_IN_HOURS = 24; // Lists Telemetry: Trusted Applications diff --git a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts index 46a8bc21faaef0..eafe04c96a5ab3 100644 --- a/x-pack/plugins/security_solution/server/lib/telemetry/types.ts +++ b/x-pack/plugins/security_solution/server/lib/telemetry/types.ts @@ -5,6 +5,8 @@ * 2.0. */ +import type { Agent } from '@kbn/fleet-plugin/common'; + import type { AlertEvent, ResolverNode, SafeResolverEvent } from '../../../common/endpoint/types'; import type { AllowlistFields } from './filterlists/types'; @@ -102,6 +104,7 @@ export enum TelemetryCounter { FATAL_ERROR = 'fatal_error', TELEMETRY_OPTED_OUT = 'telemetry_opted_out', TELEMETRY_NOT_REACHABLE = 'telemetry_not_reachable', + NUM_ENDPOINT = 'num_endpoint', } // EP Policy Response @@ -124,7 +127,7 @@ export interface EndpointPolicyResponseAggregation { interface EndpointPolicyResponseHits { hits: { total: { value: number }; - hits: EndpointPolicyResponseDocument[]; + hits: Array<{ _source: EndpointPolicyResponseDocument }>; }; } @@ -133,33 +136,30 @@ interface NonPolicyConfiguration { } export interface EndpointPolicyResponseDocument { - _source: { - '@timestamp': string; - agent: { - id: string; - }; - event: { - agent_id_status: string; - }; - Endpoint: { - policy: { - applied: { - actions: Array<{ - name: string; - message: string; - status: string; - }>; - artifacts: { - global: { - version: string; - }; - }; + agent: { + id: string; + }; + event: { + agent_id_status: string; + }; + Endpoint: { + policy: { + applied: { + actions: Array<{ + name: string; + message: string; status: string; + }>; + artifacts: { + global: { + version: string; + }; }; + status: string; }; - configuration: NonPolicyConfiguration; - state: NonPolicyConfiguration; }; + configuration: NonPolicyConfiguration; + state: NonPolicyConfiguration; }; } @@ -180,32 +180,35 @@ export interface EndpointMetricsAggregation { interface EndpointMetricHits { hits: { total: { value: number }; - hits: EndpointMetricDocument[]; + hits: Array<{ _id: string; _source: EndpointMetricDocument }>; }; } -interface EndpointMetricDocument { - _source: { - '@timestamp': string; +export interface EndpointMetricDocument { + '@timestamp': string; + agent: { + id: string; + version: string; + }; + Endpoint: { + metrics: EndpointMetrics; + }; + elastic: { agent: { id: string; - version: string; - }; - Endpoint: { - metrics: EndpointMetrics; - }; - elastic: { - agent: { - id: string; - }; - }; - host: { - os: EndpointMetricOS; - }; - event: { - agent_id_status: string; }; }; + host: { + os: EndpointMetricOS; + }; + event: { + agent_id_status: string; + }; +} + +export interface EndpointMetricsAbstract { + endpointMetricIds: string[]; + totalEndpoints: number; } interface DocumentsVolumeMetrics { @@ -308,24 +311,22 @@ export interface EndpointMetadataAggregation { interface EndpointMetadataHits { hits: { total: { value: number }; - hits: EndpointMetadataDocument[]; + hits: Array<{ _source: EndpointMetadataDocument }>; }; } export interface EndpointMetadataDocument { - _source: { - '@timestamp': string; + '@timestamp': string; + agent: { + id: string; + version: string; + }; + Endpoint: { + capabilities: string[]; + }; + elastic: { agent: { id: string; - version: string; - }; - Endpoint: { - capabilities: string[]; - }; - elastic: { - agent: { - id: string; - }; }; }; } @@ -463,6 +464,12 @@ export interface TelemetryConfiguration { sender_channels?: { [key: string]: TelemetrySenderChannelConfiguration; }; + pagination_config?: PaginationConfiguration; +} + +export interface PaginationConfiguration { + max_page_size_bytes: number; + num_docs_to_sample: number; } export interface TelemetrySenderChannelConfiguration { @@ -488,7 +495,7 @@ export type Nullable = T | null | undefined; export interface ExtraInfo { clusterInfo: ESClusterInfo; - licenseInfo: ESLicense | undefined; + licenseInfo: Nullable; } export interface TimeFrame { @@ -501,3 +508,10 @@ export interface TimelineResult { events: number; timeline: TimelineTelemetryTemplate | undefined; } + +export interface FleetAgentResponse { + agents: Agent[]; + total: number; + page: number; + perPage: number; +} diff --git a/x-pack/plugins/stack_connectors/common/openai/schema.ts b/x-pack/plugins/stack_connectors/common/openai/schema.ts index 1154c808154b17..e0b5be9d2ac18f 100644 --- a/x-pack/plugins/stack_connectors/common/openai/schema.ts +++ b/x-pack/plugins/stack_connectors/common/openai/schema.ts @@ -13,11 +13,13 @@ export const ConfigSchema = schema.oneOf([ schema.object({ apiProvider: schema.oneOf([schema.literal(OpenAiProviderType.AzureAi)]), apiUrl: schema.string(), + headers: schema.maybe(schema.recordOf(schema.string(), schema.string())), }), schema.object({ apiProvider: schema.oneOf([schema.literal(OpenAiProviderType.OpenAi)]), apiUrl: schema.string(), defaultModel: schema.string({ defaultValue: DEFAULT_OPENAI_MODEL }), + headers: schema.maybe(schema.recordOf(schema.string(), schema.string())), }), ]); diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts index da7d3ef05f3580..96791d50c7f854 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.test.ts @@ -63,6 +63,10 @@ describe('OpenAIConnector', () => { apiUrl: 'https://api.openai.com/v1/chat/completions', apiProvider: OpenAiProviderType.OpenAi, defaultModel: DEFAULT_OPENAI_MODEL, + headers: { + 'X-My-Custom-Header': 'foo', + Authorization: 'override', + }, }, secrets: { apiKey: '123' }, logger: loggingSystemMock.createLogger(), @@ -96,6 +100,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -114,6 +119,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...requestBody, stream: false }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -131,6 +137,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -165,6 +172,7 @@ describe('OpenAIConnector', () => { }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -195,6 +203,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -215,6 +224,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -253,6 +263,7 @@ describe('OpenAIConnector', () => { }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -302,6 +313,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: true, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -334,6 +346,7 @@ describe('OpenAIConnector', () => { data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }), headers: { Authorization: 'Bearer 123', + 'X-My-Custom-Header': 'foo', 'content-type': 'application/json', }, }); @@ -404,6 +417,55 @@ describe('OpenAIConnector', () => { }); }); + describe('OpenAI without headers', () => { + const connector = new OpenAIConnector({ + configurationUtilities: actionsConfigMock.create(), + connector: { id: '1', type: OPENAI_CONNECTOR_ID }, + config: { + apiUrl: 'https://api.openai.com/v1/chat/completions', + apiProvider: OpenAiProviderType.OpenAi, + defaultModel: DEFAULT_OPENAI_MODEL, + }, + secrets: { apiKey: '123' }, + logger: loggingSystemMock.createLogger(), + services: actionsMock.createServices(), + }); + + const sampleOpenAiBody = { + messages: [ + { + role: 'user', + content: 'Hello world', + }, + ], + }; + + beforeEach(() => { + // @ts-ignore + connector.request = mockRequest; + jest.clearAllMocks(); + }); + + describe('runApi', () => { + it('uses the default model if none is supplied', async () => { + const response = await connector.runApi({ body: JSON.stringify(sampleOpenAiBody) }); + expect(mockRequest).toBeCalledTimes(1); + expect(mockRequest).toHaveBeenCalledWith({ + timeout: 120000, + url: 'https://api.openai.com/v1/chat/completions', + method: 'post', + responseSchema: RunActionResponseSchema, + data: JSON.stringify({ ...sampleOpenAiBody, stream: false, model: DEFAULT_OPENAI_MODEL }), + headers: { + Authorization: 'Bearer 123', + 'content-type': 'application/json', + }, + }); + expect(response).toEqual(mockResponse.data); + }); + }); + }); + describe('AzureAI', () => { const connector = new OpenAIConnector({ configurationUtilities: actionsConfigMock.create(), diff --git a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts index 88ad3a0d3da78d..8eceb82dd239ba 100644 --- a/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts +++ b/x-pack/plugins/stack_connectors/server/connector_types/openai/openai.ts @@ -125,6 +125,10 @@ export class OpenAIConnector extends SubActionConnector { // give up to 2 minutes for response timeout: 120000, ...axiosOptions, + headers: { + ...this.config.headers, + ...axiosOptions.headers, + }, }); return response.data; } @@ -147,12 +151,17 @@ export class OpenAIConnector extends SubActionConnector { ); const axiosOptions = getAxiosOptions(this.provider, this.key, stream); + const response = await this.request({ url: this.url, method: 'post', responseSchema: stream ? StreamingResponseSchema : RunActionResponseSchema, data: executeBody, ...axiosOptions, + headers: { + ...this.config.headers, + ...axiosOptions.headers, + }, }); return stream ? pipeStreamingResponse(response) : response.data; } diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index a0057befbed147..58af3a0dbd9d92 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -1175,7 +1175,6 @@ "customIntegrationsPackage.validations.integrationName.lowerCaseError": "Le nom d'une intégration doit être en minuscules.", "customIntegrationsPackage.validations.integrationName.requiredError": "Une intégration doit obligatoirement porter un nom.", "dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle": "{savedObjectName} a été ajouté.", - "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté.", "dashboard.dashboardListingEditErrorTitle.duplicateWarning": "L'enregistrement de \"{value}\" crée un doublon de titre", "dashboard.dashboardWasNotSavedDangerMessage": "Le tableau de bord \"{dashTitle}\" n'a pas été enregistré. Erreur : {errorMessage}.", "dashboard.listing.createNewDashboard.newToKibanaDescription": "Vous êtes nouveau sur Kibana ? {sampleDataInstallLink} pour découvrir l'application.", @@ -1186,7 +1185,6 @@ "dashboard.noMatchRoute.bannerText": "L'application de tableau de bord ne reconnaît pas ce chemin : {route}.", "dashboard.panel.addToLibrary.errorMessage": "Une erreur s'est produite lors de l'ajout du panneau {panelTitle} à la bibliothèque", "dashboard.panel.addToLibrary.successMessage": "Le panneau {panelTitle} a été ajouté à la bibliothèque", - "dashboard.panel.replacePanel.flyoutHeader": "Remplacer le panneau {panelName} par :", "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "Impossible de migrer les données du panneau pour une rétro-compatibilité \"6.3.0\". Le panneau ne contient pas le champ attendu : {key}.", "dashboard.panel.unlinkFromLibrary.failureMessage": "Une erreur s'est produite lors de la dissociation du panneau {panelTitle} de la bibliothèque.", "dashboard.panel.unlinkFromLibrary.successMessage": "Le panneau {panelTitle} n'est plus connecté à la bibliothèque.", @@ -1200,8 +1198,6 @@ "dashboard.actions.downloadOptionsUnsavedFilename": "sans titre", "dashboard.actions.toggleExpandPanelMenuItem.expandedDisplayName": "Minimiser", "dashboard.actions.toggleExpandPanelMenuItem.notExpandedDisplayName": "Maximiser le panneau", - "dashboard.addPanel.noMatchingObjectsMessage": "Aucun objet correspondant trouvé.", - "dashboard.addPanel.panelAddedToContainerSuccessMessageTitle": "Un panneau a été ajouté", "dashboard.addPanelMenuTrigger.description": "Une nouvelle action apparaîtra dans le menu Ajouter un panneau du tableau de bord", "dashboard.addPanelMenuTrigger.title": "Menu Ajouter un panneau", "dashboard.appLeaveConfirmModal.cancelButtonLabel": "Annuler", @@ -1300,7 +1296,6 @@ "dashboard.panel.LibraryNotification": "Notification de la bibliothèque", "dashboard.panel.libraryNotification.ariaLabel": "Afficher les informations de la bibliothèque et dissocier ce panneau", "dashboard.panel.libraryNotification.toolTip": "La modification de ce panneau pourrait affecter d’autres tableaux de bord. Pour modifier ce panneau uniquement, dissociez-le de la bibliothèque.", - "dashboard.panel.removePanel.replacePanel": "Remplacer le panneau", "dashboard.panel.title.clonedTag": "copier", "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "Impossible de migrer les données du panneau pour une rétro-compatibilité \"6.1.0\". Le panneau ne contient pas les champs de colonne et/ou de ligne attendus.", "dashboard.panel.unlinkFromLibrary": "Dissocier de la bibliothèque", @@ -5586,7 +5581,6 @@ "searchConnectors.index.syncJobs.documents.added": "Ajouté", "searchConnectors.index.syncJobs.documents.removed": "Retiré", "searchConnectors.index.syncJobs.documents.title": "Documents", - "searchConnectors.index.syncJobs.documents.total": "Total", "searchConnectors.index.syncJobs.documents.value": "Valeur", "searchConnectors.index.syncJobs.documents.volume": "Volume", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "Inférieur à 1 Mo", @@ -11899,7 +11893,6 @@ "xpack.cases.actions.tags.selectNone": "Sélectionner aucun", "xpack.cases.actions.viewCase": "Afficher le cas", "xpack.cases.actions.visualizationActions.addToExistingCase.displayName": "Ajouter à un cas existant", - "xpack.cases.actions.visualizationActions.addToNewCase.displayName": "Ajouter au nouveau cas", "xpack.cases.addConnector.title": "Ajouter un connecteur", "xpack.cases.allCases.actions": "Actions", "xpack.cases.allCases.comments": "Commentaires", @@ -18746,7 +18739,6 @@ "xpack.fleet.multiRowInput.addRow": "Ajouter une ligne", "xpack.fleet.multiRowInput.deleteButton": "Supprimer la ligne", "xpack.fleet.multiTextInput.addRow": "Ajouter une ligne", - "xpack.fleet.multiTextInput.deleteRowButton": "Supprimer la ligne", "xpack.fleet.namespaceValidation.invalidCharactersErrorMessage": "L'espace de nom contient des caractères non valides", "xpack.fleet.namespaceValidation.lowercaseErrorMessage": "L'espace de nom doit être en minuscules", "xpack.fleet.namespaceValidation.requiredErrorMessage": "L'espace de nom est obligatoire", @@ -20590,7 +20582,6 @@ "xpack.idxMgmt.mappingsEditor.tokenCount.nullValueFieldDescription": "Accepte une valeur numérique du même type que le champ qui remplace une valeur nulle explicite.", "xpack.idxMgmt.mappingsEditor.tokenCountRequired.analyzerFieldLabel": "Analyseur d'index", "xpack.idxMgmt.mappingsEditor.typeField.placeholderLabel": "Sélectionner un type", - "xpack.idxMgmt.mappingsEditor.typeFieldLabel": "Type du champ", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.confirmDescription": "Confirmer le changement de type", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.title": "Confirmez le changement du type \"{fieldName}\" en \"{fieldType}\".", "xpack.idxMgmt.mappingsEditor.useNormsFieldDescription": "Tenez compte de la longueur du champ lors de la notation des requêtes. Les normes nécessitent une mémoire importante. Elles ne sont pas obligatoires pour les champs utilisés uniquement pour le filtrage ou les agrégations.", @@ -22452,7 +22443,6 @@ "xpack.ingestPipelines.list.table.managedBadgeLabel": "Géré", "xpack.ingestPipelines.list.table.managedFilterLabel": "Géré", "xpack.ingestPipelines.list.table.nameColumnTitle": "Nom", - "xpack.ingestPipelines.list.table.reloadButtonLabel": "Recharger", "xpack.ingestPipelines.mapToIngestPipeline.error.parseErrors": "Erreur lors de la lecture du fichier. Un problème est survenu lors du traitement du fichier.", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentButtonLabel": "Ajouter un document", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentErrorMessage": "Erreur lors de l'ajout du document", @@ -25578,7 +25568,6 @@ "xpack.ml.settings.filterLists.filterWithIdExistsErrorMessage": "Un filtre ayant l'ID {filterId} existe déjà", "xpack.ml.settings.filterLists.listHeader.filterListsContainsNotAllowedValuesDescription": "Les listes de filtres contiennent des valeurs que vous pouvez utiliser pour inclure ou exclure des événements dans l'analyse de Machine Learning. Vous pouvez utiliser une même liste de filtres dans plusieurs tâches.{br}{learnMoreLink}", "xpack.ml.settings.filterLists.listHeader.filterListsDescription": "{totalCount} en tout", - "xpack.ml.singleMetricViewerEmbeddable.title": "Graphique de visionneuse d'indicateur unique pour {jobIds}", "xpack.ml.splom.arrayFieldsWarningMessage": "{filteredDocsCount} sur {originalDocsCount} documents récupérés incluent des champs avec des tableaux de valeurs et ne peuvent pas être visualisés.", "xpack.ml.stepDefineForm.queryPlaceholderKql": "Rechercher par ex. {example}", "xpack.ml.stepDefineForm.queryPlaceholderLucene": "Rechercher par ex. {example}", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 06a3c6238fb941..4918a1045616d3 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -1175,7 +1175,6 @@ "customIntegrationsPackage.validations.integrationName.lowerCaseError": "統合名は小文字にしてください。", "customIntegrationsPackage.validations.integrationName.requiredError": "統合名は必須です。", "dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle": "{savedObjectName} が追加されました", - "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} が追加されました", "dashboard.dashboardListingEditErrorTitle.duplicateWarning": "\"{value}\"を保存すると、タイトルが重複します", "dashboard.dashboardWasNotSavedDangerMessage": "ダッシュボード「{dashTitle}」が保存されませんでした。エラー:{errorMessage}", "dashboard.listing.createNewDashboard.newToKibanaDescription": "Kibanaは初心者ですか?{sampleDataInstallLink}してお試しください。", @@ -1186,7 +1185,6 @@ "dashboard.noMatchRoute.bannerText": "ダッシュボードアプリケーションはこのルート{route}を認識できません。", "dashboard.panel.addToLibrary.errorMessage": "パネル\"{panelTitle}\"をライブラリに追加しているときにエラーが発生しました。", "dashboard.panel.addToLibrary.successMessage": "パネル\"{panelTitle}\"はライブラリに追加されました", - "dashboard.panel.replacePanel.flyoutHeader": "パネル\"{panelName}\"を次で置換:", "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "「6.3.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルに必要なフィールドがありません:{key}", "dashboard.panel.unlinkFromLibrary.failureMessage": "\"{panelTitle}\"をライブラリからリンク解除しているときにエラーが発生しました。", "dashboard.panel.unlinkFromLibrary.successMessage": "パネル\"{panelTitle}\"はライブラリに接続されていません。", @@ -1200,8 +1198,6 @@ "dashboard.actions.downloadOptionsUnsavedFilename": "無題", "dashboard.actions.toggleExpandPanelMenuItem.expandedDisplayName": "最小化", "dashboard.actions.toggleExpandPanelMenuItem.notExpandedDisplayName": "パネルを最大化", - "dashboard.addPanel.noMatchingObjectsMessage": "一致するオブジェクトが見つかりませんでした。", - "dashboard.addPanel.panelAddedToContainerSuccessMessageTitle": "パネルが追加されました", "dashboard.addPanelMenuTrigger.description": "新しいアクションは、ダッシュボードのパネルの追加メニューに表示されます", "dashboard.addPanelMenuTrigger.title": "パネルの追加メニュー", "dashboard.appLeaveConfirmModal.cancelButtonLabel": "キャンセル", @@ -1300,7 +1296,6 @@ "dashboard.panel.LibraryNotification": "ライブラリ通知", "dashboard.panel.libraryNotification.ariaLabel": "ライブラリ情報を表示し、このパネルのリンクを解除します", "dashboard.panel.libraryNotification.toolTip": "このパネルを編集すると、他のダッシュボードに影響する場合があります。このパネルのみを変更するには、ライブラリからリンクを解除します。", - "dashboard.panel.removePanel.replacePanel": "パネルの交換", "dashboard.panel.title.clonedTag": "コピー", "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "「6.1.0」のダッシュボードの互換性のため、パネルデータを移行できませんでした。パネルには想定された列または行フィールドがありません", "dashboard.panel.unlinkFromLibrary": "ライブラリからのリンクを解除", @@ -5579,7 +5574,6 @@ "searchConnectors.index.syncJobs.documents.added": "追加", "searchConnectors.index.syncJobs.documents.removed": "削除しました", "searchConnectors.index.syncJobs.documents.title": "ドキュメント", - "searchConnectors.index.syncJobs.documents.total": "合計", "searchConnectors.index.syncJobs.documents.value": "値", "searchConnectors.index.syncJobs.documents.volume": "量", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "1mb未満", @@ -11879,7 +11873,6 @@ "xpack.cases.actions.tags.selectNone": "どれも選択しません", "xpack.cases.actions.viewCase": "ケースの表示", "xpack.cases.actions.visualizationActions.addToExistingCase.displayName": "既存のケースに追加", - "xpack.cases.actions.visualizationActions.addToNewCase.displayName": "新しいケースに追加", "xpack.cases.addConnector.title": "コネクターの追加", "xpack.cases.allCases.actions": "アクション", "xpack.cases.allCases.comments": "コメント", @@ -18723,7 +18716,6 @@ "xpack.fleet.multiRowInput.addRow": "行の追加", "xpack.fleet.multiRowInput.deleteButton": "行の削除", "xpack.fleet.multiTextInput.addRow": "行の追加", - "xpack.fleet.multiTextInput.deleteRowButton": "行の削除", "xpack.fleet.namespaceValidation.invalidCharactersErrorMessage": "名前空間に無効な文字が含まれています", "xpack.fleet.namespaceValidation.lowercaseErrorMessage": "名前空間は小文字で指定する必要があります", "xpack.fleet.namespaceValidation.requiredErrorMessage": "名前空間は必須です", @@ -20567,7 +20559,6 @@ "xpack.idxMgmt.mappingsEditor.tokenCount.nullValueFieldDescription": "明確なnull値の代わりに使用される、フィールドと同じタイプの数値を受け入れます。", "xpack.idxMgmt.mappingsEditor.tokenCountRequired.analyzerFieldLabel": "インデックスアナライザー", "xpack.idxMgmt.mappingsEditor.typeField.placeholderLabel": "タイプを選択", - "xpack.idxMgmt.mappingsEditor.typeFieldLabel": "フィールド型", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.confirmDescription": "型の変更を確認", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.title": "'{fieldName}'型から'{fieldType}'への変更を確認", "xpack.idxMgmt.mappingsEditor.useNormsFieldDescription": "クエリをスコアリングするときにフィールドの長さを考慮します。Normsには大量のメモリが必要です。フィルタリングまたは集約専用のフィールドは必要ありません。", @@ -22426,7 +22417,6 @@ "xpack.ingestPipelines.list.table.managedBadgeLabel": "管理中", "xpack.ingestPipelines.list.table.managedFilterLabel": "管理中", "xpack.ingestPipelines.list.table.nameColumnTitle": "名前", - "xpack.ingestPipelines.list.table.reloadButtonLabel": "再読み込み", "xpack.ingestPipelines.mapToIngestPipeline.error.parseErrors": "ファイル読み取りエラー:ファイルの処理中に予期しない問題が発生しました。", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentButtonLabel": "ドキュメントを追加", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentErrorMessage": "ドキュメントの追加エラー", @@ -25552,7 +25542,6 @@ "xpack.ml.settings.filterLists.filterWithIdExistsErrorMessage": "ID {filterId} のフィルターがすでに存在します", "xpack.ml.settings.filterLists.listHeader.filterListsContainsNotAllowedValuesDescription": "フィルターリストには、イベントを機械学習分析に含める、または除外するのに使用する値が含まれています。同じフィルターリストを複数ジョブに使用できます。{br}{learnMoreLink}", "xpack.ml.settings.filterLists.listHeader.filterListsDescription": "合計 {totalCount}", - "xpack.ml.singleMetricViewerEmbeddable.title": "{jobIds}のMLシングルメトリックビューアーグラフ", "xpack.ml.splom.arrayFieldsWarningMessage": "{originalDocsCount}件中{filteredDocsCount}件の取得されたドキュメントには配列の値のフィールドが含まれ、可視化できません。", "xpack.ml.stepDefineForm.queryPlaceholderKql": "{example}の検索", "xpack.ml.stepDefineForm.queryPlaceholderLucene": "{example}の検索", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 12c75c281fbbfb..673ab2ba535a46 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -1177,7 +1177,6 @@ "customIntegrationsPackage.validations.integrationName.lowerCaseError": "集成名称应为小写。", "customIntegrationsPackage.validations.integrationName.requiredError": "集成名称必填。", "dashboard.addPanel.newEmbeddableAddedSuccessMessageTitle": "{savedObjectName} 已添加", - "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} 已添加", "dashboard.dashboardListingEditErrorTitle.duplicateWarning": "保存“{value}”会创建重复的标题", "dashboard.dashboardWasNotSavedDangerMessage": "仪表板“{dashTitle}”未保存。错误:{errorMessage}", "dashboard.listing.createNewDashboard.newToKibanaDescription": "Kibana 新手?{sampleDataInstallLink}来试用一下。", @@ -1188,7 +1187,6 @@ "dashboard.noMatchRoute.bannerText": "Dashboard 应用程序无法识别此路由:{route}。", "dashboard.panel.addToLibrary.errorMessage": "将面板 {panelTitle} 添加到该库时遇到错误", "dashboard.panel.addToLibrary.successMessage": "面板 {panelTitle} 已添加到该库", - "dashboard.panel.replacePanel.flyoutHeader": "将面板 {panelName} 替换为:", "dashboard.panel.unableToMigratePanelDataForSixThreeZeroErrorMessage": "无法迁移用于“6.3.0”向后兼容的面板数据,面板不包含所需字段:{key}", "dashboard.panel.unlinkFromLibrary.failureMessage": "从该库中取消链接 {panelTitle} 时出错。", "dashboard.panel.unlinkFromLibrary.successMessage": "面板 {panelTitle} 不再与该库连接。", @@ -1202,8 +1200,6 @@ "dashboard.actions.downloadOptionsUnsavedFilename": "未命名", "dashboard.actions.toggleExpandPanelMenuItem.expandedDisplayName": "最小化", "dashboard.actions.toggleExpandPanelMenuItem.notExpandedDisplayName": "最大化面板", - "dashboard.addPanel.noMatchingObjectsMessage": "未找到任何匹配对象。", - "dashboard.addPanel.panelAddedToContainerSuccessMessageTitle": "已添加一个面板", "dashboard.addPanelMenuTrigger.description": "一个新操作将在仪表板的添加面板菜单中显示出来", "dashboard.addPanelMenuTrigger.title": "添加面板菜单", "dashboard.appLeaveConfirmModal.cancelButtonLabel": "取消", @@ -1302,7 +1298,6 @@ "dashboard.panel.LibraryNotification": "库通知", "dashboard.panel.libraryNotification.ariaLabel": "查看库信息并取消链接此面板", "dashboard.panel.libraryNotification.toolTip": "编辑此面板可能会影响其他仪表板。要仅更改此面板,请取消其与库的链接。", - "dashboard.panel.removePanel.replacePanel": "替换面板", "dashboard.panel.title.clonedTag": "副本", "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "无法迁移用于“6.1.0”向后兼容的面板数据,面板不包含所需的列和/或行字段", "dashboard.panel.unlinkFromLibrary": "取消与库的链接", @@ -5590,7 +5585,6 @@ "searchConnectors.index.syncJobs.documents.added": "已添加", "searchConnectors.index.syncJobs.documents.removed": "已移除", "searchConnectors.index.syncJobs.documents.title": "文档", - "searchConnectors.index.syncJobs.documents.total": "合计", "searchConnectors.index.syncJobs.documents.value": "值", "searchConnectors.index.syncJobs.documents.volume": "卷", "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "小于 1mb", @@ -11903,7 +11897,6 @@ "xpack.cases.actions.tags.selectNone": "不选择任何内容", "xpack.cases.actions.viewCase": "查看案例", "xpack.cases.actions.visualizationActions.addToExistingCase.displayName": "添加到现有案例", - "xpack.cases.actions.visualizationActions.addToNewCase.displayName": "添加到新案例", "xpack.cases.addConnector.title": "添加连接器", "xpack.cases.allCases.actions": "操作", "xpack.cases.allCases.comments": "注释", @@ -18752,7 +18745,6 @@ "xpack.fleet.multiRowInput.addRow": "添加行", "xpack.fleet.multiRowInput.deleteButton": "删除行", "xpack.fleet.multiTextInput.addRow": "添加行", - "xpack.fleet.multiTextInput.deleteRowButton": "删除行", "xpack.fleet.namespaceValidation.invalidCharactersErrorMessage": "命名空间包含无效字符", "xpack.fleet.namespaceValidation.lowercaseErrorMessage": "命名空间必须小写", "xpack.fleet.namespaceValidation.requiredErrorMessage": "“命名空间”必填", @@ -20596,7 +20588,6 @@ "xpack.idxMgmt.mappingsEditor.tokenCount.nullValueFieldDescription": "接受类型与替换任何显式 null 值的字段相同的数值。", "xpack.idxMgmt.mappingsEditor.tokenCountRequired.analyzerFieldLabel": "索引分析器", "xpack.idxMgmt.mappingsEditor.typeField.placeholderLabel": "选择类型", - "xpack.idxMgmt.mappingsEditor.typeFieldLabel": "字段类型", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.confirmDescription": "确认类型更改", "xpack.idxMgmt.mappingsEditor.updateField.confirmationModal.title": "确认将“{fieldName}”类型更改为“{fieldType}”。", "xpack.idxMgmt.mappingsEditor.useNormsFieldDescription": "对查询评分时解释字段长度。Norms 需要很大的内存,对于仅用于筛选或聚合的字段,其不是必需的。", @@ -22458,7 +22449,6 @@ "xpack.ingestPipelines.list.table.managedBadgeLabel": "托管", "xpack.ingestPipelines.list.table.managedFilterLabel": "托管", "xpack.ingestPipelines.list.table.nameColumnTitle": "名称", - "xpack.ingestPipelines.list.table.reloadButtonLabel": "重新加载", "xpack.ingestPipelines.mapToIngestPipeline.error.parseErrors": "读取文件时出错:处理文件时出现意外问题。", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentButtonLabel": "添加文档", "xpack.ingestPipelines.pipelineEditor.addDocuments.addDocumentErrorMessage": "添加文档时出错", @@ -25589,7 +25579,6 @@ "xpack.ml.settings.filterLists.filterWithIdExistsErrorMessage": "ID 为 {filterId} 的筛选已存在", "xpack.ml.settings.filterLists.listHeader.filterListsContainsNotAllowedValuesDescription": "筛选列表包含可用于在 Machine Learning 分析中包括或排除事件的值。您可以在多个作业中使用相同的筛选列表。{br}{learnMoreLink}", "xpack.ml.settings.filterLists.listHeader.filterListsDescription": "合计 {totalCount} 个", - "xpack.ml.singleMetricViewerEmbeddable.title": "{jobIds} 的 ML Single Metric Viewer 图表", "xpack.ml.splom.arrayFieldsWarningMessage": "{originalDocsCount} 个提取的文档中有 {filteredDocsCount} 个包含具有值数组的字段,无法可视化。", "xpack.ml.stepDefineForm.queryPlaceholderKql": "搜索,如 {example})", "xpack.ml.stepDefineForm.queryPlaceholderLucene": "搜索,如 {example})", 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 dcc3bafeb92ba7..14fc3a37559803 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 @@ -24,10 +24,12 @@ import { EuiDataGridRefProps, EuiFlexGroup, EuiDataGridProps, + EuiDataGridCellPopoverElementProps, EuiCodeBlock, EuiText, EuiIcon, EuiSpacer, + EuiFlexItem, } from '@elastic/eui'; import { useQueryClient } from '@tanstack/react-query'; import styled from '@emotion/styled'; @@ -134,6 +136,44 @@ const CustomGridBody = memo( } ); +// Here we force the error callout to be the same height as the cell content +// so that the error detail gets hidden in the overflow area and only shown in +// the cell popover +const errorCalloutStyles = css` + height: 1lh; +`; + +/** + * An error callout that displays the error stack in a code block + */ +const ViewError = ({ error }: { error: Error }) => ( + <> + + + + + + + + + + + + + + {error.stack} + +); + const AlertsTable: React.FunctionComponent = (props: AlertsTableProps) => { const { visibleColumns, @@ -381,12 +421,10 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab const renderCellValue = useCallback( () => - props.alertsTableConfiguration?.getRenderCellValue - ? props.alertsTableConfiguration?.getRenderCellValue({ - setFlyoutAlert: handleFlyoutAlert, - context: renderCellContext, - }) - : basicRenderCellValue, + props.alertsTableConfiguration?.getRenderCellValue?.({ + setFlyoutAlert: handleFlyoutAlert, + context: renderCellContext, + }) ?? basicRenderCellValue, [handleFlyoutAlert, props.alertsTableConfiguration, renderCellContext] )(); @@ -427,27 +465,7 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab } return null; } catch (e) { - return ( - <> - - - - - - - - {e.stack} - - ); + return ; } }, [ @@ -466,6 +484,36 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab ] ); + const renderCellPopover = useMemo( + () => + props.alertsTableConfiguration?.getRenderCellPopover?.({ + context: renderCellContext, + }) ?? props.renderCellPopover, + [props.alertsTableConfiguration, props.renderCellPopover, renderCellContext] + ); + + const handleRenderCellPopover = useMemo( + () => + renderCellPopover + ? (_props: EuiDataGridCellPopoverElementProps) => { + try { + const idx = _props.rowIndex - pagination.pageSize * pagination.pageIndex; + const alert = alerts[idx]; + if (alert) { + return renderCellPopover({ + ..._props, + alert, + }); + } + return null; + } catch (e) { + return ; + } + } + : undefined, + [alerts, pagination.pageIndex, pagination.pageSize, renderCellPopover] + ); + const dataGridPagination = useMemo( () => ({ ...pagination, @@ -593,6 +641,7 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab onColumnResize={onColumnResize} ref={dataGridRef} renderCustomGridBody={props.dynamicRowHeight ? renderCustomGridBody : undefined} + renderCellPopover={handleRenderCellPopover} /> )} 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 2c0e7873254bf6..99362eb2e96ee9 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 @@ -93,7 +93,8 @@ export type AlertsTableStateProps = { */ dynamicRowHeight?: boolean; lastReloadRequestTime?: number; -} & Partial; + renderCellPopover?: AlertsTableProps['renderCellPopover']; +} & Omit, 'renderCellPopover'>; export interface AlertsTableStorage { columns: EuiDataGridColumn[]; @@ -185,6 +186,7 @@ const AlertsTableStateWithQueryProvider = ({ leadingControlColumns, rowHeightsOptions, renderCellValue, + renderCellPopover, columns: propColumns, gridStyle, browserFields: propBrowserFields, @@ -449,6 +451,7 @@ const AlertsTableStateWithQueryProvider = ({ query, rowHeightsOptions, renderCellValue, + renderCellPopover, gridStyle, controls: persistentControls, showInspectButton, @@ -477,6 +480,7 @@ const AlertsTableStateWithQueryProvider = ({ query, rowHeightsOptions, renderCellValue, + renderCellPopover, gridStyle, persistentControls, showInspectButton, diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index 7533746c872365..467d9480a248ea 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -24,6 +24,7 @@ import type { EuiDataGridToolBarVisibilityOptions, EuiSuperSelectOption, EuiDataGridOnColumnResizeHandler, + EuiDataGridCellPopoverElementProps, } from '@elastic/eui'; import type { RuleCreationValidConsumer, ValidFeatureId } from '@kbn/rule-data-utils'; import { EuiDataGridColumn, EuiDataGridControlColumn, EuiDataGridSorting } from '@elastic/eui'; @@ -587,6 +588,7 @@ export type AlertsTableProps = { */ dynamicRowHeight?: boolean; featureIds?: ValidFeatureId[]; + renderCellPopover?: ReturnType; } & Partial>; export type SetFlyoutAlert = (alertId: string) => void; @@ -605,7 +607,15 @@ export type GetRenderCellValue = ({ context?: T; }) => ( props: EuiDataGridCellValueElementProps & { data: TimelineNonEcsData[] } -) => React.ReactNode | JSX.Element | null | string; +) => React.ReactNode | JSX.Element; + +export type GetRenderCellPopover = ({ + context, +}: { + context?: T; +}) => ( + props: EuiDataGridCellPopoverElementProps & { alert: Alert } +) => React.ReactNode | JSX.Element; export type PreFetchPageContext = ({ alerts, @@ -739,6 +749,7 @@ export interface AlertsTableConfigurationRegistry { }; sort?: SortCombinations[]; getRenderCellValue?: GetRenderCellValue; + getRenderCellPopover?: GetRenderCellPopover; useActionsColumn?: UseActionsColumnRegistry; useBulkActions?: UseBulkActionsRegistry; useCellActions?: UseCellActions; diff --git a/x-pack/plugins/triggers_actions_ui/tsconfig.json b/x-pack/plugins/triggers_actions_ui/tsconfig.json index 87bc01eeacec2b..c25e1697986bd1 100644 --- a/x-pack/plugins/triggers_actions_ui/tsconfig.json +++ b/x-pack/plugins/triggers_actions_ui/tsconfig.json @@ -61,7 +61,7 @@ "@kbn/code-editor", "@kbn/code-editor-mock", "@kbn/io-ts-utils", - "@kbn/lens-plugin", + "@kbn/lens-plugin" ], "exclude": ["target/**/*"] } diff --git a/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts b/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts index a6d3fea21a4e22..991be3b49bb40f 100644 --- a/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts +++ b/x-pack/test/accessibility/apps/group1/dashboard_panel_options.ts @@ -121,6 +121,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('dashboard panel - Create drilldown panel', async () => { await dashboardPanelActions.toggleContextMenu(header); + await testSubjects.click('embeddablePanelMore-mainMenu'); await testSubjects.click('embeddablePanelAction-OPEN_FLYOUT_ADD_DRILLDOWN'); await a11y.testAppSnapshot(); await testSubjects.click('actionFactoryItem-DASHBOARD_TO_DASHBOARD_DRILLDOWN'); @@ -136,6 +137,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('dashboard panel - manage drilldown', async () => { await dashboardPanelActions.toggleContextMenu(header); + await testSubjects.click('embeddablePanelMore-mainMenu'); await testSubjects.click('embeddablePanelAction-OPEN_FLYOUT_EDIT_DRILLDOWN'); await a11y.testAppSnapshot(); await testSubjects.click('euiFlyoutCloseButton'); diff --git a/x-pack/test/api_integration/apis/metrics_ui/infra_custom_dashboards.ts b/x-pack/test/api_integration/apis/metrics_ui/infra_custom_dashboards.ts index 86c69d8ccd4133..2ed6607630060d 100644 --- a/x-pack/test/api_integration/apis/metrics_ui/infra_custom_dashboards.ts +++ b/x-pack/test/api_integration/apis/metrics_ui/infra_custom_dashboards.ts @@ -12,7 +12,10 @@ import { INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE } from '@kbn/infra-plugin/ser import { enableInfrastructureAssetCustomDashboards } from '@kbn/observability-plugin/common'; import { FtrProviderContext } from '../../ftr_provider_context'; -const CUSTOM_DASHBOARDS_API_URL = '/api/infra/custom-dashboards'; +const getCustomDashboardsUrl = (assetType: string, dashboardSavedObjectId?: string) => + dashboardSavedObjectId + ? `/api/infra/${assetType}/custom-dashboards/${dashboardSavedObjectId}` + : `/api/infra/${assetType}/custom-dashboards`; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -31,7 +34,7 @@ export default function ({ getService }: FtrProviderContext) { [enableInfrastructureAssetCustomDashboards]: false, }); - await supertest.get(`${CUSTOM_DASHBOARDS_API_URL}/host`).expect(403); + await supertest.get(getCustomDashboardsUrl('host')).expect(403); }); it('responds with an error when trying to request a custom dashboard for unsupported asset type', async () => { @@ -39,7 +42,7 @@ export default function ({ getService }: FtrProviderContext) { [enableInfrastructureAssetCustomDashboards]: false, }); - await supertest.get(`${CUSTOM_DASHBOARDS_API_URL}/unsupported-asset-type`).expect(400); + await supertest.get(getCustomDashboardsUrl('unsupported-asset-type')).expect(400); }); it('responds with an empty configuration if custom dashboard saved object does not exist', async () => { @@ -50,18 +53,16 @@ export default function ({ getService }: FtrProviderContext) { types: [INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE], }); - const response = await supertest.get(`${CUSTOM_DASHBOARDS_API_URL}/host`).expect(200); + const response = await supertest.get(getCustomDashboardsUrl('host')).expect(200); - expect(response.body).to.be.eql({ - assetType: 'host', - dashboardIdList: [], - }); + expect(response.body).to.be.eql([]); }); it('responds with the custom dashboard configuration for a given asset type when it exists', async () => { const customDashboard: InfraCustomDashboard = { assetType: 'host', - dashboardIdList: ['123'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, }; await kibanaServer.uiSettings.update({ [enableInfrastructureAssetCustomDashboards]: true, @@ -72,24 +73,27 @@ export default function ({ getService }: FtrProviderContext) { overwrite: true, }); - const response = await supertest.get(`${CUSTOM_DASHBOARDS_API_URL}/host`).expect(200); + const response = await supertest.get(getCustomDashboardsUrl('host')).expect(200); - expect(response.body).to.be.eql(customDashboard); + expect(response.body).to.have.length(1); + expect(response.body[0]).to.have.property('dashboardFilterAssetIdEnabled', true); + expect(response.body[0]).to.have.property('assetType', 'host'); + expect(response.body[0]).to.have.property('dashboardSavedObjectId', '123'); }); }); - describe('POST endpoint for saving (creating or updating) custom dashboard', () => { + describe('POST endpoint for saving custom dashboard', () => { it('responds with an error if Custom Dashboards UI setting is not enabled', async () => { const payload: InfraSaveCustomDashboardsRequestPayload = { - assetType: 'host', - dashboardIdList: ['123'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, }; await kibanaServer.uiSettings.update({ [enableInfrastructureAssetCustomDashboards]: false, }); await supertest - .post(`${CUSTOM_DASHBOARDS_API_URL}`) + .post(getCustomDashboardsUrl('host')) .set('kbn-xsrf', 'xxx') .send(payload) .expect(403); @@ -97,15 +101,15 @@ export default function ({ getService }: FtrProviderContext) { it('responds with an error when trying to update a custom dashboard for unsupported asset type', async () => { const payload = { - assetType: 'unsupported-asset-type', - dashboardIdList: ['123'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, }; await kibanaServer.uiSettings.update({ [enableInfrastructureAssetCustomDashboards]: true, }); await supertest - .post(`${CUSTOM_DASHBOARDS_API_URL}`) + .post(getCustomDashboardsUrl('unsupported-asset-type')) .set('kbn-xsrf', 'xxx') .send(payload) .expect(400); @@ -113,8 +117,8 @@ export default function ({ getService }: FtrProviderContext) { it('creates a new dashboard configuration when saving for the first time', async () => { const payload: InfraSaveCustomDashboardsRequestPayload = { - assetType: 'host', - dashboardIdList: ['123'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, }; await kibanaServer.uiSettings.update({ [enableInfrastructureAssetCustomDashboards]: true, @@ -124,15 +128,23 @@ export default function ({ getService }: FtrProviderContext) { }); const response = await supertest - .post(`${CUSTOM_DASHBOARDS_API_URL}`) + .post(getCustomDashboardsUrl('host')) .set('kbn-xsrf', 'xxx') .send(payload) .expect(200); - expect(response.body).to.be.eql(payload); + expect(response.body).to.have.property('id'); + expect(response.body).to.have.property('dashboardFilterAssetIdEnabled', true); + expect(response.body).to.have.property('assetType', 'host'); + expect(response.body).to.have.property('dashboardSavedObjectId', '123'); }); - it('updates existing dashboard configuration when for a given asset type', async () => { + it('returns 400 when the dashboard already exist and tries to create it again', async () => { + const payload: InfraSaveCustomDashboardsRequestPayload = { + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, + }; + await kibanaServer.uiSettings.update({ [enableInfrastructureAssetCustomDashboards]: true, }); @@ -143,24 +155,160 @@ export default function ({ getService }: FtrProviderContext) { type: INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, attributes: { assetType: 'host', - dashboardIdList: ['123'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, }, overwrite: true, }); + const response = await supertest + .post(getCustomDashboardsUrl('host')) + .set('kbn-xsrf', 'xxx') + .send(payload) + .expect(400); + + expect(response.body.error).to.be.eql('Bad Request'); + expect(response.body.message).to.be.eql( + 'Dashboard with id 123 has already been linked to host' + ); + }); + }); + + describe('PUT endpoint for updating custom dashboard', () => { + it('responds with an error if Custom Dashboards UI setting is not enabled', async () => { const payload: InfraSaveCustomDashboardsRequestPayload = { - assetType: 'host', - dashboardIdList: ['123', '456'], + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, + }; + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: false, + }); + + await supertest + .put(getCustomDashboardsUrl('host', '123')) + .set('kbn-xsrf', 'xxx') + .send(payload) + .expect(403); + }); + + it('responds with an error when trying to update not existing dashboard', async () => { + const payload: InfraSaveCustomDashboardsRequestPayload = { + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, + }; + + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: true, + }); + + await supertest + .put(getCustomDashboardsUrl('host', '000')) + .set('kbn-xsrf', 'xxx') + .send(payload) + .expect(404); + }); + + it('updates existing dashboard configuration for a given asset type', async () => { + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: true, + }); + await kibanaServer.savedObjects.clean({ + types: [INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE], + }); + await kibanaServer.savedObjects.create({ + type: INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, + attributes: { + assetType: 'host', + dashboardSavedObjectId: '456', + dashboardFilterAssetIdEnabled: true, + }, + overwrite: true, + }); + const existingDashboardSavedObject = await kibanaServer.savedObjects.create({ + type: INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, + attributes: { + assetType: 'host', + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, + }, + overwrite: true, + }); + + const payload: InfraSaveCustomDashboardsRequestPayload = { + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: false, }; const updateResponse = await supertest - .post(`${CUSTOM_DASHBOARDS_API_URL}`) + .put(getCustomDashboardsUrl('host', existingDashboardSavedObject.id)) .set('kbn-xsrf', 'xxx') .send(payload) .expect(200); - const getResponse = await supertest.get(`${CUSTOM_DASHBOARDS_API_URL}/host`).expect(200); + const getResponse = await supertest.get(getCustomDashboardsUrl('host')).expect(200); + + expect(updateResponse.body).to.be.eql({ + ...payload, + assetType: 'host', + id: updateResponse.body.id, + }); + + expect(getResponse.body).to.have.length(2); + expect(getResponse.body[0]).to.have.property('dashboardSavedObjectId', '123'); + expect(getResponse.body[0]).to.have.property('dashboardFilterAssetIdEnabled', false); + expect(getResponse.body[0]).to.have.property('assetType', 'host'); + expect(getResponse.body[1]).to.have.property('dashboardSavedObjectId', '456'); + expect(getResponse.body[1]).to.have.property('dashboardFilterAssetIdEnabled', true); + expect(getResponse.body[1]).to.have.property('assetType', 'host'); + }); + }); + + describe('DELETE endpoint for removing a custom dashboard', () => { + it('responds with an error if Custom Dashboards UI setting is not enabled', async () => { + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: false, + }); + + await supertest + .delete(getCustomDashboardsUrl('host', '123')) + .set('kbn-xsrf', 'xxx') + .expect(403); + }); + + it('responds with an error when trying to delete not existing dashboard', async () => { + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: true, + }); + + await supertest + .delete(getCustomDashboardsUrl('host', '000')) + .set('kbn-xsrf', 'xxx') + .expect(404); + }); + + it('deletes an existing dashboard', async () => { + await kibanaServer.uiSettings.update({ + [enableInfrastructureAssetCustomDashboards]: true, + }); + await kibanaServer.savedObjects.clean({ + types: [INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE], + }); + const existingDashboardSavedObject = await kibanaServer.savedObjects.create({ + type: INFRA_CUSTOM_DASHBOARDS_SAVED_OBJECT_TYPE, + attributes: { + assetType: 'host', + dashboardSavedObjectId: '123', + dashboardFilterAssetIdEnabled: true, + }, + overwrite: true, + }); + + await supertest + .delete(getCustomDashboardsUrl('host', existingDashboardSavedObject.id)) + .set('kbn-xsrf', 'xxx') + .expect(200); + + const afterDeleteResponse = await supertest.get(getCustomDashboardsUrl('host')).expect(200); - expect(updateResponse.body).to.be.eql(payload); - expect(getResponse.body).to.be.eql(payload); + expect(afterDeleteResponse.body).to.be.eql([]); }); }); }); diff --git a/x-pack/test/cloud_security_posture_functional/pages/rules.ts b/x-pack/test/cloud_security_posture_functional/pages/rules.ts index b734c391bf27c7..b1f83f55a49fba 100644 --- a/x-pack/test/cloud_security_posture_functional/pages/rules.ts +++ b/x-pack/test/cloud_security_posture_functional/pages/rules.ts @@ -28,7 +28,8 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'findings', ]); - describe('Cloud Posture Rules Page', function () { + // FLAKY: https://github.com/elastic/kibana/issues/178413 + describe.skip('Cloud Posture Rules Page', function () { this.tags(['cloud_security_posture_rules_page']); let rule: typeof pageObjects.rule; let findings: typeof pageObjects.findings; diff --git a/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts b/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts index 7fa27e206a498f..0aedab4496616f 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/final_pipeline.ts @@ -34,7 +34,8 @@ export default function (providerContext: FtrProviderContext) { .expect(201); } - describe('fleet_final_pipeline', () => { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/180071 + describe.skip('fleet_final_pipeline', () => { skipIfNoDockerRegistry(providerContext); before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/fleet/empty_fleet_server'); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts b/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts index 0a8290549f06cb..c1dec4e1eb3003 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_custom.ts @@ -26,7 +26,8 @@ export default function (providerContext: FtrProviderContext) { .send({ force: true }); }; - describe('Installing custom integrations', async () => { + // FLAKY: https://github.com/elastic/kibana/issues/180062 + describe.skip('Installing custom integrations', async () => { afterEach(async () => { await uninstallPackage(); }); diff --git a/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_dashboard_drilldown.ts b/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_dashboard_drilldown.ts index a29b61fec5609a..95ea2dc42bc395 100644 --- a/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_dashboard_drilldown.ts +++ b/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_dashboard_drilldown.ts @@ -46,6 +46,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // create drilldown await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickContextMenuMoreItem(); await dashboardDrilldownPanelActions.expectExistsCreateDrilldownAction(); await dashboardDrilldownPanelActions.clickCreateDrilldown(); await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutOpen(); @@ -277,6 +278,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // delete drilldown await PageObjects.dashboard.switchToEditMode(); await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickContextMenuMoreItem(); await dashboardDrilldownPanelActions.expectExistsManageDrilldownsAction(); await dashboardDrilldownPanelActions.clickManageDrilldowns(); await dashboardDrilldownsManage.expectsManageDrilldownsFlyoutOpen(); diff --git a/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_url_drilldown.ts b/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_url_drilldown.ts index 24e9a249377fab..e7c8a0819fd1a8 100644 --- a/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_url_drilldown.ts +++ b/x-pack/test/functional/apps/dashboard/group3/drilldowns/dashboard_to_url_drilldown.ts @@ -33,6 +33,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // create drilldown await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickContextMenuMoreItem(); await dashboardDrilldownPanelActions.expectExistsCreateDrilldownAction(); await dashboardDrilldownPanelActions.clickCreateDrilldown(); await dashboardDrilldownsManage.expectsCreateDrilldownFlyoutOpen(); diff --git a/x-pack/test/functional/apps/discover/saved_searches.ts b/x-pack/test/functional/apps/discover/saved_searches.ts index 8f5fe5dc9bc11a..ef4d3890d31451 100644 --- a/x-pack/test/functional/apps/discover/saved_searches.ts +++ b/x-pack/test/functional/apps/discover/saved_searches.ts @@ -19,6 +19,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const queryBar = getService('queryBar'); const filterBar = getService('filterBar'); const testSubjects = getService('testSubjects'); + const retry = getService('retry'); const ecommerceSOPath = 'x-pack/test/functional/fixtures/kbn_archiver/reporting/ecommerce.json'; const defaultSettings = { defaultIndex: 'logstash-*', @@ -55,7 +56,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await panelActions.customizePanel(); await dashboardCustomizePanel.enableCustomTimeRange(); - await dashboardCustomizePanel.openDatePickerQuickMenu(); + await retry.waitFor('quick menu', async () => { + await dashboardCustomizePanel.openDatePickerQuickMenu(); + return await testSubjects.exists('superDatePickerCommonlyUsed_Last_90 days'); + }); await dashboardCustomizePanel.clickCommonlyUsedTimeRange('Last_90 days'); await dashboardCustomizePanel.clickSaveButton(); diff --git a/x-pack/test/functional/apps/lens/group1/smokescreen.ts b/x-pack/test/functional/apps/lens/group1/smokescreen.ts index a9b491ebe47fa3..befed343f12951 100644 --- a/x-pack/test/functional/apps/lens/group1/smokescreen.ts +++ b/x-pack/test/functional/apps/lens/group1/smokescreen.ts @@ -164,7 +164,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar vertical'); + await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', diff --git a/x-pack/test/functional/apps/lens/group5/geo_field.ts b/x-pack/test/functional/apps/lens/group5/geo_field.ts index 790160a4b1bba1..98008e3b7bb12a 100644 --- a/x-pack/test/functional/apps/lens/group5/geo_field.ts +++ b/x-pack/test/functional/apps/lens/group5/geo_field.ts @@ -30,7 +30,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should visualize geo fields in maps', async () => { - await PageObjects.visualize.navigateToNewVisualization(); + // as navigation does not happen via URL refresh by default, force a reset via URL navigation + await PageObjects.visualize.navigateToNewVisualization({ forceRefresh: true }); await PageObjects.visualize.clickVisType('lens'); await PageObjects.lens.switchDataPanelIndexPattern('logstash-*'); await PageObjects.header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts index e5a2a8f6a8971d..24fac3f726bc91 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/dashboard.ts @@ -28,8 +28,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { const dashboardAddPanel = getService('dashboardAddPanel'); const filterBar = getService('filterBar'); - // FLAKY: https://github.com/elastic/kibana/issues/179307 - describe.skip('Dashboard to TSVB to Lens', function describeIndexTests() { + describe('Dashboard to TSVB to Lens', function describeIndexTests() { before(async () => { await visualize.initTests(); }); diff --git a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/index.ts b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/index.ts index 90b0eb2c88186d..b48211b1af9382 100644 --- a/x-pack/test/functional/apps/lens/open_in_lens/tsvb/index.ts +++ b/x-pack/test/functional/apps/lens/open_in_lens/tsvb/index.ts @@ -52,11 +52,12 @@ export default function ({ loadTestFile, getService, getPageObjects }: FtrProvid } await esNode.load(esArchive); - // changing the timepicker default here saves us from having to set it in Discover (~8s) - await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await kibanaServer.uiSettings.update({ defaultIndex: indexPatternString, 'dateFormat:tz': 'UTC', + // changing the timepicker default here saves us from having to set it in Discover (~8s) + // The TSVB tests are using a slightly difference end date, so it needs to be set manually here + 'timepicker:timeDefaults': `{ "from": "${PageObjects.timePicker.defaultStartTime}", "to": "Sep 22, 2015 @ 18:31:44.000" }`, }); await kibanaServer.importExport.load(fixtureDirs.lensBasic); await kibanaServer.importExport.load(fixtureDirs.lensDefault); diff --git a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts index 61320617c07f79..06449ded19c64d 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/esql_data_visualizer.ts @@ -314,7 +314,8 @@ export default function ({ getPageObject, getService }: FtrProviderContext) { runTests(esqlFarequoteData); }); - describe('with module_sample_logs ', function () { + // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/180072 + describe.skip('with module_sample_logs ', function () { runTests(esqlSampleLogData); }); }); diff --git a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts index 32fe57b442753e..dab5acc5c2b4be 100644 --- a/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts +++ b/x-pack/test/functional/apps/ml/short_tests/settings/calendar_creation.ts @@ -96,12 +96,92 @@ export default function ({ getService }: FtrProviderContext) { await ml.settingsCalendar.setCalendarId(calendarId); await ml.testExecution.logTestStep('calendar creation sets the job selection'); - await asyncForEach(jobConfigs, async (jobConfig) => { - await ml.settingsCalendar.selectJob(jobConfig.job_id); - }); + await asyncForEach(jobConfigs, assignJobToCalendar); + + await ml.settingsCalendar.saveCalendar(); + await ml.settingsCalendar.assertCalendarRowExists(calendarId); + }); + + it('calendars connected by job groups should only be automatically connected to job groups applied during creation and can be applied to job groups after creation', async () => { + await ml.testExecution.logTestStep( + 'Create 2 jobs that will not be applied to the calendar during creation' + ); + await createSingleGroupJobs(); + + await ml.testExecution.logTestStep('calendar creation loads the calendar management page'); + await ml.navigation.navigateToMl(); + await ml.navigation.navigateToSettings(); + await ml.settings.navigateToCalendarManagement(); + + await ml.testExecution.logTestStep('calendar creation loads the new calendar edit page'); + await ml.settingsCalendar.assertCreateCalendarButtonEnabled(true); + await ml.settingsCalendar.navigateToCalendarCreationPage(); + + await ml.settingsCalendar.waitForFormEnabled(); + + await ml.testExecution.logTestStep( + 'calendar creation verifies the job selection and job group section are displayed' + ); + await ml.settingsCalendar.assertJobSelectionExists(); + await ml.settingsCalendar.assertJobSelectionEnabled(true); + await ml.settingsCalendar.assertJobGroupSelectionExists(); + await ml.settingsCalendar.assertJobGroupSelectionEnabled(true); + + await ml.testExecution.logTestStep('calendar creation sets the calendar id'); + await ml.settingsCalendar.setCalendarId(calendarId); + + await ml.testExecution.logTestStep('calendar creation sets the job selection'); + await asyncForEach(jobConfigs, assignJobToCalendar); await ml.settingsCalendar.saveCalendar(); await ml.settingsCalendar.assertCalendarRowExists(calendarId); + + await ml.testExecution.logTestStep( + 'calendar creation results in a calendar being automatically connected to job groups applied during creation' + ); + await ml.settingsCalendar.assertCalendarRowJobs(calendarId, [ + 'test_calendar_ad_1', + 'test_calendar_ad_2', + ]); + + await ml.navigation.navigateToAnomalyDetection(); + + await ml.jobTable.assertJobRowCalendars('test_calendar_ad_1', [calendarId]); + await ml.jobTable.clickJobRowCalendarWithAssertion('test_calendar_ad_1', calendarId); + + await ml.testExecution.logTestStep( + 'created calendars can be connected to job groups after creation' + ); + + await ml.settingsCalendar.selectJobGroup('multi-metric'); + await ml.settingsCalendar.saveCalendar(); + await ml.settingsCalendar.assertCalendarRowJobs(calendarId, [ + 'test_calendar_ad_1', + 'test_calendar_ad_2', + 'multi-metric', + ]); + await ml.navigation.navigateToAnomalyDetection(); + await ml.jobTable.assertJobRowCalendars('test_calendar_ad_4', [calendarId]); + await ml.jobTable.assertJobRowCalendars('test_calendar_ad_3', [calendarId], false); }); + + async function assignJobToCalendar( + jobConfig: ReturnType + ): Promise { + await ml.settingsCalendar.selectJob(jobConfig.job_id); + } + + async function createSingleGroupJobs() { + const automatedConfig = createJobConfig('test_calendar_ad_3'); + const multiMetricConfig = createJobConfig('test_calendar_ad_4'); + automatedConfig.groups = ['automated']; + multiMetricConfig.groups = ['multi-metric']; + + await asyncForEach( + [automatedConfig, multiMetricConfig], + // @ts-expect-error not full interface + async (config) => await ml.api.createAnomalyDetectionJob(config) + ); + } }); } diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 8fd1b6e6045484..43e238acf6ecb8 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -988,7 +988,8 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont */ async createLayer( layerType: 'data' | 'referenceLine' | 'annotations' = 'data', - annotationFromLibraryTitle?: string + annotationFromLibraryTitle?: string, + seriesType = 'bar_stacked' ) { await testSubjects.click('lnsLayerAddButton'); const layerCount = await this.getLayerCount(); @@ -1003,6 +1004,9 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont if (await testSubjects.exists(`lnsLayerAddButton-${layerType}`)) { await testSubjects.click(`lnsLayerAddButton-${layerType}`); + if (layerType === 'data') { + await testSubjects.click(`lnsXY_seriesType-${seriesType}`); + } if (layerType === 'annotations') { if (!annotationFromLibraryTitle) { await testSubjects.click('lnsAnnotationLayer_new'); diff --git a/x-pack/test/functional/services/ml/api.ts b/x-pack/test/functional/services/ml/api.ts index e15b7292c719db..bd4cd417c8af3c 100644 --- a/x-pack/test/functional/services/ml/api.ts +++ b/x-pack/test/functional/services/ml/api.ts @@ -679,12 +679,18 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { async createAnomalyDetectionJob(jobConfig: Job, space?: string) { const jobId = jobConfig.job_id; + log.debug( `Creating anomaly detection job with id '${jobId}' ${ space ? `in space '${space}' ` : '' }...` ); + if (await this.adJobExist(jobId)) { + log.debug('> Job already exists.'); + return; + } + const { body, status } = await kbnSupertest .put(`${space ? `/s/${space}` : ''}/internal/ml/anomaly_detectors/${jobId}`) .set(getCommonRequestHeader('1')) diff --git a/x-pack/test/functional/services/ml/job_table.ts b/x-pack/test/functional/services/ml/job_table.ts index bc535e38975376..9e1e72cdc4f1ff 100644 --- a/x-pack/test/functional/services/ml/job_table.ts +++ b/x-pack/test/functional/services/ml/job_table.ts @@ -50,6 +50,43 @@ export function MachineLearningJobTableProvider( const retry = getService('retry'); return new (class MlJobTable { + public async clickJobRowCalendarWithAssertion( + jobId: string, + calendarId: string + ): Promise { + await this.ensureDetailsOpen(jobId); + const calendarSelector = `mlJobDetailsCalendar-${calendarId}`; + await testSubjects.existOrFail(calendarSelector, { + timeout: 3_000, + }); + await testSubjects.click(calendarSelector, 3_000); + await testSubjects.existOrFail('mlPageCalendarEdit > mlCalendarFormEdit', { + timeout: 3_000, + }); + const calendarTitleVisibleText = await testSubjects.getVisibleText('mlCalendarTitle'); + expect(calendarTitleVisibleText).to.contain( + calendarId, + `Calendar page title should contain [${calendarId}], got [${calendarTitleVisibleText}]` + ); + } + + public async assertJobRowCalendars( + jobId: string, + expectedCalendars: string[], + checkForExists: boolean = true + ): Promise { + await this.withDetailsOpen(jobId, async function verifyJobRowCalendars(): Promise { + for await (const expectedCalendar of expectedCalendars) { + const calendarSelector = `mlJobDetailsCalendar-${expectedCalendar}`; + await testSubjects[checkForExists ? 'existOrFail' : 'missingOrFail'](calendarSelector, { + timeout: 3_000, + }); + if (checkForExists) + expect(await testSubjects.getVisibleText(calendarSelector)).to.be(expectedCalendar); + } + }); + } + public async parseJobTable( tableEnvironment: 'mlAnomalyDetection' | 'stackMgmtJobList' = 'mlAnomalyDetection' ) { diff --git a/x-pack/test/functional/services/ml/settings_calendar.ts b/x-pack/test/functional/services/ml/settings_calendar.ts index 87ffcd2f41b835..1c814d579b3f62 100644 --- a/x-pack/test/functional/services/ml/settings_calendar.ts +++ b/x-pack/test/functional/services/ml/settings_calendar.ts @@ -19,6 +19,22 @@ export function MachineLearningSettingsCalendarProvider( const comboBox = getService('comboBox'); return { + async assertCalendarRowJobs( + calendarId: string, + expectedConnectedJobs: string[] + ): Promise { + await this.filterWithSearchString(calendarId, 1); // makes sure the table only has the one row we want to check + const calendarRow = (await this.parseCalendarTable())[0]; + const sortedActual: string[] = calendarRow.jobs.replaceAll(',', '').split(' ').sort(); + + const sortedExpected = expectedConnectedJobs.sort(); + + expect(sortedActual).to.eql( + sortedExpected, + `Expected job column entries for calendar [${calendarId}] to be [${sortedExpected}], got [${sortedActual}]` + ); + }, + async parseCalendarTable() { const table = await testSubjects.find('~mlCalendarTable'); const $ = await table.parseDomContent(); diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts index a8949fc8498123..8909d8cea2ec52 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts @@ -396,7 +396,8 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await testSubjects.click('embeddablePanelToggleMenuIcon'); await testSubjects.click('embeddablePanelMore-mainMenu'); - await testSubjects.click('embeddablePanelAction-embeddable_addToNewCase'); + await testSubjects.click('embeddablePanelAction-embeddable_addToExistingCase'); + await testSubjects.click('cases-table-add-case-filter-bar'); await cases.create.createCase({ title: caseTitle, diff --git a/x-pack/test/localization/tests/lens/smokescreen.ts b/x-pack/test/localization/tests/lens/smokescreen.ts index 85dd1e18d83eae..afd0822290f2c1 100644 --- a/x-pack/test/localization/tests/lens/smokescreen.ts +++ b/x-pack/test/localization/tests/lens/smokescreen.ts @@ -336,7 +336,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql(termTranslator('bar')); await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', operation: 'terms', 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 1bffc0392a9a3e..6f3c63a72d880e 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 @@ -56,20 +56,11 @@ export default function ApiTest({ getService }: FtrProviderContext) { params: { screenContexts?: ObservabilityAIAssistantScreenContextRequest[] }, cb: (conversationSimulator: LlmResponseSimulator) => Promise ) { - const titleInterceptor = proxy.intercept( - 'title', - (body) => - (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).functions?.find( - (fn) => fn.name === 'title_conversation' - ) !== undefined - ); + const titleInterceptor = proxy.intercept('title', (body) => isFunctionTitleRequest(body)); const conversationInterceptor = proxy.intercept( 'conversation', - (body) => - (JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming).functions?.find( - (fn) => fn.name === 'title_conversation' - ) === undefined + (body) => !isFunctionTitleRequest(body) ); const responsePromise = new Promise((resolve, reject) => { @@ -281,17 +272,27 @@ export default function ApiTest({ getService }: FtrProviderContext) { }, }, }); - expect(omit(events[3], 'conversation.id', 'conversation.last_updated')).to.eql({ + + expect( + omit( + events[3], + 'conversation.id', + 'conversation.last_updated', + 'conversation.token_count' + ) + ).to.eql({ type: StreamingChatResponseEventType.ConversationCreate, conversation: { title: 'My generated title', - token_count: { - completion: 7, - prompt: 2262, - total: 2269, - }, }, }); + + const tokenCount = (events[3] as ConversationCreateEvent).conversation.token_count!; + + expect(tokenCount.completion).to.be.greaterThan(0); + expect(tokenCount.prompt).to.be.greaterThan(0); + + expect(tokenCount.total).to.eql(tokenCount.completion + tokenCount.prompt); }); after(async () => { @@ -495,19 +496,15 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); it('has correct token count for a new conversation', async () => { - expect(conversationCreatedEvent.conversation.token_count).to.eql({ - completion: 21, - prompt: 2262, - total: 2283, - }); + expect(conversationCreatedEvent.conversation.token_count?.completion).to.be.greaterThan(0); + expect(conversationCreatedEvent.conversation.token_count?.prompt).to.be.greaterThan(0); + expect(conversationCreatedEvent.conversation.token_count?.total).to.be.greaterThan(0); }); it('has correct token count for the updated conversation', async () => { - expect(conversationUpdatedEvent.conversation.token_count).to.eql({ - completion: 31, - prompt: 4522, - total: 4553, - }); + expect(conversationUpdatedEvent.conversation.token_count!.total).to.be.greaterThan( + conversationCreatedEvent.conversation.token_count!.total + ); }); }); @@ -526,5 +523,5 @@ function decodeEvents(body: Readable | string) { function isFunctionTitleRequest(body: string) { const parsedBody = JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming; - return parsedBody.functions?.find((fn) => fn.name === 'title_conversation') !== undefined; + return parsedBody.tools?.find((fn) => fn.function.name === 'title_conversation') !== undefined; } 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 2c9549b55ec83a..bed93d3beeeec7 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 @@ -152,7 +152,7 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte (body) => ( JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming - ).functions?.find((fn) => fn.name === 'title_conversation') !== undefined + ).tools?.find((fn) => fn.function.name === 'title_conversation') !== undefined ); const conversationInterceptor = proxy.intercept( @@ -160,7 +160,7 @@ export default function ApiTest({ getService, getPageObjects }: FtrProviderConte (body) => ( JSON.parse(body) as OpenAI.Chat.ChatCompletionCreateParamsNonStreaming - ).functions?.find((fn) => fn.name === 'title_conversation') === undefined + ).tools?.find((fn) => fn.function.name === 'title_conversation') === undefined ); await testSubjects.setValue(ui.pages.conversations.chatInput, 'hello'); 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 6b3e6576596078..30f3a2c87dfd78 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 @@ -57,14 +57,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 1400, 1024 ); - const actionsButton = await testSubjects.find('ruleActionsButton'); - await actionsButton.click(); - await commonScreenshots.takeScreenshot( - 'rule-details-disabling', - screenshotDirectories, - 1400, - 1024 - ); }); }); } diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts index adaed081587946..8ec7a4eeb56cd6 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/all_types.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; -import { getSecurityTelemetryStats, removeTimeFieldsFromTelemetryStats } from '../../../utils'; +import { getSecurityTelemetryStats, removeExtraFieldsFromTelemetryStats } from '../../../utils'; import { createAlertsIndex, deleteAllRules, @@ -46,7 +46,7 @@ export default ({ getService }: FtrProviderContext) => { it('@skipInQA should only have task metric values when no rules are running', async () => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats).to.eql({ detection_rules: [ [ diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts index 48f8be9a3d2c58..abfe92a4cec049 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/detection_rules.ts @@ -16,7 +16,7 @@ import { getSecurityTelemetryStats, createExceptionList, createExceptionListItem, - removeTimeFieldsFromTelemetryStats, + removeExtraFieldsFromTelemetryStats, } from '../../../utils'; import { createRule, @@ -99,7 +99,7 @@ export default ({ getService }: FtrProviderContext) => { // Get the stats and ensure they're empty await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats.detection_rules).to.eql([ [ { @@ -155,7 +155,7 @@ export default ({ getService }: FtrProviderContext) => { // Get the stats and ensure they're empty await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats.detection_rules).to.eql([ [ { @@ -211,7 +211,7 @@ export default ({ getService }: FtrProviderContext) => { // Get the stats and ensure they're empty await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats.detection_rules).to.eql([ [ { @@ -267,7 +267,7 @@ export default ({ getService }: FtrProviderContext) => { // Get the stats and ensure they're empty await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats.detection_rules).to.eql([ [ { @@ -323,7 +323,7 @@ export default ({ getService }: FtrProviderContext) => { // Get the stats and ensure they're empty await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); expect(stats.detection_rules).to.eql([ [ { @@ -451,7 +451,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)); @@ -528,7 +528,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)); @@ -605,7 +605,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)); @@ -682,7 +682,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)); @@ -759,7 +759,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)); @@ -860,7 +860,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const detectionRules = stats.detection_rules .flat() .map((obj: any) => (obj.passed != null ? obj : obj.detection_rule)) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/security_lists.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/security_lists.ts index 088016d868caa1..ac7a99899a336f 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/security_lists.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/telemetry/trial_license_complete_tier/task_based/security_lists.ts @@ -15,7 +15,7 @@ import { getSecurityTelemetryStats, createExceptionListItem, createExceptionList, - removeTimeFieldsFromTelemetryStats, + removeExtraFieldsFromTelemetryStats, } from '../../../utils'; import { createAlertsIndex, @@ -76,7 +76,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const trustedApplication = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.trusted_application)); @@ -146,7 +146,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const trustedApplication = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.trusted_application)) @@ -222,7 +222,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const securityLists = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.endpoint_exception)); @@ -288,7 +288,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const securityLists = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.endpoint_exception)) @@ -368,7 +368,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const endPointEventFilter = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.endpoint_event_filter)); @@ -435,7 +435,7 @@ export default ({ getService }: FtrProviderContext) => { await retry.try(async () => { const stats = await getSecurityTelemetryStats(supertest, log); - removeTimeFieldsFromTelemetryStats(stats); + removeExtraFieldsFromTelemetryStats(stats); const endPointEventFilter = stats.security_lists .flat() .map((obj: any) => (obj.passed != null ? obj : obj.endpoint_event_filter)) diff --git a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts index 7c0931b4b5ae94..912649862a24f8 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/detections_response/utils/telemetry/remove_time_fields_from_telemetry_stats.ts @@ -7,13 +7,14 @@ import { unset } from 'lodash'; -export const removeTimeFieldsFromTelemetryStats = (stats: any) => { +export const removeExtraFieldsFromTelemetryStats = (stats: any) => { Object.entries(stats).forEach(([, value]: [unknown, any]) => { value.forEach((entry: any, i: number) => { - entry.forEach((e: any, j: number) => { + entry.forEach((_e: any, j: number) => { unset(value, `[${i}][${j}].time_executed_in_ms`); unset(value, `[${i}][${j}].start_time`); unset(value, `[${i}][${j}].end_time`); + unset(value, `[${i}][${j}].cluster_uuid`); }); }); }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts index 4b3501db69859a..463d6b2e151c08 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_creation/machine_learning_rule.cy.ts @@ -53,77 +53,73 @@ import { visit } from '../../../../tasks/navigation'; import { openRuleManagementPageViaBreadcrumbs } from '../../../../tasks/rules_management'; import { CREATE_RULE_URL } from '../../../../urls/navigation'; -describe( - 'Machine Learning rules', - { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, - () => { - const expectedUrls = (getMachineLearningRule().references ?? []).join(''); - const expectedFalsePositives = (getMachineLearningRule().false_positives ?? []).join(''); - const expectedTags = (getMachineLearningRule().tags ?? []).join(''); - const expectedMitre = formatMitreAttackDescription(getMachineLearningRule().threat ?? []); - const expectedNumberOfRules = 1; +describe('Machine Learning rules', { tags: ['@ess', '@serverless'] }, () => { + const expectedUrls = (getMachineLearningRule().references ?? []).join(''); + const expectedFalsePositives = (getMachineLearningRule().false_positives ?? []).join(''); + const expectedTags = (getMachineLearningRule().tags ?? []).join(''); + const expectedMitre = formatMitreAttackDescription(getMachineLearningRule().threat ?? []); + const expectedNumberOfRules = 1; - beforeEach(() => { - login(); - visit(CREATE_RULE_URL); - }); + beforeEach(() => { + login(); + visit(CREATE_RULE_URL); + }); - it('Creates and enables a new ml rule', () => { - const mlRule = getMachineLearningRule(); - selectMachineLearningRuleType(); - fillDefineMachineLearningRuleAndContinue(mlRule); - fillAboutRuleAndContinue(mlRule); - fillScheduleRuleAndContinue(mlRule); - createAndEnableRule(); - openRuleManagementPageViaBreadcrumbs(); + it('Creates and enables a new ml rule', () => { + const mlRule = getMachineLearningRule(); + selectMachineLearningRuleType(); + fillDefineMachineLearningRuleAndContinue(mlRule); + fillAboutRuleAndContinue(mlRule); + fillScheduleRuleAndContinue(mlRule); + createAndEnableRule(); + openRuleManagementPageViaBreadcrumbs(); - cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); + cy.get(CUSTOM_RULES_BTN).should('have.text', 'Custom rules (1)'); - expectNumberOfRules(RULES_MANAGEMENT_TABLE, expectedNumberOfRules); + expectNumberOfRules(RULES_MANAGEMENT_TABLE, expectedNumberOfRules); - cy.get(RULE_NAME).should('have.text', mlRule.name); - cy.get(RISK_SCORE).should('have.text', mlRule.risk_score); - cy.get(SEVERITY).should('have.text', 'Critical'); - cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); + cy.get(RULE_NAME).should('have.text', mlRule.name); + cy.get(RISK_SCORE).should('have.text', mlRule.risk_score); + cy.get(SEVERITY).should('have.text', 'Critical'); + cy.get(RULE_SWITCH).should('have.attr', 'aria-checked', 'true'); - goToRuleDetailsOf(mlRule.name); + goToRuleDetailsOf(mlRule.name); - cy.get(RULE_NAME_HEADER).should('contain', `${mlRule.name}`); - cy.get(ABOUT_RULE_DESCRIPTION).should('have.text', mlRule.description); - cy.get(ABOUT_DETAILS).within(() => { - getDetails(SEVERITY_DETAILS).should('have.text', 'Critical'); - getDetails(RISK_SCORE_DETAILS).should('have.text', mlRule.risk_score); - getDetails(REFERENCE_URLS_DETAILS).should((details) => { - expect(removeExternalLinkText(details.text())).equal(expectedUrls); - }); - getDetails(FALSE_POSITIVES_DETAILS).should('have.text', expectedFalsePositives); - getDetails(MITRE_ATTACK_DETAILS).should((mitre) => { - expect(removeExternalLinkText(mitre.text())).equal(expectedMitre); - }); - getDetails(TAGS_DETAILS).should('have.text', expectedTags); - }); - cy.get(DEFINITION_DETAILS).within(() => { - getDetails(ANOMALY_SCORE_DETAILS).should('have.text', mlRule.anomaly_threshold); - getDetails(RULE_TYPE_DETAILS).should('have.text', 'Machine Learning'); - getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); - const machineLearningJobsArray = isArray(mlRule.machine_learning_job_id) - ? mlRule.machine_learning_job_id - : [mlRule.machine_learning_job_id]; - // With the #1912 ML rule improvement changes we enable jobs on rule creation. - // Though, in cypress jobs enabling does not work reliably and job can be started or stopped. - // Thus, we disable next check till we fix the issue with enabling jobs in cypress. - // Relevant ticket: https://github.com/elastic/security-team/issues/5389 - // cy.get(MACHINE_LEARNING_JOB_STATUS).should('have.text', 'StoppedStopped'); - cy.get(MACHINE_LEARNING_JOB_ID).should('have.text', machineLearningJobsArray.join('')); + cy.get(RULE_NAME_HEADER).should('contain', `${mlRule.name}`); + cy.get(ABOUT_RULE_DESCRIPTION).should('have.text', mlRule.description); + cy.get(ABOUT_DETAILS).within(() => { + getDetails(SEVERITY_DETAILS).should('have.text', 'Critical'); + getDetails(RISK_SCORE_DETAILS).should('have.text', mlRule.risk_score); + getDetails(REFERENCE_URLS_DETAILS).should((details) => { + expect(removeExternalLinkText(details.text())).equal(expectedUrls); }); - cy.get(SCHEDULE_DETAILS).within(() => { - getDetails(RUNS_EVERY_DETAILS).should('have.text', `${mlRule.interval}`); - const humanizedDuration = getHumanizedDuration( - mlRule.from ?? 'now-6m', - mlRule.interval ?? '5m' - ); - getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should('have.text', `${humanizedDuration}`); + getDetails(FALSE_POSITIVES_DETAILS).should('have.text', expectedFalsePositives); + getDetails(MITRE_ATTACK_DETAILS).should((mitre) => { + expect(removeExternalLinkText(mitre.text())).equal(expectedMitre); }); + getDetails(TAGS_DETAILS).should('have.text', expectedTags); + }); + cy.get(DEFINITION_DETAILS).within(() => { + getDetails(ANOMALY_SCORE_DETAILS).should('have.text', mlRule.anomaly_threshold); + getDetails(RULE_TYPE_DETAILS).should('have.text', 'Machine Learning'); + getDetails(TIMELINE_TEMPLATE_DETAILS).should('have.text', 'None'); + const machineLearningJobsArray = isArray(mlRule.machine_learning_job_id) + ? mlRule.machine_learning_job_id + : [mlRule.machine_learning_job_id]; + // With the #1912 ML rule improvement changes we enable jobs on rule creation. + // Though, in cypress jobs enabling does not work reliably and job can be started or stopped. + // Thus, we disable next check till we fix the issue with enabling jobs in cypress. + // Relevant ticket: https://github.com/elastic/security-team/issues/5389 + // cy.get(MACHINE_LEARNING_JOB_STATUS).should('have.text', 'StoppedStopped'); + cy.get(MACHINE_LEARNING_JOB_ID).should('have.text', machineLearningJobsArray.join('')); + }); + cy.get(SCHEDULE_DETAILS).within(() => { + getDetails(RUNS_EVERY_DETAILS).should('have.text', `${mlRule.interval}`); + const humanizedDuration = getHumanizedDuration( + mlRule.from ?? 'now-6m', + mlRule.interval ?? '5m' + ); + getDetails(ADDITIONAL_LOOK_BACK_DETAILS).should('have.text', `${humanizedDuration}`); }); - } -); + }); +}); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/custom_query_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/custom_query_rule.cy.ts index 2da17854f4e65d..3424f747e5aeb8 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/custom_query_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/detection_engine/rule_edit/custom_query_rule.cy.ts @@ -60,7 +60,7 @@ import { saveEditedRule, visitEditRulePage } from '../../../../tasks/edit_rule'; import { login } from '../../../../tasks/login'; import { getDetails } from '../../../../tasks/rule_details'; -describe('Custom query rules', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, () => { +describe('Custom query rules', { tags: ['@ess', '@serverless'] }, () => { const rule = getEditedRule(); const expectedEditedtags = rule.tags?.join(''); const expectedEditedIndexPatterns = rule.index; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts index a60d6d6fe56d24..b165eb1fc6845b 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_authorization.cy.ts @@ -65,6 +65,7 @@ const loginPageAsWriteAuthorizedUser = (url: string) => { visit(url); }; +// https://github.com/elastic/kibana/issues/179965 describe( 'Detection rules, Prebuilt Rules Installation and Update - Authorization/RBAC', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts index db84d92e4ddb64..524ce86e6e73cb 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/install_update_error_handling.cy.ts @@ -36,6 +36,7 @@ import { } from '../../../../tasks/prebuilt_rules'; import { visitRulesManagementTable } from '../../../../tasks/rules_management'; +// https://github.com/elastic/kibana/issues/179970 describe( 'Detection rules, Prebuilt Rules Installation and Update - Error handling', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts index 15e020b5e06630..5c353729c571a4 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/management.cy.ts @@ -50,6 +50,7 @@ const rules = Array.from(Array(5)).map((_, i) => { }); }); +// https://github.com/elastic/kibana/issues/179973 describe('Prebuilt rules', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, () => { beforeEach(() => { login(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts index 4812efc740ae20..c2467bf1707e26 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/notifications.cy.ts @@ -54,6 +54,7 @@ describe( cy.get(RULES_UPDATES_TAB).should('not.exist'); }); + // https://github.com/elastic/kibana/issues/179967 it( 'should NOT display install or update notifications when latest rules are installed', { tags: ['@brokenInServerlessQA'] }, @@ -70,73 +71,66 @@ describe( ); }); - describe('Notifications', () => { + // https://github.com/elastic/kibana/issues/179968 + describe('Notifications', { tags: ['@brokenInServerlessQA'] }, () => { beforeEach(() => { installPrebuiltRuleAssets([RULE_1]); }); - describe( - 'Rules installation notification when no rules have been installed', - { tags: ['@brokenInServerlessQA'] }, - () => { - beforeEach(() => { - visitRulesManagementTable(); - }); + describe('Rules installation notification when no rules have been installed', () => { + beforeEach(() => { + visitRulesManagementTable(); + }); - it('should notify user about prebuilt rules available for installation', () => { - cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); - cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); - cy.get(RULES_UPDATES_TAB).should('not.exist'); - }); - } - ); + it('should notify user about prebuilt rules available for installation', () => { + cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); + cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); + cy.get(RULES_UPDATES_TAB).should('not.exist'); + }); + }); - describe( - 'Rule installation notification when at least one rule already installed', - { tags: ['@brokenInServerlessQA'] }, - () => { - beforeEach(() => { - installAllPrebuiltRulesRequest().then(() => { - /* Create new rule assets with a different rule_id as the one that was */ - /* installed before in order to trigger the installation notification */ - const RULE_2 = createRuleAssetSavedObject({ - name: 'Test rule 2', - rule_id: 'rule_2', - }); - const RULE_3 = createRuleAssetSavedObject({ - name: 'Test rule 3', - rule_id: 'rule_3', - }); - - visitRulesManagementTable(); - installPrebuiltRuleAssets([RULE_2, RULE_3]); + describe('Rule installation notification when at least one rule already installed', () => { + beforeEach(() => { + installAllPrebuiltRulesRequest().then(() => { + /* Create new rule assets with a different rule_id as the one that was */ + /* installed before in order to trigger the installation notification */ + const RULE_2 = createRuleAssetSavedObject({ + name: 'Test rule 2', + rule_id: 'rule_2', + }); + const RULE_3 = createRuleAssetSavedObject({ + name: 'Test rule 3', + rule_id: 'rule_3', }); - }); - it('should notify user about prebuilt rules available for installation', () => { - const numberOfAvailableRules = 2; - cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); - cy.get(ADD_ELASTIC_RULES_BTN).should( - 'have.text', - `Add Elastic rules${numberOfAvailableRules}` - ); - cy.get(RULES_UPDATES_TAB).should('not.exist'); + visitRulesManagementTable(); + installPrebuiltRuleAssets([RULE_2, RULE_3]); }); + }); - it('should notify user a rule is again available for installation if it is deleted', () => { - /* Install available rules, assert that the notification is gone */ - /* then delete one rule and assert that the notification is back */ - installAllPrebuiltRulesRequest().then(() => { - cy.reload(); - deleteFirstRule(); - cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); - cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); - }); + it('should notify user about prebuilt rules available for installation', () => { + const numberOfAvailableRules = 2; + cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); + cy.get(ADD_ELASTIC_RULES_BTN).should( + 'have.text', + `Add Elastic rules${numberOfAvailableRules}` + ); + cy.get(RULES_UPDATES_TAB).should('not.exist'); + }); + + it('should notify user a rule is again available for installation if it is deleted', () => { + /* Install available rules, assert that the notification is gone */ + /* then delete one rule and assert that the notification is back */ + installAllPrebuiltRulesRequest().then(() => { + cy.reload(); + deleteFirstRule(); + cy.get(ADD_ELASTIC_RULES_BTN).should('be.visible'); + cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); }); - } - ); + }); + }); - describe('Rule update notification', { tags: ['@brokenInServerlessQA'] }, () => { + describe('Rule update notification', () => { beforeEach(() => { installAllPrebuiltRulesRequest().then(() => { /* Create new rule asset with the same rule_id as the one that was installed */ @@ -160,39 +154,35 @@ describe( }); }); - describe( - 'Rule installation available and rule update available notifications', - { tags: ['@brokenInServerlessQA'] }, - () => { - beforeEach(() => { - installAllPrebuiltRulesRequest().then(() => { - /* Create new rule assets with a different rule_id as the one that was */ - /* installed before in order to trigger the installation notification */ - const RULE_2 = createRuleAssetSavedObject({ - name: 'Test rule 2', - rule_id: 'rule_2', - }); - /* Create new rule asset with the same rule_id as the one that was installed */ - /* but with a higher version, in order to trigger the update notification */ - const UPDATED_RULE = createRuleAssetSavedObject({ - name: 'Test rule 1.1 (updated)', - rule_id: 'rule_1', - version: 2, - }); - installPrebuiltRuleAssets([RULE_2, UPDATED_RULE]); - visitRulesManagementTable(); + describe('Rule installation available and rule update available notifications', () => { + beforeEach(() => { + installAllPrebuiltRulesRequest().then(() => { + /* Create new rule assets with a different rule_id as the one that was */ + /* installed before in order to trigger the installation notification */ + const RULE_2 = createRuleAssetSavedObject({ + name: 'Test rule 2', + rule_id: 'rule_2', + }); + /* Create new rule asset with the same rule_id as the one that was installed */ + /* but with a higher version, in order to trigger the update notification */ + const UPDATED_RULE = createRuleAssetSavedObject({ + name: 'Test rule 1.1 (updated)', + rule_id: 'rule_1', + version: 2, }); + installPrebuiltRuleAssets([RULE_2, UPDATED_RULE]); + visitRulesManagementTable(); }); + }); - it('should notify user about prebuilt rules available for installation and for upgrade', () => { - // 1 rule available for installation - cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); - // 1 rule available for update - cy.get(RULES_UPDATES_TAB).should('be.visible'); - cy.get(RULES_UPDATES_TAB).should('have.text', `Rule Updates${1}`); - }); - } - ); + it('should notify user about prebuilt rules available for installation and for upgrade', () => { + // 1 rule available for installation + cy.get(ADD_ELASTIC_RULES_BTN).should('have.text', `Add Elastic rules${1}`); + // 1 rule available for update + cy.get(RULES_UPDATES_TAB).should('be.visible'); + cy.get(RULES_UPDATES_TAB).should('have.text', `Rule Updates${1}`); + }); + }); }); } ); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/update_workflow.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/update_workflow.ts index d858280dd52941..da89d5b91ab48a 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/update_workflow.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/prebuilt_rules/update_workflow.ts @@ -32,7 +32,7 @@ import { visitRulesManagementTable } from '../../../../tasks/rules_management'; describe( 'Detection rules, Prebuilt Rules Installation and Update workflow', - { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, + { tags: ['@ess', '@serverless'] }, () => { describe('Upgrade of prebuilt rules', () => { const RULE_1_ID = 'rule_1'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts index 6d3fb2918938c1..a2242331bf2113 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/related_integrations/related_integrations.cy.ts @@ -45,6 +45,8 @@ import { waitForPageToBeLoaded, } from '../../../../tasks/rule_details'; +// https://github.com/elastic/kibana/issues/179943 + describe('Related integrations', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, () => { const DATA_STREAM_NAME = 'logs-related-integrations-test'; const PREBUILT_RULE_NAME = 'Prebuilt rule with related integrations'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts index 94b6804b311932..f997ff1524b450 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules.cy.ts @@ -182,6 +182,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => cy.get(APPLY_TIMELINE_RULE_BULK_MENU_ITEM).should('be.disabled'); }); + // github.com/elastic/kibana/issues/179954 it('Only prebuilt rules selected', { tags: ['@brokenInServerlessQA'] }, () => { createAndInstallMockedPrebuiltRules(PREBUILT_RULES); @@ -200,6 +201,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => }); }); + // https://github.com/elastic/kibana/issues/179955 it( 'Prebuilt and custom rules selected: user proceeds with custom rules editing', { tags: ['@brokenInServerlessQA'] }, @@ -230,6 +232,7 @@ describe('Detection rules, bulk edit', { tags: ['@ess', '@serverless'] }, () => } ); + // https://github.com/elastic/kibana/issues/179956 it( 'Prebuilt and custom rules selected: user cancels action', { tags: ['@brokenInServerlessQA'] }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts index e4b39d81787519..e2acc801a66528 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/bulk_actions/bulk_edit_rules_actions.cy.ts @@ -72,6 +72,7 @@ const ruleNameToAssert = 'Custom rule name with actions'; const expectedExistingSlackMessage = 'Existing slack action'; const expectedSlackMessage = 'Slack action test message'; +// https://github.com/elastic/kibana/issues/179958 describe( 'Detection rules, bulk edit of rule actions', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts index 0cfcc437144972..d0a113f7253fea 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/import_export/export_rule.cy.ts @@ -93,6 +93,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { expectManagementTableRules(['Enabled rule to export']); }); + // https://github.com/elastic/kibana/issues/179959 it( 'shows a modal saying that no rules can be exported if all the selected rules are prebuilt', { tags: ['@brokenInServerlessQA'] }, @@ -109,6 +110,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { } ); + // https://github.com/elastic/kibana/issues/179960 it('exports only custom rules', { tags: ['@brokenInServerlessQA'] }, function () { const expectedNumberCustomRulesToBeExported = 1; @@ -138,7 +140,7 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { }); }); - context('rules with exceptions', { tags: ['@brokenInServerlessQA'] }, () => { + context('rules with exceptions', () => { beforeEach(() => { deleteExceptionList(exceptionList.list_id, exceptionList.namespace_type); // create rule with exceptions @@ -161,7 +163,8 @@ describe('Export rules', { tags: ['@ess', '@serverless'] }, () => { ); }); - it('exports custom rules with exceptions', function () { + // https://github.com/elastic/kibana/issues/180029 + it('exports custom rules with exceptions', { tags: ['@brokenInServerlessQA'] }, function () { // one rule with exception, one without it const expectedNumberCustomRulesToBeExported = 2; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts index 7e753d42b6b6d8..aa42d7bea0f565 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rule_actions/snoozing/rule_snoozing.cy.ts @@ -177,7 +177,7 @@ describe('rule snoozing', { tags: ['@ess', '@serverless'] }, () => { deleteConnectors(); }); - it('adds an action to a snoozed rule', { tags: ['@brokenInServerlessQA'] }, () => { + it('adds an action to a snoozed rule', () => { createSnoozedRule(getNewRule({ name: 'Snoozed rule' })).then(({ body: rule }) => { visitEditRulePage(rule.id); goToActionsStepTab(); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts index 6014f1c83b9af2..275c24fca866cf 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/detection_response/rule_management/rules_table/rules_table_selection.cy.ts @@ -34,6 +34,7 @@ const RULE_2 = createRuleAssetSavedObject({ rule_id: 'rule_2', }); +// https://github.com/elastic/kibana/issues/179961 describe( 'Rules table: selection', { tags: ['@ess', '@serverless', '@brokenInServerlessQA'] }, diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts index 080ba6f5fcd226..241add17032482 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/alerts_details.cy.ts @@ -4,7 +4,6 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { DataTableModel } from '@kbn/securitysolution-data-table'; import { disableExpandableFlyout } from '../../../tasks/api_calls/kibana_advanced_settings'; import { @@ -34,7 +33,6 @@ import { ALERTS_URL } from '../../../urls/navigation'; import { tablePageSelector } from '../../../screens/table_pagination'; import { ALERTS_TABLE_COUNT } from '../../../screens/timeline'; import { ALERT_SUMMARY_SEVERITY_DONUT_CHART } from '../../../screens/alerts'; -import { getLocalstorageEntryAsObject } from '../../../helpers/common'; import { visitRuleDetailsPage, waitForPageToBeLoaded as waitForRuleDetailsPageToBeLoaded, @@ -181,7 +179,7 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { }); }); - describe('Localstorage management', { tags: ['@brokenInServerlessQA'] }, () => { + describe('Localstorage management', () => { const ARCHIVED_RULE_ID = '7015a3e2-e4ea-11ed-8c11-49608884878f'; const ARCHIVED_RULE_NAME = 'Endpoint Security'; @@ -204,40 +202,28 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { expandFirstAlert(); }); - const alertTableKey = 'alerts-page'; - const getFlyoutConfig = (dataTable: { [alertTableKey]: DataTableModel }) => - dataTable?.[alertTableKey]?.expandedDetail?.query; - /** * Localstorage is updated after a delay here x-pack/plugins/security_solution/public/common/store/data_table/epic_local_storage.ts * We create this config to re-check localStorage 3 times, every 500ms to avoid any potential flakyness from that delay */ - const storageCheckRetryConfig = { - timeout: 1500, - interval: 500, - }; it('should store the flyout state in localstorage', () => { cy.get(OVERVIEW_RULE).should('be.visible'); - const localStorageCheck = () => - cy.getAllLocalStorage().then((storage) => { - const securityDataTable = getLocalstorageEntryAsObject(storage, 'securityDataTable'); - return getFlyoutConfig(securityDataTable)?.panelView === 'eventDetail'; - }); - cy.waitUntil(localStorageCheck, storageCheckRetryConfig); + cy.window().then((win) => { + const securityDataTableStorage = win.localStorage.getItem('securityDataTable'); + cy.wrap(securityDataTableStorage).should('contain', '"panelView":"eventDetail"'); + }); }); it('should remove the flyout details from local storage when closed', () => { cy.get(OVERVIEW_RULE).should('be.visible'); closeAlertFlyout(); - const localStorageCheck = () => - cy.getAllLocalStorage().then((storage) => { - const securityDataTable = getLocalstorageEntryAsObject(storage, 'securityDataTable'); - return getFlyoutConfig(securityDataTable)?.panelView === undefined; - }); - cy.waitUntil(localStorageCheck, storageCheckRetryConfig); + cy.window().then((win) => { + const securityDataTableStorage = win.localStorage.getItem('securityDataTable'); + cy.wrap(securityDataTableStorage).should('not.contain', '"panelView"'); + }); }); it('should remove the flyout state from localstorage when navigating away without closing the flyout', () => { @@ -246,13 +232,10 @@ describe('Alert details flyout', { tags: ['@ess', '@serverless'] }, () => { visitRuleDetailsPage(ARCHIVED_RULE_ID); waitForRuleDetailsPageToBeLoaded(ARCHIVED_RULE_NAME); - const localStorageCheck = () => - cy.getAllLocalStorage().then((storage) => { - const securityDataTable = getLocalstorageEntryAsObject(storage, 'securityDataTable'); - return getFlyoutConfig(securityDataTable)?.panelView === undefined; - }); - - cy.waitUntil(localStorageCheck, storageCheckRetryConfig); + cy.window().then((win) => { + const securityDataTableStorage = win.localStorage.getItem('securityDataTable'); + cy.wrap(securityDataTableStorage).should('not.contain', '"panelView"'); + }); }); it('should not reopen the flyout when navigating away from the alerts page and returning to it', () => { diff --git a/x-pack/test/security_solution_cypress/cypress/helpers/common.ts b/x-pack/test/security_solution_cypress/cypress/helpers/common.ts index 26b23010d6e48c..e965684f1ab0e7 100644 --- a/x-pack/test/security_solution_cypress/cypress/helpers/common.ts +++ b/x-pack/test/security_solution_cypress/cypress/helpers/common.ts @@ -24,17 +24,3 @@ export const getDataTestSubjectSelectorStartWith = (dataTestSubjectValue: string * @param className the value passed to class property of the DOM element */ export const getClassSelector = (className: string) => `.${className}`; - -export const getLocalstorageEntryAsObject = (storage: Cypress.StorageByOrigin, field: string) => { - // baseUrl value from x-pack/plugins/security_solution/cypress/cypress.config.ts - const envLocalstorage = storage?.[Cypress.config('baseUrl') as string]; - let result; - if (envLocalstorage && envLocalstorage[field]) { - try { - result = JSON.parse(envLocalstorage[field] as string); - } catch { - result = undefined; - } - } - return result; -}; diff --git a/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts b/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts index 3404f4800944e1..0c0994af2759e5 100644 --- a/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts +++ b/x-pack/test/security_solution_cypress/cypress/screens/common/rule_actions.ts @@ -16,6 +16,8 @@ export const ACTION_BTN = '[data-test-subj$="-siem-ActionTypeSelectOption"]'; export const CREATE_ACTION_CONNECTOR_BTN = '[data-test-subj="createActionConnectorButton-0"]'; +export const CREATE_NEW_EMAIL_CONNECTOR = '[data-test-subj="addNewActionConnectorButton-.email"]'; + export const SAVE_ACTION_CONNECTOR_BTN = '[data-test-subj="saveActionButtonModal"]'; export const EMAIL_ACTION_TO_INPUT = '[data-test-subj="toEmailAddressInput"]'; diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/common/rule_actions.ts b/x-pack/test/security_solution_cypress/cypress/tasks/common/rule_actions.ts index f41e619ae32f55..178c3a65915d79 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/common/rule_actions.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/common/rule_actions.ts @@ -32,10 +32,12 @@ import { actionFormSelector, ACTIONS_NOTIFY_PER_RULE_RUN_BUTTON, INDEX_CONNECTOR_COMBO_BOX_INPUT, + CREATE_NEW_EMAIL_CONNECTOR, } from '../../screens/common/rule_actions'; import { COMBO_BOX_SELECTION } from '../../screens/common/controls'; import type { EmailConnector, IndexConnector } from '../../objects/connector'; import { getEmailConnector, getIndexConnector } from '../../objects/connector'; +import { CLOUD_SERVERLESS } from '../../env_var_names_constants'; export const addSlackRuleAction = (message: string) => { cy.get(SLACK_ACTION_BTN).click(); @@ -58,7 +60,11 @@ export const fillEmailConnectorForm = (connector: EmailConnector = getEmailConne }; export const createEmailConnector = () => { - cy.get(CREATE_ACTION_CONNECTOR_BTN).click(); + // In cloud there is a default connector for email already created, in that case the selector we need to use is different. + const CREATE_CONNECTOR_ELEMENT = Cypress.env(CLOUD_SERVERLESS) + ? CREATE_NEW_EMAIL_CONNECTOR + : CREATE_ACTION_CONNECTOR_BTN; + cy.get(CREATE_CONNECTOR_ELEMENT).click(); fillEmailConnectorForm(); cy.get(SAVE_ACTION_CONNECTOR_BTN).click(); }; diff --git a/x-pack/test/security_solution_cypress/cypress/tsconfig.json b/x-pack/test/security_solution_cypress/cypress/tsconfig.json index 7c9c6ac50d57b6..e8ebaaa0dacdd2 100644 --- a/x-pack/test/security_solution_cypress/cypress/tsconfig.json +++ b/x-pack/test/security_solution_cypress/cypress/tsconfig.json @@ -21,7 +21,6 @@ "@kbn/datemath", "@kbn/guided-onboarding-plugin", "@kbn/alerting-plugin", - "@kbn/securitysolution-data-table", "@kbn/cases-plugin", "@kbn/data-plugin", "@kbn/core-http-common", diff --git a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts index 263c649be14823..def29fb09096c2 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/reporting/generate_csv_discover.ts @@ -160,8 +160,7 @@ export default ({ getService }: FtrProviderContext) => { }); }); - // FAILING ES PROMOTION SERVERLESS: https://github.com/elastic/kibana/issues/180010 - describe.skip('with unmapped fields', () => { + describe('with unmapped fields', () => { before(async () => { await esArchiver.load(archives.unmappedFields.data); await kibanaServer.importExport.load(archives.unmappedFields.savedObjects); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts index 9901c9736b9aa1..afb42c7d03cd12 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/config.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/config.ts @@ -20,4 +20,6 @@ export default createTestConfig({ // include settings from project controller // https://github.com/elastic/project-controller/blob/main/internal/project/observability/config/elasticsearch.yml esServerArgs: ['xpack.ml.dfa.enabled=false', 'xpack.ml.nlp.enabled=false'], + // defined in MKI control plane + kbnServerArgs: ['--xpack.uptime.service.manifestUrl=mockDevUrl'], }); diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts index 765dd693d4dbce..acb33e0b4901b1 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts @@ -18,5 +18,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./burn_rate_rule/burn_rate_rule')); loadTestFile(require.resolve('./es_query_rule/es_query_rule')); loadTestFile(require.resolve('./slos')); + loadTestFile(require.resolve('./synthetics')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/index.ts new file mode 100644 index 00000000000000..02067aeef1b1fa --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getService, loadTestFile }: FtrProviderContext) { + const esDeleteAllIndices = getService('esDeleteAllIndices'); + + describe('Synthetics API Tests', () => { + before(async () => { + await esDeleteAllIndices('heartbeat*'); + await esDeleteAllIndices('synthetics*'); + }); + + loadTestFile(require.resolve('./synthetics_enablement')); + }); +} diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/synthetics_enablement.ts b/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/synthetics_enablement.ts new file mode 100644 index 00000000000000..798cab3290f038 --- /dev/null +++ b/x-pack/test_serverless/api_integration/test_suites/observability/synthetics/synthetics_enablement.ts @@ -0,0 +1,195 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { SYNTHETICS_API_URLS } from '@kbn/synthetics-plugin/common/constants'; +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +interface CommonRequestHeader { + 'kbn-xsrf': string; +} +type InternalRequestHeader = CommonRequestHeader & { 'x-elastic-internal-origin': string }; +type RoleName = 'system_indices_superuser' | 'admin' | 'editor' | 'viewer'; + +const ALL_ENABLED = { + areApiKeysEnabled: true, + canManageApiKeys: true, + canEnable: true, + isEnabled: true, + isValidApiKey: true, +}; + +export default function ({ getService }: FtrProviderContext) { + const correctPrivileges = { + applications: [], + cluster: ['monitor', 'read_pipeline'], + indices: [ + { + allow_restricted_indices: false, + names: ['synthetics-*'], + privileges: ['view_index_metadata', 'create_doc', 'auto_configure', 'read'], + }, + ], + metadata: {}, + run_as: [], + transient_metadata: { + enabled: true, + }, + }; + + describe('SyntheticsEnablement', () => { + const svlUserManager = getService('svlUserManager'); + const svlCommonApi = getService('svlCommonApi'); + const supertestWithoutAuth = getService('supertestWithoutAuth'); + + const esSupertest = getService('esSupertest'); + + const getApiKeys = async () => { + const { body } = await esSupertest.get(`/_security/api_key`).query({ with_limited_by: true }); + const apiKeys = body.api_keys || []; + const filtered = apiKeys.filter( + (apiKey: any) => apiKey.name.includes('synthetics-api-key') && apiKey.invalidated === false + ); + return filtered; + }; + let internalRequestHeader: InternalRequestHeader; + + before(async () => { + internalRequestHeader = svlCommonApi.getInternalRequestHeader(); + }); + + async function enablementPut(role: RoleName = 'admin', expectedStatus: number = 200) { + return supertestWithoutAuth + .put(SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT) + .set(internalRequestHeader) + .set(await svlUserManager.getApiCredentialsForRole(role)) + .expect(expectedStatus); + } + + async function enablementDelete(role: RoleName = 'admin', expectedStatus: number = 200) { + return supertestWithoutAuth + .delete(SYNTHETICS_API_URLS.SYNTHETICS_ENABLEMENT) + .set(internalRequestHeader) + .set(await svlUserManager.getApiCredentialsForRole(role)) + .expect(expectedStatus); + } + + describe('[PUT] /internal/uptime/service/enablement', () => { + const roles: RoleName[] = ['admin', 'editor', 'system_indices_superuser', 'viewer']; + + roles.forEach((role) => { + it(`${role} role has appropriate permissions for API keys`, async () => { + if ((await getApiKeys()).length) { + await enablementDelete(); + } + + const { body } = await enablementPut(role); + + if (['system_indices_superuser', 'admin'].indexOf(role) !== -1) { + expect(body).to.eql(ALL_ENABLED); + } else { + expect(body).to.eql({ + areApiKeysEnabled: true, + canEnable: false, + canManageApiKeys: false, + isValidApiKey: false, + // api key is not there, as it's deleted at the start of the tests + isEnabled: false, + }); + } + }); + }); + + it(`returns response for an admin with privilege`, async () => { + if ((await getApiKeys()).length) { + await enablementDelete(); + } + const { body } = await enablementPut(); + expect(body).eql(ALL_ENABLED); + const validApiKeys = await getApiKeys(); + expect(validApiKeys.length).eql(1); + expect(validApiKeys[0].role_descriptors.synthetics_writer).eql(correctPrivileges); + }); + + it(`does not create excess api keys`, async () => { + const apiKeysResult = await getApiKeys(); + expect(apiKeysResult.length).to.be.lessThan(2); + if (apiKeysResult.length === 0) { + await enablementPut(); + } + const apiResponse = await enablementPut(); + expect(apiResponse.body).eql(ALL_ENABLED); + + const validApiKeys = await getApiKeys(); + expect(validApiKeys.length).eql(1); + expect(validApiKeys[0].role_descriptors.synthetics_writer).eql(correctPrivileges); + }); + + it(`auto re-enables api key when invalidated`, async () => { + const apiResponse = await enablementPut(); + + expect(apiResponse.body).eql(ALL_ENABLED); + + const validApiKeys = await getApiKeys(); + expect(validApiKeys.length).eql(1); + expect(validApiKeys[0].role_descriptors.synthetics_writer).eql(correctPrivileges); + + // delete api key + await esSupertest + .delete(`/_security/api_key`) + .send({ + ids: [validApiKeys[0].id], + }) + .expect(200); + + const validApiKeysAferDeletion = await getApiKeys(); + expect(validApiKeysAferDeletion.length).eql(0); + + // call api a second time + const apiResponse2 = await enablementPut(); + + expect(apiResponse2.body).eql(ALL_ENABLED); + + const validApiKeys2 = await getApiKeys(); + expect(validApiKeys2.length).eql(1); + expect(validApiKeys2[0].role_descriptors.synthetics_writer).eql(correctPrivileges); + }); + }); + + describe('[DELETE] /internal/uptime/service/enablement', () => { + beforeEach(async () => { + const apiKeys = await getApiKeys(); + if (apiKeys.length) { + await enablementDelete('system_indices_superuser'); + } + }); + it('admin can delete api key', async () => { + await enablementPut('system_indices_superuser'); + + const delResponse = await enablementDelete('system_indices_superuser'); + + expect(delResponse.body).eql({}); + const apiResponse = await enablementPut(); + + expect(apiResponse.body).eql(ALL_ENABLED); + }); + + it('with an editor user', async () => { + await enablementPut(); + await enablementDelete('editor', 403); + const apiResponse = await enablementPut('editor'); + expect(apiResponse.body).eql({ + areApiKeysEnabled: true, + canManageApiKeys: false, + canEnable: false, + isEnabled: true, + isValidApiKey: true, + }); + }); + }); + }); +} diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts index 386d387d7ad6e6..591b34da48b575 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/embeddable/_saved_search_embeddable.ts @@ -12,8 +12,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const dataGrid = getService('dataGrid'); const dashboardAddPanel = getService('dashboardAddPanel'); - const dashboardPanelActions = getService('dashboardPanelActions'); - const dashboardReplacePanel = getService('dashboardReplacePanel'); const filterBar = getService('filterBar'); const queryBar = getService('queryBar'); const esArchiver = getService('esArchiver'); @@ -140,18 +138,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ); }); - it('should replace a panel with a saved search', async () => { - await dashboardAddPanel.addVisualization('Rendering Test: datatable'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - await dashboardPanelActions.replacePanelByTitle('Rendering Test: datatable'); - await dashboardReplacePanel.replaceEmbeddable('Rendering-Test:-saved-search'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.dashboard.waitForRenderComplete(); - await testSubjects.missingOrFail('embeddableError'); - expect(await PageObjects.discover.getSavedSearchDocumentCount()).to.be('4,633 documents'); - }); - it('should not show the full screen button', async () => { await addSearchEmbeddableToDashboard(); await testSubjects.missingOrFail('dataGridFullScreenButton'); diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts index ed175a7aefacd8..127621ce9d0bf4 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/group1/_discover_histogram.ts @@ -32,8 +32,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const queryBar = getService('queryBar'); - // FLAKY: https://github.com/elastic/kibana/issues/173904 - describe.skip('discover histogram', function describeIndexTests() { + describe('discover histogram', function describeIndexTests() { before(async () => { await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); await esArchiver.load('test/functional/fixtures/es_archiver/long_window_logstash'); @@ -75,7 +74,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const actualCount = await elasticChart.getVisualizationRenderingCount(); const expectedCount = prevRenderingCount + renderingCountInc; log.debug(`renderings before brushing - actual: ${actualCount} expected: ${expectedCount}`); - return actualCount === expectedCount; + return actualCount <= expectedCount; }); let prevRowData = ''; // to make sure the table is already rendered diff --git a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts index 571a57e25f450a..5dfeb08bbc5ad9 100644 --- a/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts +++ b/x-pack/test_serverless/functional/test_suites/common/visualizations/group1/smokescreen.ts @@ -302,7 +302,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { field: 'bytes', }); - await PageObjects.lens.createLayer(); + await PageObjects.lens.createLayer('data', undefined, 'bar'); + expect(await PageObjects.lens.getLayerType(1)).to.eql('Bar vertical'); await PageObjects.lens.configureDimension({ dimension: 'lns-layerPanel-1 > lnsXY_xDimensionPanel > lns-empty-dimension', 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 a06bbf97d8f340..dd157b9aa162fe 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 @@ -57,7 +57,8 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await testSubjects.click('embeddablePanelToggleMenuIcon'); await testSubjects.click('embeddablePanelMore-mainMenu'); - await testSubjects.click('embeddablePanelAction-embeddable_addToNewCase'); + await testSubjects.click('embeddablePanelAction-embeddable_addToExistingCase'); + await testSubjects.click('cases-table-add-case-filter-bar'); await testSubjects.existOrFail('create-case-flyout'); diff --git a/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts index 5285579c1f3267..044782083b2927 100644 --- a/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/search/cases/attachment_framework.ts @@ -55,7 +55,6 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { it('does not show actions to add lens visualization to case', async () => { await testSubjects.click('embeddablePanelToggleMenuIcon'); await testSubjects.click('embeddablePanelMore-mainMenu'); - await testSubjects.missingOrFail('embeddablePanelAction-embeddable_addToNewCase'); await testSubjects.missingOrFail('embeddablePanelAction-embeddable_addToExistingCase'); }); }); diff --git a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts index 85a78cef48a861..e271013c410a7b 100644 --- a/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts +++ b/x-pack/test_serverless/functional/test_suites/security/ftr/cases/attachment_framework.ts @@ -50,7 +50,8 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await testSubjects.click('embeddablePanelToggleMenuIcon'); await testSubjects.click('embeddablePanelMore-mainMenu'); - await testSubjects.click('embeddablePanelAction-embeddable_addToNewCase'); + await testSubjects.click('embeddablePanelAction-embeddable_addToExistingCase'); + await testSubjects.click('cases-table-add-case-filter-bar'); await testSubjects.existOrFail('create-case-flyout'); diff --git a/x-pack/test_serverless/tsconfig.json b/x-pack/test_serverless/tsconfig.json index 30fa34801e5f3f..21f7afafd3e2ef 100644 --- a/x-pack/test_serverless/tsconfig.json +++ b/x-pack/test_serverless/tsconfig.json @@ -97,5 +97,6 @@ "@kbn/share-plugin", "@kbn/es-query", "@kbn/utility-types", + "@kbn/synthetics-plugin", ] } diff --git a/yarn.lock b/yarn.lock index 830c926daa92fb..13dd71473d4003 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1594,10 +1594,15 @@ gonzales-pe "^4.3.0" node-source-walk "^6.0.1" -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3": - version "0.5.5" - resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz#9283c9ce5b289a3c4f61c12757469e59377f81f3" - integrity sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA== +"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@^0.5.3", "@discoveryjs/json-ext@^0.5.7": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@discoveryjs/natural-compare@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@discoveryjs/natural-compare/-/natural-compare-1.1.0.tgz#75f0642ad64701ffa9d42f1d7ada3b83f4e67cf3" + integrity sha512-yuctPJs5lRXoI8LkpVZGAV6n+DKOuEsfpfcIDQ8ZjWHwazqk1QjBc4jMlof0UlZHyUqv4dwsOTooMiAmtzvwXA== "@dnd-kit/accessibility@^3.0.0": version "3.0.0" @@ -2998,10 +3003,10 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== "@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": version "1.1.2" @@ -3016,10 +3021,10 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -3029,13 +3034,13 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@jsdevtools/ono@^7.1.3": version "7.1.3" @@ -5802,6 +5807,10 @@ version "0.0.0" uid "" +"@kbn/search-notebooks@link:x-pack/plugins/search_notebooks": + version "0.0.0" + uid "" + "@kbn/search-playground@link:x-pack/plugins/search_playground": version "0.0.0" uid "" @@ -6210,6 +6219,10 @@ version "0.0.0" uid "" +"@kbn/shared-ux-tabbed-modal@link:packages/shared-ux/modal/tabbed": + version "0.0.0" + uid "" + "@kbn/shared-ux-utility@link:packages/kbn-shared-ux-utility": version "0.0.0" uid "" @@ -7960,6 +7973,147 @@ "@smithy/util-buffer-from" "^2.0.0" tslib "^2.5.0" +"@statoscope/extensions@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/extensions/-/extensions-5.28.1.tgz#bc270f9366c4b2c13342f1a0d138520cf607a5bb" + integrity sha512-jxkHSNfr7KJOfxlueCtahv1LqscTALLkcGSrYCU71C4tR9GVYoVCUMOrhAFJr6ia+GlPhSaxOSk/j+Ay+ZN9vg== + +"@statoscope/helpers@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/helpers/-/helpers-5.28.1.tgz#ea5e229d7376da62da150b364a4933e40efcfc3a" + integrity sha512-G+o+wCYsuc8+0OdY+kyrTOzm5A6X3yp8ArGTWjr9TCllqDk4LzBlHBmWo7z4SPigjNeY/i38sqi1PeWztW+rWA== + dependencies: + "@types/archy" "^0.0.32" + "@types/semver" "^7.5.1" + archy "~1.0.0" + jora "1.0.0-beta.8" + semver "^7.5.4" + +"@statoscope/report-writer@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/report-writer/-/report-writer-5.28.1.tgz#678e7e82b3061ce37914dbd6227d266c479e029a" + integrity sha512-BjZVdZa7XWkK+zUnFLFWp8yNgmis0DTaPiy/QyU56iWuW+DcF/un1wkvt8ha0jxlXRDbBOfezAztdLNx4U5mxw== + dependencies: + "@discoveryjs/json-ext" "^0.5.7" + "@types/node" "^18.0.0" + "@types/pako" "^2.0.0" + pako "^2.1.0" + +"@statoscope/stats-extension-compressed@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-compressed/-/stats-extension-compressed-5.28.1.tgz#a278dcedfab7f112b9a856422fabf14544abb806" + integrity sha512-tmmKbQwibSaRpWv+p8Tb7BxhMNuSGS28NJeN1t2byzakz/FLCzvkT9tj/aBxfQqEIOGusmN+8znz6XSmJ0cbew== + dependencies: + "@statoscope/extensions" "5.28.1" + "@statoscope/helpers" "5.28.1" + "@statoscope/stats" "5.28.1" + gzip-size "^6.0.0" + +"@statoscope/stats-extension-custom-reports@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-custom-reports/-/stats-extension-custom-reports-5.28.1.tgz#faff2cd4dbd63c3231eef72d472c8f78ef2efc2b" + integrity sha512-f527f6bjl+6iJow+zQFw+hZxGR2hY/FIuFTxhrcbrDXqXu7ApK0e0azJJxAQs0eO1WPMSduXt2k/5kSFecC/kA== + dependencies: + "@statoscope/extensions" "5.28.1" + "@statoscope/helpers" "5.28.1" + "@statoscope/stats" "5.28.1" + "@statoscope/types" "5.28.1" + +"@statoscope/stats-extension-package-info@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-package-info/-/stats-extension-package-info-5.28.1.tgz#d96de973414bf234eb2bb42015f6f2925ed81191" + integrity sha512-HvwlMfFVSx91KmwUmeIcJZS/0rVbNTRvMEBHzPsZ1Y5BIqZlH/bk/HK8nWYjptUaNkpmcxewp5xO9FtpMaSNVA== + dependencies: + "@statoscope/extensions" "5.28.1" + "@statoscope/helpers" "5.28.1" + "@statoscope/stats" "5.28.1" + +"@statoscope/stats-extension-stats-validation-result@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/stats-extension-stats-validation-result/-/stats-extension-stats-validation-result-5.28.1.tgz#1635d41b902ba1940cfe49bcc602a701520ca868" + integrity sha512-vekMnWXVikWo2c4IzmjqKkHGxBTE9RNpTxnD5t5qGz2wx3IHuosV8kp4yaUlD/Atv8C+aLoF0Jg0Q4eB7IYWEA== + dependencies: + "@statoscope/extensions" "5.28.1" + "@statoscope/helpers" "5.28.1" + "@statoscope/stats" "5.28.1" + "@statoscope/types" "5.28.1" + +"@statoscope/stats@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/stats/-/stats-5.28.1.tgz#477156be5a890297a887adaf6369bad429e2787a" + integrity sha512-BB9IZQcBo9I0FFL5sHttF5ubhfE3HkbDMPw5MqEBCee7m6NrlrRe8dxLpPsCUkeFytTWjRLKrY1JOgQq/iE4Fg== + +"@statoscope/types@5.28.1": + version "5.28.1" + resolved "https://registry.yarnpkg.com/@statoscope/types/-/types-5.28.1.tgz#cbe6b9f2866fae3656d9564fd7e9c4b22a5743c5" + integrity sha512-PLcSaRQvGkKhjVLU3YbjFDfZN6H2WF0vp0QqQOOh6qvxRhlOc14ckyou04bnvEqsSWXpvkMPJhOLue+YdIFI9A== + dependencies: + "@statoscope/stats" "5.28.1" + +"@statoscope/webpack-model@5.28.2": + version "5.28.2" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-model/-/webpack-model-5.28.2.tgz#c044479b85a583957d1ab3648c9718b23f1ab377" + integrity sha512-q+AVtXBNyRRDh4prEfVVsZKdrgn0GFb5P3xIwFFvf832I/Tk9rn/fMk9v0+PqwXRYl6vxfrKHqrA8lJiRLh/6Q== + dependencies: + "@statoscope/extensions" "5.28.1" + "@statoscope/helpers" "5.28.1" + "@statoscope/stats" "5.28.1" + "@statoscope/stats-extension-compressed" "5.28.1" + "@statoscope/stats-extension-custom-reports" "5.28.1" + "@statoscope/stats-extension-package-info" "5.28.1" + "@statoscope/stats-extension-stats-validation-result" "5.28.1" + "@statoscope/types" "5.28.1" + "@types/md5" "^2.3.2" + "@types/webpack" "^5.0.0" + md5 "^2.3.0" + +"@statoscope/webpack-plugin@^5.28.2": + version "5.28.2" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-plugin/-/webpack-plugin-5.28.2.tgz#b2bb329d92cca06ee0b1bf4e57bfedb978de1168" + integrity sha512-vFzZw/THVtLeat7+LYbhJhbNYBmHODXiPa1fiqsNQtmNexOTxa9SujrvMkqiVYCKX1elUHVm/UE1JGDmQIcuAA== + dependencies: + "@discoveryjs/json-ext" "^0.5.7" + "@statoscope/report-writer" "5.28.1" + "@statoscope/stats" "5.28.1" + "@statoscope/stats-extension-compressed" "5.28.1" + "@statoscope/stats-extension-custom-reports" "5.28.1" + "@statoscope/types" "5.28.1" + "@statoscope/webpack-model" "5.28.2" + "@statoscope/webpack-stats-extension-compressed" "5.28.2" + "@statoscope/webpack-stats-extension-package-info" "5.28.2" + "@statoscope/webpack-ui" "5.28.2" + "@types/node" "^18.0.0" + "@types/webpack" "^5.0.0" + open "~8.4.0" + +"@statoscope/webpack-stats-extension-compressed@5.28.2": + version "5.28.2" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-compressed/-/webpack-stats-extension-compressed-5.28.2.tgz#5a0ff15f5dda4fab41cef4923e0d7058caf83326" + integrity sha512-8rdt6AHx3H28NIdhEXuQLAz5MAKibZA7+h3/YRJYKjvYAfFi6QlJB1hvoulAPmQlV3bIUKVrk5peHxpKQATQFw== + dependencies: + "@statoscope/stats" "5.28.1" + "@statoscope/stats-extension-compressed" "5.28.1" + "@statoscope/webpack-model" "5.28.2" + "@types/webpack" "^5.0.0" + +"@statoscope/webpack-stats-extension-package-info@5.28.2": + version "5.28.2" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-stats-extension-package-info/-/webpack-stats-extension-package-info-5.28.2.tgz#479ae5e525bf08f66f23b0ce96ed16fb5e0efc4c" + integrity sha512-+pKCnkNp0vGqCTtILHTD5/hBM0wdx8uZBGjFREGNcIMGpeoJM3FbsLMOiS0gFfeJrmL6ZpdhdVzSa58gN6db8A== + dependencies: + "@statoscope/stats" "5.28.1" + "@statoscope/stats-extension-package-info" "5.28.1" + "@statoscope/webpack-model" "5.28.2" + "@types/webpack" "^5.0.0" + +"@statoscope/webpack-ui@5.28.2": + version "5.28.2" + resolved "https://registry.yarnpkg.com/@statoscope/webpack-ui/-/webpack-ui-5.28.2.tgz#106571a15d8f0febce424e17f94d05e55e904f1c" + integrity sha512-jQ9/CXsSD2FPFQHt7ZJgil8JsukFLTRfIclONyC9R2vomdb2FwHzak6/fEqKYjT2bsDWoWJPL0ieM4Kog6I0Nw== + dependencies: + "@statoscope/types" "5.28.1" + "@types/md5" "^2.3.2" + "@storybook/addon-a11y@^6.5.16": version "6.5.16" resolved "https://registry.yarnpkg.com/@storybook/addon-a11y/-/addon-a11y-6.5.16.tgz#9288a6c1d111fa4ec501d213100ffff91757d3fc" @@ -9167,6 +9321,11 @@ dependencies: "@types/glob" "*" +"@types/archy@^0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@types/archy/-/archy-0.0.32.tgz#8b572741dad9172dfbf289397af1bb41296d3e40" + integrity sha512-5ZZ5+YGmUE01yejiXsKnTcvhakMZ2UllZlMsQni53Doc1JWhe21ia8VntRoRD6fAEWw08JBh/z9qQHJ+//MrIg== + "@types/aria-query@^4.2.0": version "4.2.0" resolved "https://registry.yarnpkg.com/@types/aria-query/-/aria-query-4.2.0.tgz#14264692a9d6e2fa4db3df5e56e94b5e25647ac0" @@ -9504,6 +9663,11 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2" integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ== +"@types/estree@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/event-stream@^4.0.5": version "4.0.5" resolved "https://registry.yarnpkg.com/@types/event-stream/-/event-stream-4.0.5.tgz#29f1be5f4c0de2e0312cf3b5f7146c975c08d918" @@ -9959,6 +10123,11 @@ dependencies: "@types/node" "*" +"@types/md5@^2.3.2": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@types/md5/-/md5-2.3.5.tgz#481cef0a896e3a5dcbfc5a8a8b02c05958af48a5" + integrity sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw== + "@types/mdast@^3.0.0": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" @@ -10076,7 +10245,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.11.8", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.11.18": +"@types/node@*", "@types/node@20.10.5", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^10.1.0", "@types/node@^14.0.10 || ^16.0.0", "@types/node@^14.11.8", "@types/node@^14.14.20 || ^16.0.0", "@types/node@^18.0.0", "@types/node@^18.11.18": version "20.10.5" resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== @@ -10131,6 +10300,11 @@ dependencies: "@types/node" "*" +"@types/pako@^2.0.0": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/pako/-/pako-2.0.3.tgz#b6993334f3af27c158f3fe0dfeeba987c578afb1" + integrity sha512-bq0hMV9opAcrmE0Byyo0fY3Ew4tgOevJmQ9grUhpXQhYfyLJ1Kqg3P33JT5fdbT2AjeAjR51zqqVjAL/HMkx7Q== + "@types/papaparse@^5.0.3": version "5.0.3" resolved "https://registry.yarnpkg.com/@types/papaparse/-/papaparse-5.0.3.tgz#7cedc1ebc9484819af8306a8b42f9f08ca9bdb44" @@ -10420,6 +10594,11 @@ resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== +"@types/semver@^7.5.1": + version "7.5.8" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" + integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== + "@types/serve-index@^1.9.1": version "1.9.1" resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" @@ -10674,6 +10853,15 @@ anymatch "^3.0.0" source-map "^0.6.0" +"@types/webpack@^5.0.0": + version "5.28.5" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-5.28.5.tgz#0e9d9a15efa09bbda2cef41356ca4ac2031ea9a2" + integrity sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw== + dependencies: + "@types/node" "*" + tapable "^2.2.0" + webpack "^5" + "@types/ws@*", "@types/ws@^8.5.1": version "8.5.3" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d" @@ -10820,13 +11008,13 @@ loglevel-plugin-prefix "^0.8.4" strip-ansi "^7.1.0" -"@webassemblyjs/ast@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" - integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== +"@webassemblyjs/ast@1.12.1", "@webassemblyjs/ast@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.12.1.tgz#bb16a0e8b1914f979f45864c23819cc3e3f0d4bb" + integrity sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg== dependencies: - "@webassemblyjs/helper-numbers" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" "@webassemblyjs/ast@1.9.0": version "1.9.0" @@ -10837,30 +11025,30 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wast-parser" "1.9.0" -"@webassemblyjs/floating-point-hex-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" - integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== "@webassemblyjs/floating-point-hex-parser@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== -"@webassemblyjs/helper-api-error@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" - integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== "@webassemblyjs/helper-api-error@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== -"@webassemblyjs/helper-buffer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" - integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== +"@webassemblyjs/helper-buffer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz#6df20d272ea5439bf20ab3492b7fb70e9bfcb3f6" + integrity sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw== "@webassemblyjs/helper-buffer@1.9.0": version "1.9.0" @@ -10886,34 +11074,34 @@ dependencies: "@webassemblyjs/ast" "1.9.0" -"@webassemblyjs/helper-numbers@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" - integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" "@xtuc/long" "4.2.2" -"@webassemblyjs/helper-wasm-bytecode@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" - integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== "@webassemblyjs/helper-wasm-bytecode@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== -"@webassemblyjs/helper-wasm-section@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" - integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== +"@webassemblyjs/helper-wasm-section@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz#3da623233ae1a60409b509a52ade9bc22a37f7bf" + integrity sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.12.1" "@webassemblyjs/helper-wasm-section@1.9.0": version "1.9.0" @@ -10925,10 +11113,10 @@ "@webassemblyjs/helper-wasm-bytecode" "1.9.0" "@webassemblyjs/wasm-gen" "1.9.0" -"@webassemblyjs/ieee754@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" - integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== dependencies: "@xtuc/ieee754" "^1.2.0" @@ -10939,10 +11127,10 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" - integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== dependencies: "@xtuc/long" "4.2.2" @@ -10953,30 +11141,16 @@ dependencies: "@xtuc/long" "4.2.2" -"@webassemblyjs/utf8@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" - integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== "@webassemblyjs/utf8@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== -"@webassemblyjs/wasm-edit@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" - integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/helper-wasm-section" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-opt" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" - "@webassemblyjs/wast-printer" "1.11.1" - "@webassemblyjs/wasm-edit@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" @@ -10991,16 +11165,30 @@ "@webassemblyjs/wasm-parser" "1.9.0" "@webassemblyjs/wast-printer" "1.9.0" -"@webassemblyjs/wasm-gen@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" - integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== - dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" +"@webassemblyjs/wasm-edit@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz#9f9f3ff52a14c980939be0ef9d5df9ebc678ae3b" + integrity sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-opt" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" + "@webassemblyjs/wast-printer" "1.12.1" + +"@webassemblyjs/wasm-gen@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz#a6520601da1b5700448273666a71ad0a45d78547" + integrity sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w== + dependencies: + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" "@webassemblyjs/wasm-gen@1.9.0": version "1.9.0" @@ -11013,15 +11201,15 @@ "@webassemblyjs/leb128" "1.9.0" "@webassemblyjs/utf8" "1.9.0" -"@webassemblyjs/wasm-opt@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" - integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== +"@webassemblyjs/wasm-opt@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz#9e6e81475dfcfb62dab574ac2dda38226c232bc5" + integrity sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-buffer" "1.11.1" - "@webassemblyjs/wasm-gen" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-buffer" "1.12.1" + "@webassemblyjs/wasm-gen" "1.12.1" + "@webassemblyjs/wasm-parser" "1.12.1" "@webassemblyjs/wasm-opt@1.9.0": version "1.9.0" @@ -11033,17 +11221,17 @@ "@webassemblyjs/wasm-gen" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" -"@webassemblyjs/wasm-parser@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" - integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== +"@webassemblyjs/wasm-parser@1.12.1", "@webassemblyjs/wasm-parser@^1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz#c47acb90e6f083391e3fa61d113650eea1e95937" + integrity sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ== dependencies: - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/helper-api-error" "1.11.1" - "@webassemblyjs/helper-wasm-bytecode" "1.11.1" - "@webassemblyjs/ieee754" "1.11.1" - "@webassemblyjs/leb128" "1.11.1" - "@webassemblyjs/utf8" "1.11.1" + "@webassemblyjs/ast" "1.12.1" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" "@webassemblyjs/wasm-parser@1.9.0": version "1.9.0" @@ -11069,12 +11257,12 @@ "@webassemblyjs/helper-fsm" "1.9.0" "@xtuc/long" "4.2.2" -"@webassemblyjs/wast-printer@1.11.1": - version "1.11.1" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" - integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== +"@webassemblyjs/wast-printer@1.12.1": + version "1.12.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz#bcecf661d7d1abdaf989d8341a4833e33e2b31ac" + integrity sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA== dependencies: - "@webassemblyjs/ast" "1.11.1" + "@webassemblyjs/ast" "1.12.1" "@xtuc/long" "4.2.2" "@webassemblyjs/wast-printer@1.9.0": @@ -11201,7 +11389,7 @@ acorn-globals@^7.0.0: acorn "^8.1.0" acorn-walk "^8.0.2" -acorn-import-assertions@^1.7.6, acorn-import-assertions@^1.9.0: +acorn-import-assertions@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac" integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== @@ -11599,7 +11787,7 @@ archiver@^5.3.1: tar-stream "^2.2.0" zip-stream "^4.1.0" -archy@^1.0.0: +archy@^1.0.0, archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= @@ -12764,7 +12952,7 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.20.3, browserslist@^4.22.2, browserslist@^4.22.3: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.16.6, browserslist@^4.20.3, browserslist@^4.21.10, browserslist@^4.22.2, browserslist@^4.22.3: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" integrity sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ== @@ -14781,7 +14969,7 @@ d3-transition@3, d3-transition@^3.0.1: d3-interpolate "1 - 3" d3-timer "1 - 3" -d3@3.5.17: +d3@3.5.17, d3@^3.5.6: version "3.5.17" resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" integrity sha1-vEZ0gAQ3iyGjYMn8fPUjF5B2L7g= @@ -15874,10 +16062,10 @@ enhanced-resolve@^4.5.0: memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.10.0, enhanced-resolve@^5.14.1: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== +enhanced-resolve@^5.14.1, enhanced-resolve@^5.16.0: + version "5.16.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" + integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -16067,10 +16255,10 @@ es-get-iterator@^1.0.2, es-get-iterator@^1.1.3: isarray "^2.0.5" stop-iteration-iterator "^1.0.0" -es-module-lexer@^0.9.0: - version "0.9.3" - resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" - integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== +es-module-lexer@^1.2.1: + version "1.5.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.5.0.tgz#4878fee3789ad99e065f975fdd3c645529ff0236" + integrity sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw== es-set-tostringtag@^2.0.1: version "2.0.1" @@ -20673,6 +20861,13 @@ joi@^17.3.0, joi@^17.7.1: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +jora@1.0.0-beta.8: + version "1.0.0-beta.8" + resolved "https://registry.yarnpkg.com/jora/-/jora-1.0.0-beta.8.tgz#e50a4c1493cd3392b4fe6f390b63cb460ef3b3cb" + integrity sha512-f3WpYwfDTlhfSdyCkAlAXSKRpwZYBgCDnyWmA9D0yyItCTFnFefKtvFpaczrj/FItkgDkHiewgFuHsgh4TmokA== + dependencies: + "@discoveryjs/natural-compare" "^1.0.0" + jquery@^3.5.0: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" @@ -23758,10 +23953,10 @@ open@^7.0.3: is-docker "^2.0.0" is-wsl "^2.1.1" -open@^8.0.9, open@^8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@^8.0.9, open@^8.4.0, open@~8.4.0: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== dependencies: define-lazy-prop "^2.0.0" is-docker "^2.1.1" @@ -24128,10 +24323,10 @@ pako@^1.0.3, pako@~1.0.2, pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -pako@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" - integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== +pako@^2.0.4, pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== papaparse@^5.2.0: version "5.2.0" @@ -25718,7 +25913,7 @@ react-docgen@^5.0.0: loose-envify "^1.1.0" scheduler "^0.23.0" -react-dom@^17.0.2: +react-dom@^17.0.1, react-dom@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== @@ -26202,7 +26397,7 @@ react-window@^1.8.10: dependencies: loose-envify "^1.1.0" -react@^17.0.2: +react@^17.0.1, react@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== @@ -27422,10 +27617,10 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" - integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== dependencies: "@types/json-schema" "^7.0.8" ajv "^6.12.5" @@ -27545,7 +27740,7 @@ send@0.17.2: range-parser "~1.2.1" statuses "~1.5.0" -serialize-javascript@6.0.0, serialize-javascript@^6.0.0: +serialize-javascript@6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== @@ -27566,6 +27761,13 @@ serialize-javascript@^5.0.1: dependencies: randombytes "^2.1.0" +serialize-javascript@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -29278,16 +29480,16 @@ terser-webpack-plugin@^4.2.3: terser "^5.3.4" webpack-sources "^1.4.3" -terser-webpack-plugin@^5.1.3: - version "5.3.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.5.tgz#f7d82286031f915a4f8fb81af4bd35d2e3c011bc" - integrity sha512-AOEDLDxD2zylUGf/wxHxklEkOe2/r+seuyOWujejFrIxHf11brA1/dWQNIgXa1c6/Wkxgu7zvv0JhOWfc2ELEA== +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== dependencies: - "@jridgewell/trace-mapping" "^0.3.14" + "@jridgewell/trace-mapping" "^0.3.20" jest-worker "^27.4.5" schema-utils "^3.1.1" - serialize-javascript "^6.0.0" - terser "^5.14.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" terser@^4.1.2, terser@^4.6.3: version "4.8.1" @@ -29298,10 +29500,10 @@ terser@^4.1.2, terser@^4.6.3: source-map "~0.6.1" source-map-support "~0.5.12" -terser@^5.14.1, terser@^5.29.1, terser@^5.3.4, terser@^5.9.0: - version "5.29.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.29.1.tgz#44e58045b70c09792ba14bfb7b4e14ca8755b9fa" - integrity sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ== +terser@^5.26.0, terser@^5.29.1, terser@^5.3.4, terser@^5.9.0: + version "5.30.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.30.0.tgz#64cb2af71e16ea3d32153f84d990f9be0cdc22bf" + integrity sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw== dependencies: "@jridgewell/source-map" "^0.3.3" acorn "^8.8.2" @@ -31077,10 +31279,10 @@ watchpack@^1.6.0, watchpack@^1.7.4: chokidar "^3.4.1" watchpack-chokidar2 "^2.0.1" -watchpack@^2.2.0, watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== +watchpack@^2.2.0, watchpack@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.1.tgz#29308f2cac150fa8e4c92f90e0ec954a9fed7fff" + integrity sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -31287,6 +31489,17 @@ webpack-virtual-modules@^0.2.2: dependencies: debug "^3.0.0" +webpack-visualizer-plugin2@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-visualizer-plugin2/-/webpack-visualizer-plugin2-1.1.0.tgz#247256978c12ee2a0ec22e5d170f7d0b1ef98146" + integrity sha512-pB2Z9a12m+LwjrfptyR4ReEPc0llOjsb2lXVLEJ4yOnRCBtLeWW+TZrZihUZhJDSW9tc60UXnj9/orgyagLOkg== + dependencies: + d3 "^3.5.6" + mkdirp "^0.5.1" + prop-types "^15.7.2" + react "^17.0.1" + react-dom "^17.0.1" + webpack@4, webpack@^4.41.5: version "4.46.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" @@ -31316,34 +31529,34 @@ webpack@4, webpack@^4.41.5: watchpack "^1.7.4" webpack-sources "^1.4.1" -"webpack@>=4.43.0 <6.0.0": - version "5.76.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.1.tgz#7773de017e988bccb0f13c7d75ec245f377d295c" - integrity sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ== +"webpack@>=4.43.0 <6.0.0", webpack@^5: + version "5.91.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.91.0.tgz#ffa92c1c618d18c878f06892bbdc3373c71a01d9" + integrity sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw== dependencies: "@types/eslint-scope" "^3.7.3" - "@types/estree" "^0.0.51" - "@webassemblyjs/ast" "1.11.1" - "@webassemblyjs/wasm-edit" "1.11.1" - "@webassemblyjs/wasm-parser" "1.11.1" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.12.1" + "@webassemblyjs/wasm-edit" "^1.12.1" + "@webassemblyjs/wasm-parser" "^1.12.1" acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" - es-module-lexer "^0.9.0" + enhanced-resolve "^5.16.0" + es-module-lexer "^1.2.1" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" + graceful-fs "^4.2.11" json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - schema-utils "^3.1.0" + schema-utils "^3.2.0" tapable "^2.1.1" - terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.1" webpack-sources "^3.2.3" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: